Main Page Namespace List Class Hierarchy Alphabetical List Compound List File List Namespace Members Compound Members File Members Related Pages

colvarcomp.h

Go to the documentation of this file.
00001 // -*- c++ -*-
00002 
00003 // This file is part of the Collective Variables module (Colvars).
00004 // The original version of Colvars and its updates are located at:
00005 // https://github.com/Colvars/colvars
00006 // Please update all Colvars source files before making any changes.
00007 // If you wish to distribute your changes, please submit them to the
00008 // Colvars repository at GitHub.
00009 
00010 #ifndef COLVARCOMP_H
00011 #define COLVARCOMP_H
00012 
00013 // Declaration of colvar::cvc base class and derived ones.
00014 //
00015 // Future cvc's could be declared on additional header files.
00016 // After the declaration of a new derived class, its metric
00017 // functions must be reimplemented as well.
00018 // If the new cvc has no symmetry or periodicity,
00019 // this can be done straightforwardly by using the macro:
00020 // simple_scalar_dist_functions (derived_class)
00021 
00022 
00023 #include "colvarmodule.h"
00024 #include "colvar.h"
00025 #include "colvaratoms.h"
00026 #include "colvar_arithmeticpath.h"
00027 
00028 #if (__cplusplus >= 201103L)
00029 // C++11-only functions
00030 #include "colvar_geometricpath.h"
00031 #include <memory>
00032 #include <functional>
00033 #endif
00034 
00035 #include <map>
00036 
00037 
00075 
00076 class colvar::cvc
00077 : public colvarparse, public colvardeps
00078 {
00079 public:
00080 
00083 std::string name;
00084 
00093 std::string function_type;
00094 
00096 std::string config_key;
00097 
00099 cvm::real sup_coeff;
00101 int sup_np;
00102 
00104 cvm::real period;
00105 
00107 cvm::real wrap_center;
00108 
00112 cvc(std::string const &conf);
00113 
00115 int set_function_type(std::string const &type);
00116 
00120 virtual int init(std::string const &conf);
00121 
00123 virtual int init_dependencies();
00124 
00128 cvm::atom_group *parse_group(std::string const &conf,
00129 char const *group_key,
00130 bool optional = false);
00131 
00133 virtual int init_total_force_params(std::string const &conf);
00134 
00136 int setup();
00137 
00140 cvc();
00141 
00143 virtual ~cvc();
00144 
00146 static std::vector<feature *> cvc_features;
00147 
00149 virtual const std::vector<feature *> &features() const
00150 {
00151 return cvc_features;
00152 }
00153 virtual std::vector<feature *> &modify_features()
00154 {
00155 return cvc_features;
00156 }
00157 static void delete_features() {
00158 for (size_t i=0; i < cvc_features.size(); i++) {
00159 delete cvc_features[i];
00160 }
00161 cvc_features.clear();
00162 }
00163 
00165 virtual std::vector<std::vector<int> > get_atom_lists();
00166 
00168 virtual void read_data();
00169 
00171 virtual void calc_value() = 0;
00172 
00175 virtual void calc_gradients() {}
00176 
00178 void calc_fit_gradients();
00179 
00181 virtual void debug_gradients();
00182 
00185 virtual void collect_gradients(std::vector<int> const &atom_ids, std::vector<cvm::rvector> &atomic_gradients);
00186 
00189 virtual void calc_force_invgrads();
00190 
00192 virtual void calc_Jacobian_derivative();
00193 
00194 
00196 colvarvalue const & value() const;
00197 
00199 colvarvalue const & total_force() const;
00200 
00203 colvarvalue const & Jacobian_derivative() const;
00204 
00214 virtual void apply_force(colvarvalue const &cvforce) = 0;
00215 
00244 virtual cvm::real dist2(colvarvalue const &x1,
00245 colvarvalue const &x2) const;
00246 
00250 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00251 colvarvalue const &x2) const;
00252 
00256 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00257 colvarvalue const &x2) const;
00258 
00260 virtual void wrap(colvarvalue &x_unwrapped) const;
00261 
00264 std::vector<cvm::atom_group *> atom_groups;
00265 
00267 void register_atom_group(cvm::atom_group *ag);
00268 
00270 virtual colvarvalue const *get_param_grad(std::string const &param_name);
00271 
00273 virtual int set_param(std::string const &param_name, void const *new_value);
00274 
00276 bool b_try_scalable;
00277 
00280 inline void set_value(colvarvalue const &new_value) {
00281 x = new_value;
00282 }
00283 
00284 protected:
00285 
00287 std::vector<std::string> function_types;
00288 
00290 colvarvalue x;
00291 
00293 colvarvalue x_old;
00294 
00299 colvarvalue ft;
00300 
00303 colvarvalue jd;
00304 
00306 void init_as_distance();
00307 
00309 void init_as_angle();
00310 
00312 void init_as_periodic_angle();
00313 
00315 void init_scalar_boundaries(cvm::real lb, cvm::real ub);
00316 
00318 colvarvalue lower_boundary;
00319 
00321 colvarvalue upper_boundary;
00322 
00324 cvm::real width;
00325 };
00326 
00327 
00328 inline colvarvalue const & colvar::cvc::value() const
00329 {
00330 return x;
00331 }
00332 
00333 
00334 inline colvarvalue const & colvar::cvc::total_force() const
00335 {
00336 return ft;
00337 }
00338 
00339 
00340 inline colvarvalue const & colvar::cvc::Jacobian_derivative() const
00341 {
00342 return jd;
00343 }
00344 
00345 
00346 
00349 
00350 class colvar::distance
00351 : public colvar::cvc
00352 {
00353 protected:
00355 cvm::atom_group *group1;
00357 cvm::atom_group *group2;
00359 cvm::rvector dist_v;
00360 public:
00361 distance(std::string const &conf);
00362 distance();
00363 virtual ~distance() {}
00364 virtual void calc_value();
00365 virtual void calc_gradients();
00366 virtual void calc_force_invgrads();
00367 virtual void calc_Jacobian_derivative();
00368 virtual void apply_force(colvarvalue const &force);
00369 virtual cvm::real dist2(colvarvalue const &x1,
00370 colvarvalue const &x2) const;
00371 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00372 colvarvalue const &x2) const;
00373 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00374 colvarvalue const &x2) const;
00375 };
00376 
00377 
00378 
00379 // \brief Colvar component: distance vector between centers of mass
00380 // of two groups (\link colvarvalue::type_3vector \endlink type,
00381 // range (-*:*)x(-*:*)x(-*:*))
00382 class colvar::distance_vec
00383 : public colvar::distance
00384 {
00385 public:
00386 distance_vec(std::string const &conf);
00387 distance_vec();
00388 virtual ~distance_vec() {}
00389 virtual void calc_value();
00390 virtual void calc_gradients();
00391 virtual void apply_force(colvarvalue const &force);
00393 virtual cvm::real dist2(colvarvalue const &x1,
00394 colvarvalue const &x2) const;
00396 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00397 colvarvalue const &x2) const;
00399 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00400 colvarvalue const &x2) const;
00401 };
00402 
00403 
00404 
00408 class colvar::distance_dir
00409 : public colvar::distance
00410 {
00411 public:
00412 distance_dir(std::string const &conf);
00413 distance_dir();
00414 virtual ~distance_dir() {}
00415 virtual void calc_value();
00416 virtual void calc_gradients();
00417 virtual void apply_force(colvarvalue const &force);
00419 virtual cvm::real dist2(colvarvalue const &x1,
00420 colvarvalue const &x2) const;
00422 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00423 colvarvalue const &x2) const;
00425 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00426 colvarvalue const &x2) const;
00427 };
00428 
00429 
00430 
00433 class colvar::distance_z
00434 : public colvar::cvc
00435 {
00436 protected:
00438 cvm::atom_group *main;
00440 cvm::atom_group *ref1;
00442 cvm::atom_group *ref2;
00444 cvm::rvector axis;
00446 cvm::real axis_norm;
00448 cvm::rvector dist_v;
00450 bool fixed_axis;
00451 public:
00452 distance_z(std::string const &conf);
00453 distance_z();
00454 virtual ~distance_z() {}
00455 virtual void calc_value();
00456 virtual void calc_gradients();
00457 virtual void calc_force_invgrads();
00458 virtual void calc_Jacobian_derivative();
00459 virtual void apply_force(colvarvalue const &force);
00460 virtual cvm::real dist2(colvarvalue const &x1,
00461 colvarvalue const &x2) const;
00462 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00463 colvarvalue const &x2) const;
00464 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00465 colvarvalue const &x2) const;
00467 virtual void wrap(colvarvalue &x_unwrapped) const;
00468 };
00469 
00470 
00471 
00474 class colvar::distance_xy
00475 : public colvar::distance_z
00476 {
00477 protected:
00479 cvm::rvector dist_v_ortho;
00481 cvm::rvector v12, v13;
00482 public:
00483 distance_xy(std::string const &conf);
00484 distance_xy();
00485 virtual ~distance_xy() {}
00486 virtual void calc_value();
00487 virtual void calc_gradients();
00488 virtual void calc_force_invgrads();
00489 virtual void calc_Jacobian_derivative();
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 };
00498 
00499 
00502 class colvar::polar_phi
00503 : public colvar::cvc
00504 {
00505 public:
00506 polar_phi(std::string const &conf);
00507 polar_phi();
00508 virtual ~polar_phi() {}
00509 protected:
00510 cvm::atom_group *atoms;
00511 cvm::real r, theta, phi;
00512 public:
00513 virtual void calc_value();
00514 virtual void calc_gradients();
00515 virtual void apply_force(colvarvalue const &force);
00517 virtual cvm::real dist2(colvarvalue const &x1,
00518 colvarvalue const &x2) const;
00520 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00521 colvarvalue const &x2) const;
00523 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00524 colvarvalue const &x2) const;
00526 virtual void wrap(colvarvalue &x_unwrapped) const;
00527 };
00528 
00529 
00532 class colvar::polar_theta
00533 : public colvar::cvc
00534 {
00535 public:
00536 polar_theta(std::string const &conf);
00537 polar_theta();
00538 virtual ~polar_theta() {}
00539 protected:
00540 cvm::atom_group *atoms;
00541 cvm::real r, theta, phi;
00542 public:
00543 virtual void calc_value();
00544 virtual void calc_gradients();
00545 virtual void apply_force(colvarvalue const &force);
00547 virtual cvm::real dist2(colvarvalue const &x1,
00548 colvarvalue const &x2) const;
00550 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00551 colvarvalue const &x2) const;
00553 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00554 colvarvalue const &x2) const;
00555 };
00556 
00559 class colvar::distance_inv
00560 : public colvar::cvc
00561 {
00562 protected:
00564 cvm::atom_group *group1;
00566 cvm::atom_group *group2;
00568 int exponent;
00569 public:
00570 distance_inv(std::string const &conf);
00571 virtual ~distance_inv() {}
00572 virtual void calc_value();
00573 virtual void calc_gradients();
00574 virtual void apply_force(colvarvalue const &force);
00575 virtual cvm::real dist2(colvarvalue const &x1,
00576 colvarvalue const &x2) const;
00577 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00578 colvarvalue const &x2) const;
00579 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00580 colvarvalue const &x2) const;
00581 };
00582 
00583 
00584 
00587 class colvar::distance_pairs
00588 : public colvar::cvc
00589 {
00590 protected:
00592 cvm::atom_group *group1;
00594 cvm::atom_group *group2;
00595 public:
00596 distance_pairs(std::string const &conf);
00597 distance_pairs();
00598 virtual ~distance_pairs() {}
00599 virtual void calc_value();
00600 virtual void calc_gradients();
00601 virtual void apply_force(colvarvalue const &force);
00602 };
00603 
00604 
00605 
00607 class colvar::dipole_magnitude
00608 : public colvar::cvc
00609 {
00610 protected:
00612 cvm::atom_group *atoms;
00613 cvm::atom_pos dipoleV;
00614 public:
00616 dipole_magnitude (std::string const &conf);
00617 dipole_magnitude (cvm::atom const &a1);
00618 dipole_magnitude();
00619 virtual inline ~dipole_magnitude() {}
00620 virtual void calc_value();
00621 virtual void calc_gradients();
00622 //virtual void calc_force_invgrads();
00623 //virtual void calc_Jacobian_derivative();
00624 virtual void apply_force (colvarvalue const &force);
00625 virtual cvm::real dist2 (colvarvalue const &x1,
00626 colvarvalue const &x2) const;
00627 virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00628 colvarvalue const &x2) const;
00629 virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00630 colvarvalue const &x2) const;
00631 };
00632 
00633 
00634 
00637 class colvar::gyration
00638 : public colvar::cvc
00639 {
00640 protected:
00642 cvm::atom_group *atoms;
00643 public:
00644 gyration(std::string const &conf);
00645 virtual ~gyration() {}
00646 virtual void calc_value();
00647 virtual void calc_gradients();
00648 virtual void calc_force_invgrads();
00649 virtual void calc_Jacobian_derivative();
00650 virtual void apply_force(colvarvalue const &force);
00651 virtual cvm::real dist2(colvarvalue const &x1,
00652 colvarvalue const &x2) const;
00653 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00654 colvarvalue const &x2) const;
00655 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00656 colvarvalue const &x2) const;
00657 };
00658 
00659 
00660 
00663 class colvar::inertia
00664 : public colvar::gyration
00665 {
00666 public:
00668 inertia(std::string const &conf);
00669 inertia();
00670 virtual ~inertia() {}
00671 virtual void calc_value();
00672 virtual void calc_gradients();
00673 virtual void apply_force(colvarvalue const &force);
00674 virtual cvm::real dist2(colvarvalue const &x1,
00675 colvarvalue const &x2) const;
00676 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00677 colvarvalue const &x2) const;
00678 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00679 colvarvalue const &x2) const;
00680 };
00681 
00682 
00683 
00686 class colvar::inertia_z
00687 : public colvar::inertia
00688 {
00689 protected:
00691 cvm::rvector axis;
00692 public:
00694 inertia_z(std::string const &conf);
00695 inertia_z();
00696 virtual ~inertia_z() {}
00697 virtual void calc_value();
00698 virtual void calc_gradients();
00699 virtual void apply_force(colvarvalue const &force);
00700 virtual cvm::real dist2(colvarvalue const &x1,
00701 colvarvalue const &x2) const;
00702 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00703 colvarvalue const &x2) const;
00704 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00705 colvarvalue const &x2) const;
00706 };
00707 
00708 
00709 
00712 class colvar::eigenvector
00713 : public colvar::cvc
00714 {
00715 protected:
00716 
00718 cvm::atom_group * atoms;
00719 
00721 std::vector<cvm::atom_pos> ref_pos;
00722 
00724 std::vector<cvm::rvector> eigenvec;
00725 
00727 cvm::real eigenvec_invnorm2;
00728 
00729 public:
00730 
00732 eigenvector(std::string const &conf);
00733 virtual ~eigenvector() {}
00734 virtual void calc_value();
00735 virtual void calc_gradients();
00736 virtual void calc_force_invgrads();
00737 virtual void calc_Jacobian_derivative();
00738 virtual void apply_force(colvarvalue const &force);
00739 virtual cvm::real dist2(colvarvalue const &x1,
00740 colvarvalue const &x2) const;
00741 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00742 colvarvalue const &x2) const;
00743 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00744 colvarvalue const &x2) const;
00745 };
00746 
00747 
00748 
00751 class colvar::angle
00752 : public colvar::cvc
00753 {
00754 protected:
00755 
00757 cvm::atom_group *group1;
00759 cvm::atom_group *group2;
00761 cvm::atom_group *group3;
00762 
00764 cvm::rvector r21, r23;
00766 cvm::real r21l, r23l;
00768 cvm::rvector dxdr1, dxdr3;
00769 
00773 bool b_1site_force;
00774 public:
00775 
00777 angle(std::string const &conf);
00779 angle(cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3);
00780 virtual ~angle() {}
00781 virtual void calc_value();
00782 virtual void calc_gradients();
00783 virtual void calc_force_invgrads();
00784 virtual void calc_Jacobian_derivative();
00785 virtual void apply_force(colvarvalue const &force);
00786 virtual cvm::real dist2(colvarvalue const &x1,
00787 colvarvalue const &x2) const;
00788 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00789 colvarvalue const &x2) const;
00790 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00791 colvarvalue const &x2) const;
00792 };
00793 
00794 
00795 
00798 class colvar::dipole_angle
00799 : public colvar::cvc
00800 {
00801 protected:
00802 
00804 cvm::atom_group *group1;
00806 cvm::atom_group *group2;
00808 cvm::atom_group *group3;
00809 
00811 cvm::rvector r21, r23;
00813 cvm::real r21l, r23l;
00815 cvm::rvector dxdr1, dxdr3;
00816 
00820 bool b_1site_force;
00821 public:
00822 
00824 dipole_angle (std::string const &conf);
00826 dipole_angle (cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3);
00827 dipole_angle();
00828 virtual ~dipole_angle() {}
00829 virtual void calc_value();
00830 virtual void calc_gradients();
00831 virtual void apply_force (colvarvalue const &force);
00832 virtual cvm::real dist2 (colvarvalue const &x1,
00833 colvarvalue const &x2) const;
00834 virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
00835 colvarvalue const &x2) const;
00836 virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
00837 colvarvalue const &x2) const;
00838 };
00839 
00840 
00841 
00844 class colvar::dihedral
00845 : public colvar::cvc
00846 {
00847 protected:
00848 
00850 cvm::atom_group *group1;
00852 cvm::atom_group *group2;
00854 cvm::atom_group *group3;
00856 cvm::atom_group *group4;
00858 cvm::rvector r12, r23, r34;
00859 
00862 bool b_1site_force;
00863 
00864 public:
00865 
00867 dihedral(std::string const &conf);
00869 dihedral(cvm::atom const &a1, cvm::atom const &a2, cvm::atom const &a3, cvm::atom const &a4);
00870 dihedral();
00871 virtual ~dihedral() {}
00872 virtual void calc_value();
00873 virtual void calc_gradients();
00874 virtual void calc_force_invgrads();
00875 virtual void calc_Jacobian_derivative();
00876 virtual void apply_force(colvarvalue const &force);
00877 
00879 virtual cvm::real dist2(colvarvalue const &x1,
00880 colvarvalue const &x2) const;
00882 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00883 colvarvalue const &x2) const;
00885 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00886 colvarvalue const &x2) const;
00888 virtual void wrap(colvarvalue &x_unwrapped) const;
00889 };
00890 
00891 
00892 
00895 class colvar::coordnum
00896 : public colvar::cvc
00897 {
00898 protected:
00900 cvm::atom_group *group1;
00902 cvm::atom_group *group2;
00904 cvm::real r0;
00906 cvm::rvector r0_vec;
00908 bool b_anisotropic;
00910 int en;
00912 int ed;
00913 
00915 bool b_group2_center_only;
00916 
00918 cvm::real tolerance;
00919 
00921 int pairlist_freq;
00922 
00924 bool *pairlist;
00925 
00926 public:
00927 
00928 coordnum(std::string const &conf);
00929 ~coordnum();
00930 
00931 virtual void calc_value();
00932 virtual void calc_gradients();
00933 virtual void apply_force(colvarvalue const &force);
00934 virtual cvm::real dist2(colvarvalue const &x1,
00935 colvarvalue const &x2) const;
00936 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
00937 colvarvalue const &x2) const;
00938 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
00939 colvarvalue const &x2) const;
00940 
00941 enum {
00942 ef_null = 0,
00943 ef_gradients = 1,
00944 ef_anisotropic = (1<<8),
00945 ef_use_pairlist = (1<<9),
00946 ef_rebuild_pairlist = (1<<10)
00947 };
00948 
00956 template<int flags>
00957 static cvm::real switching_function(cvm::real const &r0,
00958 cvm::rvector const &r0_vec,
00959 int en,
00960 int ed,
00961 cvm::atom &A1,
00962 cvm::atom &A2,
00963 bool **pairlist_elem,
00964 cvm::real tolerance);
00965 
00967 template<int flags> int compute_coordnum();
00968 
00970 template<int flags> void main_loop(bool **pairlist_elem);
00971 
00972 };
00973 
00974 
00975 
00978 class colvar::selfcoordnum
00979 : public colvar::cvc
00980 {
00981 protected:
00982 
00984 cvm::atom_group *group1;
00986 cvm::real r0;
00988 int en;
00990 int ed;
00991 cvm::real tolerance;
00992 int pairlist_freq;
00993 bool *pairlist;
00994 
00995 public:
00996 
00997 selfcoordnum(std::string const &conf);
00998 ~selfcoordnum();
00999 virtual void calc_value();
01000 virtual void calc_gradients();
01001 virtual void apply_force(colvarvalue const &force);
01002 
01003 virtual cvm::real dist2(colvarvalue const &x1,
01004 colvarvalue const &x2) const;
01005 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01006 colvarvalue const &x2) const;
01007 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01008 colvarvalue const &x2) const;
01009 
01011 template<int flags> int compute_selfcoordnum();
01012 };
01013 
01014 
01015 
01018 class colvar::groupcoordnum
01019 : public colvar::distance
01020 {
01021 protected:
01023 cvm::real r0;
01025 cvm::rvector r0_vec;
01028 bool b_anisotropic;
01030 int en;
01032 int ed;
01033 public:
01035 groupcoordnum(std::string const &conf);
01036 virtual ~groupcoordnum() {}
01037 virtual void calc_value();
01038 virtual void calc_gradients();
01039 virtual void apply_force(colvarvalue const &force);
01040 
01041 virtual cvm::real dist2(colvarvalue const &x1,
01042 colvarvalue const &x2) const;
01043 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01044 colvarvalue const &x2) const;
01045 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01046 colvarvalue const &x2) const;
01047 };
01048 
01049 
01050 
01054 class colvar::h_bond
01055 : public colvar::cvc
01056 {
01057 protected:
01059 cvm::real r0;
01061 int en;
01063 int ed;
01064 public:
01065 h_bond(std::string const &conf);
01067 h_bond(cvm::atom const &acceptor,
01068 cvm::atom const &donor,
01069 cvm::real r0, int en, int ed);
01070 h_bond();
01071 virtual ~h_bond() {}
01072 virtual void calc_value();
01073 virtual void calc_gradients();
01074 virtual void apply_force(colvarvalue const &force);
01075 
01076 virtual cvm::real dist2(colvarvalue const &x1,
01077 colvarvalue const &x2) const;
01078 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01079 colvarvalue const &x2) const;
01080 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01081 colvarvalue const &x2) const;
01082 };
01083 
01084 
01085 
01090 // class colvar::alpha_dihedrals
01091 // : public colvar::cvc
01092 // {
01093 // protected:
01094 
01095 // /// Alpha-helical reference phi value
01096 // cvm::real phi_ref;
01097 
01098 // /// Alpha-helical reference psi value
01099 // cvm::real psi_ref;
01100 
01101 // /// List of phi dihedral angles
01102 // std::vector<dihedral *> phi;
01103 
01104 // /// List of psi dihedral angles
01105 // std::vector<dihedral *> psi;
01106 
01107 // /// List of hydrogen bonds
01108 // std::vector<h_bond *> hb;
01109 
01110 // public:
01111 
01112 // alpha_dihedrals (std::string const &conf);
01113 // alpha_dihedrals();
01114 // virtual ~alpha_dihedrals() {}
01115 // virtual void calc_value();
01116 // virtual void calc_gradients();
01117 // virtual void apply_force (colvarvalue const &force);
01118 // virtual cvm::real dist2 (colvarvalue const &x1,
01119 // colvarvalue const &x2) const;
01120 // virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
01121 // colvarvalue const &x2) const;
01122 // virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
01123 // colvarvalue const &x2) const;
01124 // };
01125 
01126 
01127 
01132 class colvar::alpha_angles
01133 : public colvar::cvc
01134 {
01135 protected:
01136 
01138 cvm::real theta_ref;
01139 
01141 cvm::real theta_tol;
01142 
01144 std::vector<angle *> theta;
01145 
01147 std::vector<h_bond *> hb;
01148 
01150 cvm::real hb_coeff;
01151 
01152 public:
01153 
01154 alpha_angles(std::string const &conf);
01155 alpha_angles();
01156 virtual ~alpha_angles();
01157 void calc_value();
01158 void calc_gradients();
01160 void collect_gradients(std::vector<int> const &atom_ids, std::vector<cvm::rvector> &atomic_gradients);
01161 void apply_force(colvarvalue const &force);
01162 virtual cvm::real dist2(colvarvalue const &x1,
01163 colvarvalue const &x2) const;
01164 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01165 colvarvalue const &x2) const;
01166 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01167 colvarvalue const &x2) const;
01168 };
01169 
01170 
01171 
01176 class colvar::dihedPC
01177 : public colvar::cvc
01178 {
01179 protected:
01180 
01181 std::vector<dihedral *> theta;
01182 std::vector<cvm::real> coeffs;
01183 
01184 public:
01185 
01186 dihedPC(std::string const &conf);
01187 dihedPC();
01188 virtual ~dihedPC();
01189 void calc_value();
01190 void calc_gradients();
01192 void collect_gradients(std::vector<int> const &atom_ids, std::vector<cvm::rvector> &atomic_gradients);
01193 void apply_force(colvarvalue const &force);
01194 virtual cvm::real dist2(colvarvalue const &x1,
01195 colvarvalue const &x2) const;
01196 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01197 colvarvalue const &x2) const;
01198 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01199 colvarvalue const &x2) const;
01200 };
01201 
01202 
01203 
01208 class colvar::orientation
01209 : public colvar::cvc
01210 {
01211 protected:
01212 
01214 cvm::atom_group * atoms;
01216 cvm::atom_pos atoms_cog;
01217 
01219 std::vector<cvm::atom_pos> ref_pos;
01220 
01222 cvm::rotation rot;
01223 
01226 cvm::quaternion ref_quat;
01227 
01228 public:
01229 
01230 orientation(std::string const &conf);
01231 orientation();
01232 virtual int init(std::string const &conf);
01233 virtual ~orientation() {}
01234 virtual void calc_value();
01235 virtual void calc_gradients();
01236 virtual void apply_force(colvarvalue const &force);
01237 virtual cvm::real dist2(colvarvalue const &x1,
01238 colvarvalue const &x2) const;
01239 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01240 colvarvalue const &x2) const;
01241 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01242 colvarvalue const &x2) const;
01243 };
01244 
01245 
01246 
01250 class colvar::orientation_angle
01251 : public colvar::orientation
01252 {
01253 public:
01254 
01255 orientation_angle(std::string const &conf);
01256 virtual int init(std::string const &conf);
01257 virtual ~orientation_angle() {}
01258 virtual void calc_value();
01259 virtual void calc_gradients();
01260 virtual void apply_force(colvarvalue const &force);
01261 virtual cvm::real dist2(colvarvalue const &x1,
01262 colvarvalue const &x2) const;
01263 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01264 colvarvalue const &x2) const;
01265 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01266 colvarvalue const &x2) const;
01267 };
01268 
01269 
01270 
01274 class colvar::orientation_proj
01275 : public colvar::orientation
01276 {
01277 public:
01278 
01279 orientation_proj(std::string const &conf);
01280 orientation_proj();
01281 virtual int init(std::string const &conf);
01282 virtual ~orientation_proj() {}
01283 virtual void calc_value();
01284 virtual void calc_gradients();
01285 virtual void apply_force(colvarvalue const &force);
01286 virtual cvm::real dist2(colvarvalue const &x1,
01287 colvarvalue const &x2) const;
01288 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01289 colvarvalue const &x2) const;
01290 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01291 colvarvalue const &x2) const;
01292 };
01293 
01294 
01295 
01298 class colvar::tilt
01299 : public colvar::orientation
01300 {
01301 protected:
01302 
01303 cvm::rvector axis;
01304 
01305 public:
01306 
01307 tilt(std::string const &conf);
01308 virtual int init(std::string const &conf);
01309 virtual ~tilt() {}
01310 virtual void calc_value();
01311 virtual void calc_gradients();
01312 virtual void apply_force(colvarvalue const &force);
01313 virtual cvm::real dist2(colvarvalue const &x1,
01314 colvarvalue const &x2) const;
01315 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01316 colvarvalue const &x2) const;
01317 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01318 colvarvalue const &x2) const;
01319 };
01320 
01321 
01322 
01325 class colvar::spin_angle
01326 : public colvar::orientation
01327 {
01328 protected:
01329 
01330 cvm::rvector axis;
01331 
01332 public:
01333 
01334 spin_angle(std::string const &conf);
01335 spin_angle();
01336 virtual int init(std::string const &conf);
01337 virtual ~spin_angle() {}
01338 virtual void calc_value();
01339 virtual void calc_gradients();
01340 virtual void apply_force(colvarvalue const &force);
01342 virtual cvm::real dist2(colvarvalue const &x1,
01343 colvarvalue const &x2) const;
01345 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01346 colvarvalue const &x2) const;
01348 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01349 colvarvalue const &x2) const;
01351 virtual void wrap(colvarvalue &x_unwrapped) const;
01352 };
01353 
01354 
01355 class colvar::euler_phi
01356 : public colvar::orientation
01357 {
01358 public:
01359 euler_phi(std::string const &conf);
01360 euler_phi();
01361 virtual int init(std::string const &conf);
01362 virtual ~euler_phi() {}
01363 virtual void calc_value();
01364 virtual void calc_gradients();
01365 virtual void apply_force(colvarvalue const &force);
01366 virtual cvm::real dist2(colvarvalue const &x1,
01367 colvarvalue const &x2) const;
01368 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01369 colvarvalue const &x2) const;
01370 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01371 colvarvalue const &x2) const;
01373 virtual void wrap(colvarvalue &x_unwrapped) const;
01374 };
01375 
01376 
01377 class colvar::euler_psi
01378 : public colvar::orientation
01379 {
01380 public:
01381 euler_psi(std::string const &conf);
01382 euler_psi();
01383 virtual int init(std::string const &conf);
01384 virtual ~euler_psi() {}
01385 virtual void calc_value();
01386 virtual void calc_gradients();
01387 virtual void apply_force(colvarvalue const &force);
01388 virtual cvm::real dist2(colvarvalue const &x1,
01389 colvarvalue const &x2) const;
01390 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01391 colvarvalue const &x2) const;
01392 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01393 colvarvalue const &x2) const;
01395 virtual void wrap(colvarvalue &x_unwrapped) const;
01396 };
01397 
01398 
01399 class colvar::euler_theta
01400 : public colvar::orientation
01401 {
01402 public:
01403 euler_theta(std::string const &conf);
01404 euler_theta();
01405 virtual int init(std::string const &conf);
01406 virtual ~euler_theta() {}
01407 virtual void calc_value();
01408 virtual void calc_gradients();
01409 virtual void apply_force(colvarvalue const &force);
01410 // theta angle is a scalar variable and not periodic
01411 // we need to override the virtual functions from orientation
01412 virtual cvm::real dist2(colvarvalue const &x1,
01413 colvarvalue const &x2) const;
01414 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01415 colvarvalue const &x2) const;
01416 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01417 colvarvalue const &x2) const;
01418 };
01419 
01420 
01425 class colvar::rmsd
01426 : public colvar::cvc
01427 {
01428 protected:
01429 
01431 cvm::atom_group *atoms;
01432 
01435 std::vector<cvm::atom_pos> ref_pos;
01436 
01438 size_t n_permutations;
01439 
01441 size_t best_perm_index;
01442 public:
01443 
01445 rmsd(std::string const &conf);
01446 virtual ~rmsd() {}
01447 virtual void calc_value();
01448 virtual void calc_gradients();
01449 virtual void calc_force_invgrads();
01450 virtual void calc_Jacobian_derivative();
01451 virtual void apply_force(colvarvalue const &force);
01452 virtual cvm::real dist2(colvarvalue const &x1,
01453 colvarvalue const &x2) const;
01454 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01455 colvarvalue const &x2) const;
01456 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01457 colvarvalue const &x2) const;
01458 };
01459 
01460 
01461 
01462 // \brief Colvar component: flat vector of Cartesian coordinates
01463 // Mostly useful to compute scripted colvar values
01464 class colvar::cartesian
01465 : public colvar::cvc
01466 {
01467 protected:
01469 cvm::atom_group *atoms;
01471 std::vector<size_t> axes;
01472 public:
01473 cartesian(std::string const &conf);
01474 cartesian();
01475 virtual ~cartesian() {}
01476 virtual void calc_value();
01477 virtual void calc_gradients();
01478 virtual void apply_force(colvarvalue const &force);
01479 };
01480 
01481 
01482 // \brief Colvar component: alch_lambda
01483 // To communicate value with back-end in lambda-dynamics
01484 class colvar::alch_lambda
01485 : public colvar::cvc
01486 {
01487 protected:
01488 // No atom groups needed
01489 public:
01490 alch_lambda(std::string const &conf);
01491 alch_lambda();
01492 virtual ~alch_lambda() {}
01493 virtual void calc_value();
01494 virtual void calc_gradients();
01495 virtual void apply_force(colvarvalue const &force);
01496 virtual cvm::real dist2(colvarvalue const &x1,
01497 colvarvalue const &x2) const;
01498 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01499 colvarvalue const &x2) const;
01500 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01501 colvarvalue const &x2) const;
01502 };
01503 
01504 
01505 // \brief Colvar component: alch_Flambda
01506 // To communicate force on lambda with back-end in lambda-dynamics
01507 class colvar::alch_Flambda
01508 : public colvar::cvc
01509 {
01510 protected:
01511 // No atom groups needed
01512 public:
01513 alch_Flambda(std::string const &conf);
01514 alch_Flambda();
01515 virtual ~alch_Flambda() {}
01516 virtual void calc_value();
01517 virtual void calc_gradients();
01518 virtual void apply_force(colvarvalue const &force);
01519 virtual cvm::real dist2(colvarvalue const &x1,
01520 colvarvalue const &x2) const;
01521 virtual colvarvalue dist2_lgrad(colvarvalue const &x1,
01522 colvarvalue const &x2) const;
01523 virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
01524 colvarvalue const &x2) const;
01525 };
01526 
01527 
01528 class colvar::componentDisabled
01529 : public colvar::cvc
01530 {
01531 public:
01532 componentDisabled(std::string const & /* conf */) {
01533 cvm::error("Error: this component is not enabled in the current build; please see https://colvars.github.io/README-c++11.html");
01534 }
01535 virtual ~componentDisabled() {}
01536 virtual void calc_value() {}
01537 virtual void calc_gradients() {}
01538 virtual void apply_force(colvarvalue const & /* force */) {}
01539 };
01540 
01541 
01542 
01543 #if (__cplusplus >= 201103L)
01544 class colvar::CartesianBasedPath
01545 : public colvar::cvc
01546 {
01547 protected:
01548 virtual void computeDistanceToReferenceFrames(std::vector<cvm::real>& result);
01550 cvm::atom_group *atoms;
01552 bool has_user_defined_fitting;
01554 std::vector<std::vector<cvm::atom_pos>> reference_frames;
01555 std::vector<std::vector<cvm::atom_pos>> reference_fitting_frames;
01557 std::vector<cvm::atom_group*> comp_atoms;
01559 size_t total_reference_frames;
01560 public:
01561 CartesianBasedPath(std::string const &conf);
01562 virtual ~CartesianBasedPath();
01563 virtual void calc_value() = 0;
01564 virtual void apply_force(colvarvalue const &force) = 0;
01565 };
01566 
01570 class colvar::gspath
01571 : public colvar::CartesianBasedPath, public GeometricPathCV::GeometricPathBase<cvm::atom_pos, cvm::real, GeometricPathCV::path_sz::S>
01572 {
01573 private:
01574 // Optimal rotation for compute v3
01575 cvm::rotation rot_v3;
01576 protected:
01577 virtual void prepareVectors();
01578 virtual void updateDistanceToReferenceFrames();
01579 public:
01580 gspath(std::string const &conf);
01581 virtual ~gspath() {}
01582 virtual void calc_value();
01583 virtual void calc_gradients();
01584 virtual void apply_force(colvarvalue const &force);
01585 };
01586 
01587 
01588 
01591 class colvar::gzpath
01592 : public colvar::CartesianBasedPath, public GeometricPathCV::GeometricPathBase<cvm::atom_pos, cvm::real, GeometricPathCV::path_sz::Z>
01593 {
01594 private:
01595 // Optimal rotation for compute v3, v4
01596 cvm::rotation rot_v3;
01597 cvm::rotation rot_v4;
01598 protected:
01599 virtual void prepareVectors();
01600 virtual void updateDistanceToReferenceFrames();
01601 public:
01602 gzpath(std::string const &conf);
01603 virtual ~gzpath() {}
01604 virtual void calc_value();
01605 virtual void calc_gradients();
01606 virtual void apply_force(colvarvalue const &force);
01607 };
01608 
01610 class colvar::linearCombination
01611 : public colvar::cvc
01612 {
01613 protected:
01615 std::vector<colvar::cvc*> cv;
01617 bool use_explicit_gradients;
01618 protected:
01619 cvm::real getPolynomialFactorOfCVGradient(size_t i_cv) const;
01620 public:
01621 linearCombination(std::string const &conf);
01622 virtual ~linearCombination();
01623 virtual void calc_value();
01624 virtual void calc_gradients();
01625 virtual void apply_force(colvarvalue const &force);
01626 };
01627 
01628 
01630 class colvar::customColvar
01631 : public colvar::linearCombination
01632 {
01633 protected:
01634 bool use_custom_function;
01635 #ifdef LEPTON
01636 
01637 std::vector<Lepton::CompiledExpression *> value_evaluators;
01639 std::vector<Lepton::CompiledExpression *> gradient_evaluators;
01641 std::vector<double *> value_eval_var_refs;
01642 std::vector<double *> grad_eval_var_refs;
01644 double dev_null;
01645 #endif
01646 public:
01647 customColvar(std::string const &conf);
01648 virtual ~customColvar();
01649 virtual void calc_value();
01650 virtual void calc_gradients();
01651 virtual void apply_force(colvarvalue const &force);
01652 };
01653 
01654 
01655 class colvar::CVBasedPath
01656 : public colvar::cvc
01657 {
01658 protected:
01660 std::vector<colvar::cvc*> cv;
01662 std::vector<std::vector<colvarvalue>> ref_cv;
01664 bool use_explicit_gradients;
01666 size_t total_reference_frames;
01667 protected:
01668 virtual void computeDistanceToReferenceFrames(std::vector<cvm::real>& result);
01670 virtual void computeDistanceBetweenReferenceFrames(std::vector<cvm::real>& result) const;
01671 cvm::real getPolynomialFactorOfCVGradient(size_t i_cv) const;
01672 public:
01673 CVBasedPath(std::string const &conf);
01674 virtual ~CVBasedPath();
01675 virtual void calc_value() = 0;
01676 virtual void apply_force(colvarvalue const &force) = 0;
01677 };
01678 
01679 
01684 class colvar::gspathCV
01685 : public colvar::CVBasedPath, public GeometricPathCV::GeometricPathBase<colvarvalue, cvm::real, GeometricPathCV::path_sz::S>
01686 {
01687 protected:
01688 virtual void updateDistanceToReferenceFrames();
01689 virtual void prepareVectors();
01690 public:
01691 gspathCV(std::string const &conf);
01692 virtual ~gspathCV();
01693 virtual void calc_value();
01694 virtual void calc_gradients();
01695 virtual void apply_force(colvarvalue const &force);
01696 };
01697 
01698 
01699 
01700 class colvar::gzpathCV
01701 : public colvar::CVBasedPath, public GeometricPathCV::GeometricPathBase<colvarvalue, cvm::real, GeometricPathCV::path_sz::Z>
01702 {
01703 protected:
01704 virtual void updateDistanceToReferenceFrames();
01705 virtual void prepareVectors();
01706 public:
01707 gzpathCV(std::string const &conf);
01708 virtual ~gzpathCV();
01709 virtual void calc_value();
01710 virtual void calc_gradients();
01711 virtual void apply_force(colvarvalue const &force);
01712 };
01713 
01714 
01715 
01716 class colvar::aspathCV
01717 : public colvar::CVBasedPath, public ArithmeticPathCV::ArithmeticPathBase<colvarvalue, cvm::real, ArithmeticPathCV::path_sz::S>
01718 {
01719 protected:
01720 virtual void updateDistanceToReferenceFrames();
01721 public:
01722 aspathCV(std::string const &conf);
01723 virtual ~aspathCV();
01724 virtual void calc_value();
01725 virtual void calc_gradients();
01726 virtual void apply_force(colvarvalue const &force);
01727 };
01728 
01729 
01730 class colvar::azpathCV
01731 : public colvar::CVBasedPath, public ArithmeticPathCV::ArithmeticPathBase<colvarvalue, cvm::real, ArithmeticPathCV::path_sz::Z>
01732 {
01733 protected:
01734 virtual void updateDistanceToReferenceFrames();
01735 public:
01736 azpathCV(std::string const &conf);
01737 virtual ~azpathCV();
01738 virtual void calc_value();
01739 virtual void calc_gradients();
01740 virtual void apply_force(colvarvalue const &force);
01741 };
01742 
01743 // forward declaration
01744 namespace neuralnetworkCV {
01745 class neuralNetworkCompute;
01746 }
01747 
01748 class colvar::neuralNetwork
01749 : public linearCombination
01750 {
01751 protected:
01753 std::unique_ptr<neuralnetworkCV::neuralNetworkCompute> nn;
01755 size_t m_output_index;
01756 public:
01757 neuralNetwork(std::string const &conf);
01758 virtual ~neuralNetwork();
01759 virtual void calc_value();
01760 virtual void calc_gradients();
01761 virtual void apply_force(colvarvalue const &force);
01762 };
01763 
01764 #else // if the compiler doesn't support C++11
01765 
01766 class colvar::linearCombination
01767 : public colvar::componentDisabled
01768 {
01769 public:
01770 linearCombination(std::string const &conf) : componentDisabled(conf) {}
01771 };
01772 
01773 class colvar::CartesianBasedPath
01774 : public colvar::componentDisabled
01775 {
01776 public:
01777 CartesianBasedPath(std::string const &conf) : componentDisabled(conf) {}
01778 };
01779 
01780 class colvar::CVBasedPath
01781 : public colvar::componentDisabled
01782 {
01783 public:
01784 CVBasedPath(std::string const &conf) : componentDisabled(conf) {}
01785 };
01786 
01787 class colvar::gspath
01788 : public colvar::componentDisabled
01789 {
01790 public:
01791 gspath(std::string const &conf) : componentDisabled(conf) {}
01792 };
01793 
01794 class colvar::gzpath
01795 : public colvar::componentDisabled
01796 {
01797 public:
01798 gzpath(std::string const &conf) : componentDisabled(conf) {}
01799 };
01800 
01801 class colvar::gspathCV
01802 : public colvar::componentDisabled
01803 {
01804 public:
01805 gspathCV(std::string const &conf) : componentDisabled(conf) {}
01806 };
01807 
01808 class colvar::gzpathCV
01809 : public colvar::componentDisabled
01810 {
01811 public:
01812 gzpathCV(std::string const &conf) : componentDisabled(conf) {}
01813 };
01814 
01815 class colvar::aspathCV
01816 : public colvar::componentDisabled
01817 {
01818 public:
01819 aspathCV(std::string const &conf) : componentDisabled(conf) {}
01820 };
01821 
01822 class colvar::azpathCV
01823 : public colvar::componentDisabled
01824 {
01825 public:
01826 azpathCV(std::string const &conf) : componentDisabled(conf) {}
01827 };
01828 
01829 class colvar::neuralNetwork
01830 : public colvar::componentDisabled
01831 {
01832 public:
01833 neuralNetwork(std::string const &conf) : componentDisabled(conf) {}
01834 };
01835 
01836 #endif // C++11 checking
01837 
01838 
01839 // \brief Colvar component: total value of a scalar map
01840 // (usually implemented as a grid by the simulation engine)
01841 class colvar::map_total
01842 : public colvar::cvc
01843 {
01844 public:
01845 
01846 map_total();
01847 map_total(std::string const &conf);
01848 virtual ~map_total() {}
01849 virtual int init(std::string const &conf);
01850 virtual void calc_value();
01851 virtual void calc_gradients();
01852 virtual void apply_force(colvarvalue const &force);
01853 
01854 protected:
01855 
01857 std::string volmap_name;
01858 
01860 int volmap_id;
01861 
01863 int volmap_index;
01864 
01866 cvm::atom_group *atoms;
01867 
01869 std::vector<cvm::real> atom_weights;
01870 };
01871 
01872 
01873 
01874 // metrics functions for cvc implementations
01875 
01876 // simple definitions of the distance functions; these are useful only
01877 // for optimization (the type check performed in the default
01878 // colvarcomp functions is skipped)
01879 
01880 // definitions assuming the scalar type
01881 
01882 #define simple_scalar_dist_functions(TYPE) \
01883 \
01884 \
01885 cvm::real colvar::TYPE::dist2(colvarvalue const &x1, \
01886 colvarvalue const &x2) const \
01887 { \
01888 return (x1.real_value - x2.real_value)*(x1.real_value - x2.real_value); \
01889 } \
01890 \
01891 \
01892 colvarvalue colvar::TYPE::dist2_lgrad(colvarvalue const &x1, \
01893 colvarvalue const &x2) const \
01894 { \
01895 return 2.0 * (x1.real_value - x2.real_value); \
01896 } \
01897 \
01898 \
01899 colvarvalue colvar::TYPE::dist2_rgrad(colvarvalue const &x1, \
01900 colvarvalue const &x2) const \
01901 { \
01902 return this->dist2_lgrad(x2, x1); \
01903 } \
01904 
01905 
01906 #endif

Generated on Tue Nov 18 02:46:44 2025 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002

AltStyle によって変換されたページ (->オリジナル) /