| version 1.9 | version 1.10 |
|---|
| |
| // -*- c++ -*- | // -*- c++ -*- |
| | |
| | // This file is part of the Collective Variables module (Colvars). |
| | // The original version of Colvars and its updates are located at: |
| | // https://github.com/colvars/colvars |
| | // Please update all Colvars source files before making any changes. |
| | // If you wish to distribute your changes, please submit them to the |
| | // Colvars repository at GitHub. |
| | |
| #include <vector> | #include <vector> |
| #include <sstream> | #include <sstream> |
| #include <iostream> | #include <iostream> |
| |
| | |
| void colvarvalue::set_random() | void colvarvalue::set_random() |
| { | { |
| | size_t ic; |
| switch (this->type()) { | switch (this->type()) { |
| case colvarvalue::type_scalar: | case colvarvalue::type_scalar: |
| this->real_value = cvm::rand_gaussian(); | this->real_value = cvm::rand_gaussian(); |
| |
| this->quaternion_value.q3 = cvm::rand_gaussian(); | this->quaternion_value.q3 = cvm::rand_gaussian(); |
| break; | break; |
| case colvarvalue::type_vector: | case colvarvalue::type_vector: |
| for (size_t ic = 0; ic < this->vector1d_value.size(); ic++) { | for (ic = 0; ic < this->vector1d_value.size(); ic++) { |
| this->vector1d_value[ic] = cvm::rand_gaussian(); | this->vector1d_value[ic] = cvm::rand_gaussian(); |
| } | } |
| break; | break; |
| |
| } | } |
| | |
| | |
| colvarvalue colvarvalue::inverse() const | |
| { | |
| switch (value_type) { | |
| case colvarvalue::type_scalar: | |
| return colvarvalue(1.0/real_value); | |
| break; | |
| case colvarvalue::type_3vector: | |
| case colvarvalue::type_unit3vector: | |
| case colvarvalue::type_unit3vectorderiv: | |
| return colvarvalue(cvm::rvector(1.0/rvector_value.x, | |
| 1.0/rvector_value.y, | |
| 1.0/rvector_value.z)); | |
| break; | |
| case colvarvalue::type_quaternion: | |
| case colvarvalue::type_quaternionderiv: | |
| return colvarvalue(cvm::quaternion(1.0/quaternion_value.q0, | |
| 1.0/quaternion_value.q1, | |
| 1.0/quaternion_value.q2, | |
| 1.0/quaternion_value.q3)); | |
| break; | |
| case colvarvalue::type_vector: | |
| { | |
| cvm::vector1d<cvm::real> result(vector1d_value); | |
| if (elem_types.size() > 0) { | |
| // if we have information about non-scalar types, use it | |
| size_t i; | |
| for (i = 0; i < elem_types.size(); i++) { | |
| result.sliceassign(elem_indices[i], elem_indices[i]+elem_sizes[i], | |
| cvm::vector1d<cvm::real>((this->get_elem(i)).inverse())); | |
| } | |
| } else { | |
| size_t i; | |
| for (i = 0; i < result.size(); i++) { | |
| if (result[i] != 0.0) { | |
| result = 1.0/result[i]; | |
| } | |
| } | |
| } | |
| return colvarvalue(result, type_vector); | |
| } | |
| break; | |
| case colvarvalue::type_notset: | |
| default: | |
| undef_op(); | |
| break; | |
| } | |
| return colvarvalue(); | |
| } | |
| | |
| | |
| // binary operations between two colvarvalues | // binary operations between two colvarvalues |
| | |
| colvarvalue operator + (colvarvalue const &x1, | colvarvalue operator + (colvarvalue const &x1, |
| |
| (-1.0) * sin_t * v2.z + | (-1.0) * sin_t * v2.z + |
| cos_t/sin_t * (v1.z - cos_t*v2.z) | cos_t/sin_t * (v1.z - cos_t*v2.z) |
| ), | ), |
| colvarvalue::type_unit3vector ); | colvarvalue::type_unit3vectorderiv ); |
| } | } |
| case colvarvalue::type_quaternion: | case colvarvalue::type_quaternion: |
| case colvarvalue::type_quaternionderiv: | case colvarvalue::type_quaternionderiv: |