| version 1.10 | version 1.11 |
|---|
| |
| | |
| | |
| | |
| | std::string const colvarvalue::type_desc(Type t) |
| | { |
| | switch (t) { |
| | case colvarvalue::type_scalar: |
| | return "scalar number"; break; |
| | case colvarvalue::type_3vector: |
| | return "3-dimensional vector"; break; |
| | case colvarvalue::type_unit3vector: |
| | return "3-dimensional unit vector"; break; |
| | case colvarvalue::type_unit3vectorderiv: |
| | return "derivative of a 3-dimensional unit vector"; break; |
| | case colvarvalue::type_quaternion: |
| | return "4-dimensional unit quaternion"; break; |
| | case colvarvalue::type_quaternionderiv: |
| | return "4-dimensional tangent vector"; break; |
| | case colvarvalue::type_vector: |
| | return "n-dimensional vector"; break; |
| | case colvarvalue::type_notset: |
| | // fallthrough |
| | default: |
| | return "not set"; break; |
| | } |
| | } |
| | |
| | |
| | std::string const colvarvalue::type_keyword(Type t) |
| | { |
| | switch (t) { |
| | case colvarvalue::type_notset: |
| | default: |
| | return "not_set"; break; |
| | case colvarvalue::type_scalar: |
| | return "scalar"; break; |
| | case colvarvalue::type_3vector: |
| | return "vector3"; break; |
| | case colvarvalue::type_unit3vector: |
| | return "unit_vector3"; break; |
| | case colvarvalue::type_unit3vectorderiv: |
| | return ""; break; |
| | case colvarvalue::type_quaternion: |
| | return "unit_quaternion"; break; |
| | case colvarvalue::type_quaternionderiv: |
| | return ""; break; |
| | case colvarvalue::type_vector: |
| | return "vector"; break; |
| | } |
| | } |
| | |
| | |
| | size_t colvarvalue::num_df(Type t) |
| | { |
| | switch (t) { |
| | case colvarvalue::type_notset: |
| | default: |
| | return 0; break; |
| | case colvarvalue::type_scalar: |
| | return 1; break; |
| | case colvarvalue::type_3vector: |
| | return 3; break; |
| | case colvarvalue::type_unit3vector: |
| | case colvarvalue::type_unit3vectorderiv: |
| | return 2; break; |
| | case colvarvalue::type_quaternion: |
| | case colvarvalue::type_quaternionderiv: |
| | return 3; break; |
| | case colvarvalue::type_vector: |
| | // the size of a vector is unknown without its object |
| | return 0; break; |
| | } |
| | } |
| | |
| | |
| | size_t colvarvalue::num_dimensions(Type t) |
| | { |
| | switch (t) { |
| | case colvarvalue::type_notset: |
| | default: |
| | return 0; break; |
| | case colvarvalue::type_scalar: |
| | return 1; break; |
| | case colvarvalue::type_3vector: |
| | case colvarvalue::type_unit3vector: |
| | case colvarvalue::type_unit3vectorderiv: |
| | return 3; break; |
| | case colvarvalue::type_quaternion: |
| | case colvarvalue::type_quaternionderiv: |
| | return 4; break; |
| | case colvarvalue::type_vector: |
| | // the size of a vector is unknown without its object |
| | return 0; break; |
| | } |
| | } |
| | |
| | |
| | void colvarvalue::reset() |
| | { |
| | switch (value_type) { |
| | case colvarvalue::type_scalar: |
| | real_value = 0.0; |
| | break; |
| | case colvarvalue::type_3vector: |
| | case colvarvalue::type_unit3vector: |
| | case colvarvalue::type_unit3vectorderiv: |
| | rvector_value.reset(); |
| | break; |
| | case colvarvalue::type_quaternion: |
| | case colvarvalue::type_quaternionderiv: |
| | quaternion_value.reset(); |
| | break; |
| | case colvarvalue::type_vector: |
| | vector1d_value.reset(); |
| | break; |
| | case colvarvalue::type_notset: |
| | default: |
| | break; |
| | } |
| | } |
| | |
| | |
| | void colvarvalue::apply_constraints() |
| | { |
| | switch (value_type) { |
| | case colvarvalue::type_scalar: |
| | case colvarvalue::type_3vector: |
| | case colvarvalue::type_unit3vectorderiv: |
| | case colvarvalue::type_quaternionderiv: |
| | break; |
| | case colvarvalue::type_unit3vector: |
| | rvector_value /= std::sqrt(rvector_value.norm2()); |
| | break; |
| | case colvarvalue::type_quaternion: |
| | quaternion_value /= std::sqrt(quaternion_value.norm2()); |
| | break; |
| | case colvarvalue::type_vector: |
| | 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++) { |
| | if (elem_sizes[i] == 1) continue; // TODO this can be optimized further |
| | colvarvalue cvtmp(vector1d_value.slice(elem_indices[i], |
| | elem_indices[i] + elem_sizes[i]), elem_types[i]); |
| | cvtmp.apply_constraints(); |
| | set_elem(i, cvtmp); |
| | } |
| | } |
| | break; |
| | case colvarvalue::type_notset: |
| | default: |
| | break; |
| | } |
| | } |
| | |
| | |
| | void colvarvalue::type(Type const &vti) |
| | { |
| | if (vti != value_type) { |
| | // reset the value based on the previous type |
| | reset(); |
| | if ((value_type == type_vector) && (vti != type_vector)) { |
| | vector1d_value.resize(0); |
| | } |
| | value_type = vti; |
| | } |
| | } |
| | |
| | |
| | void colvarvalue::type(colvarvalue const &x) |
| | { |
| | if (x.type() != value_type) { |
| | // reset the value based on the previous type |
| | reset(); |
| | if (value_type == type_vector) { |
| | vector1d_value.resize(0); |
| | } |
| | value_type = x.type(); |
| | } |
| | |
| | if (x.type() == type_vector) { |
| | vector1d_value.resize(x.vector1d_value.size()); |
| | } |
| | } |
| | |
| | |
| | void colvarvalue::is_derivative() |
| | { |
| | switch (value_type) { |
| | case colvarvalue::type_scalar: |
| | case colvarvalue::type_3vector: |
| | case colvarvalue::type_unit3vectorderiv: |
| | case colvarvalue::type_quaternionderiv: |
| | break; |
| | case colvarvalue::type_unit3vector: |
| | type(colvarvalue::type_unit3vectorderiv); |
| | break; |
| | case colvarvalue::type_quaternion: |
| | type(colvarvalue::type_quaternionderiv); |
| | break; |
| | case colvarvalue::type_vector: |
| | // TODO |
| | break; |
| | case colvarvalue::type_notset: |
| | default: |
| | break; |
| | } |
| | } |
| | |
| | |
| | colvarvalue::colvarvalue(colvarvalue const &x) |
| | : value_type(x.type()) |
| | { |
| | switch (x.type()) { |
| | case type_scalar: |
| | real_value = x.real_value; |
| | break; |
| | case type_3vector: |
| | case type_unit3vector: |
| | case type_unit3vectorderiv: |
| | rvector_value = x.rvector_value; |
| | break; |
| | case type_quaternion: |
| | case type_quaternionderiv: |
| | quaternion_value = x.quaternion_value; |
| | break; |
| | case type_vector: |
| | vector1d_value = x.vector1d_value; |
| | elem_types = x.elem_types; |
| | elem_indices = x.elem_indices; |
| | elem_sizes = x.elem_sizes; |
| | case type_notset: |
| | default: |
| | break; |
| | } |
| | } |
| | |
| | |
| | colvarvalue::colvarvalue(cvm::vector1d<cvm::real> const &v, Type vti) |
| | { |
| | if ((vti != type_vector) && (v.size() != num_dimensions(vti))) { |
| | cvm::error("Error: trying to initialize a variable of type \""+type_desc(vti)+ |
| | "\" using a vector of size "+cvm::to_str(v.size())+ |
| | ".\n"); |
| | value_type = type_notset; |
| | } else { |
| | value_type = vti; |
| | switch (vti) { |
| | case type_scalar: |
| | real_value = v[0]; |
| | break; |
| | case type_3vector: |
| | case type_unit3vector: |
| | case type_unit3vectorderiv: |
| | rvector_value = cvm::rvector(v); |
| | break; |
| | case type_quaternion: |
| | case type_quaternionderiv: |
| | quaternion_value = cvm::quaternion(v); |
| | break; |
| | case type_vector: |
| | vector1d_value = v; |
| | break; |
| | case type_notset: |
| | default: |
| | break; |
| | } |
| | } |
| | } |
| | |
| | |
| void colvarvalue::add_elem(colvarvalue const &x) | void colvarvalue::add_elem(colvarvalue const &x) |
| { | { |
| if (this->value_type != type_vector) { | if (this->value_type != type_vector) { |
| |
| } | } |
| | |
| | |
| | void colvarvalue::undef_op() const |
| | { |
| | cvm::error("Error: Undefined operation on a colvar of type \""+ |
| | type_desc(this->type())+"\".\n"); |
| | } |
| | |
| | |
| // binary operations between two colvarvalues | // binary operations between two colvarvalues |
| | |
| colvarvalue operator + (colvarvalue const &x1, | colvarvalue operator + (colvarvalue const &x1, |