-typedef struct {
- rvec p; /* Linear momentum */
- rvec x; /* Center of mass */
- rvec j; /* Angular momentum */
- tensor i; /* Moment of inertia */
- real mass; /* Mass */
-} t_vcm_thread;
+struct t_vcm_thread{
+ rvec p = {0}; /* Linear momentum */
+ rvec x = {0}; /* Center of mass */
+ rvec j = {0}; /* Angular momentum */
+ tensor i = {{0}}; /* Moment of inertia */
+ real mass = 0; /* Mass */
+};
+
+struct t_vcm
+{
+ int nr; /* Number of groups */
+ int size; /* Size of group arrays */
+ int stride; /* Stride for thread data */
+ int mode; /* One of the enums above */
+ int ndim; /* The number of dimensions for corr. */
+ real timeStep; /* The time step for COMM removal */
+ std::vector<real> group_ndf; /* Number of degrees of freedom */
+ std::vector<real> group_mass; /* Mass per group */
+ std::vector<gmx::RVec> group_p; /* Linear momentum per group */
+ std::vector<gmx::RVec> group_v; /* Linear velocity per group */
+ std::vector<gmx::RVec> group_x; /* Center of mass per group */
+ std::vector<gmx::RVec> group_j; /* Angular momentum per group */
+ std::vector<gmx::RVec> group_w; /* Angular velocity (omega) */
+ tensor *group_i; /* Moment of inertia per group */
+ std::vector<char *> group_name; /* These two are copies to pointers in */
+ ivec *nFreeze; /* Tells whether dimensions are frozen per freeze group */
+ std::vector<t_vcm_thread> thread_vcm; /* Temporary data per thread and group */
+
+ t_vcm(const gmx_groups_t &groups, const t_inputrec &ir);
+ ~t_vcm();
+};