colvarvalue const colvarvalue::get_elem(int const i_begin, int const i_end, Type const vt) const { if (vector1d_value.size() > 0) { cvm::vector1d<cvm::real> const v(vector1d_value.slice(i_begin, i_end)); return colvarvalue(v, vt); } else { cvm::error("Error: trying to get an element from a variable that is not a vector.\n"); return colvarvalue(type_notset); } }
colvarvalue const colvarvalue::get_elem(int const icv) const { if (elem_types.size() > 0) { return get_elem(elem_indices[icv], elem_indices[icv] + elem_sizes[icv], elem_types[icv]); } else { cvm::error("Error: trying to get a colvarvalue element from a vector colvarvalue that was initialized as a plain array.\n"); return colvarvalue(type_notset); } }
colvarvalue operator - (colvarvalue const &x1, colvarvalue const &x2) { colvarvalue::check_types(x1, x2); switch (x1.value_type) { case colvarvalue::type_scalar: return colvarvalue(x1.real_value - x2.real_value); case colvarvalue::type_3vector: return colvarvalue(x1.rvector_value - x2.rvector_value); case colvarvalue::type_unit3vector: case colvarvalue::type_unit3vectorderiv: return colvarvalue(x1.rvector_value - x2.rvector_value, colvarvalue::type_unit3vector); case colvarvalue::type_quaternion: case colvarvalue::type_quaternionderiv: return colvarvalue(x1.quaternion_value - x2.quaternion_value); case colvarvalue::type_vector: return colvarvalue(x1.vector1d_value - x2.vector1d_value, colvarvalue::type_vector); case colvarvalue::type_notset: default: x1.undef_op(); return colvarvalue(colvarvalue::type_notset); }; }
colvarvalue colvarvalue::dist2_grad(colvarvalue const &x2) const { colvarvalue::check_types(*this, x2); switch (this->value_type) { case colvarvalue::type_scalar: return 2.0 * (this->real_value - x2.real_value); case colvarvalue::type_3vector: return 2.0 * (this->rvector_value - x2.rvector_value); case colvarvalue::type_unit3vector: case colvarvalue::type_unit3vectorderiv: { cvm::rvector const &v1 = this->rvector_value; cvm::rvector const &v2 = x2.rvector_value; cvm::real const cos_t = v1 * v2; cvm::real const sin_t = std::sqrt(1.0 - cos_t*cos_t); return colvarvalue( 2.0 * sin_t * cvm::rvector((-1.0) * sin_t * v2.x + cos_t/sin_t * (v1.x - cos_t*v2.x), (-1.0) * sin_t * v2.y + cos_t/sin_t * (v1.y - cos_t*v2.y), (-1.0) * sin_t * v2.z + cos_t/sin_t * (v1.z - cos_t*v2.z) ), colvarvalue::type_unit3vectorderiv ); } case colvarvalue::type_quaternion: case colvarvalue::type_quaternionderiv: return this->quaternion_value.dist2_grad(x2.quaternion_value); case colvarvalue::type_vector: return colvarvalue(2.0 * (this->vector1d_value - x2.vector1d_value), colvarvalue::type_vector); break; case colvarvalue::type_notset: default: this->undef_op(); return colvarvalue(colvarvalue::type_notset); }; }
/// Return the midpoint between x1 and x2, optionally weighted by lambda /// (which must be between 0.0 and 1.0) colvarvalue const colvarvalue::interpolate(colvarvalue const &x1, colvarvalue const &x2, cvm::real const lambda) { colvarvalue::check_types(x1, x2); if ((lambda < 0.0) || (lambda > 1.0)) { cvm::error("Error: trying to interpolate between two colvarvalues with a " "lamdba outside [0:1].\n", BUG_ERROR); } colvarvalue interp = ((1.0-lambda)*x1 + lambda*x2); cvm::real const d2 = x1.dist2(x2); switch (x1.type()) { case colvarvalue::type_scalar: case colvarvalue::type_3vector: case colvarvalue::type_vector: case colvarvalue::type_unit3vectorderiv: case colvarvalue::type_quaternionderiv: return interp; break; case colvarvalue::type_unit3vector: case colvarvalue::type_quaternion: if (interp.norm()/cvm::sqrt(d2) < 1.0e-6) { cvm::error("Error: interpolation between "+cvm::to_str(x1)+" and "+ cvm::to_str(x2)+" with lambda = "+cvm::to_str(lambda)+ " is undefined: result = "+cvm::to_str(interp)+"\n", INPUT_ERROR); } interp.apply_constraints(); return interp; break; case colvarvalue::type_notset: default: x1.undef_op(); break; } return colvarvalue(colvarvalue::type_notset); }
colvarvalue operator / (colvarvalue const &x, cvm::real const &a) { switch (x.value_type) { case colvarvalue::type_scalar: return colvarvalue(x.real_value / a); case colvarvalue::type_3vector: return colvarvalue(x.rvector_value / a); case colvarvalue::type_unit3vector: case colvarvalue::type_unit3vectorderiv: return colvarvalue(x.rvector_value / a, colvarvalue::type_unit3vector); case colvarvalue::type_quaternion: case colvarvalue::type_quaternionderiv: return colvarvalue(x.quaternion_value / a); case colvarvalue::type_vector: return colvarvalue(x.vector1d_value / a, colvarvalue::type_vector); case colvarvalue::type_notset: default: x.undef_op(); return colvarvalue(colvarvalue::type_notset); } }
colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, colvarvalue const &x2) const { return colvarvalue((x2.rvector_value - x1.rvector_value), colvarvalue::type_unit3vectorderiv); }