{
for (int atomIndex = 0; atomIndex < atoms.nr; atomIndex++, i++)
{
- if (getGroupType(&mtop->groups, gtype, i) != 0)
+ if (getGroupType(mtop->groups, gtype, i) != 0)
{
return FALSE;
}
char *res_name;
int res_id;
- if (getGroupType(&mtop->groups, egcCompressedX, i) != 0)
+ if (getGroupType(mtop->groups, egcCompressedX, i) != 0)
{
continue;
}
int atom1, atom2;
atom1 = ilist.iatoms[l] + atom_offset;
atom2 = ilist.iatoms[l + 1] + atom_offset;
- if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0 &&
- getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0 &&
+ getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
{
tng_molecule_bond_add(tng, mol, ilist.iatoms[l],
ilist.iatoms[l + 1], &tngBond);
atom1 = ilist.iatoms[l] + atom_offset;
atom2 = ilist.iatoms[l + 1] + atom_offset;
atom3 = ilist.iatoms[l + 2] + atom_offset;
- if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0)
{
- if (getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
{
tng_molecule_bond_add(tng, mol, atom1,
atom2, &tngBond);
}
- if (getGroupType(&mtop->groups, egcCompressedX, atom3) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom3) == 0)
{
tng_molecule_bond_add(tng, mol, atom1,
atom3, &tngBond);
{
/* Get the energy group of the first atom in this charge group */
firstj = astart + molt->cgs.index[cg];
- firsteg = getGroupType(&mtop->groups, egcENER, firstj);
+ firsteg = getGroupType(mtop->groups, egcENER, firstj);
for (j = molt->cgs.index[cg]+1; j < molt->cgs.index[cg+1]; j++)
{
- eg = getGroupType(&mtop->groups, egcENER, astart+j);
+ eg = getGroupType(mtop->groups, egcENER, astart+j);
if (eg != firsteg)
{
gmx_fatal(FARGS, "atoms %d and %d in charge group %d of molecule type '%s' are in different energy groups",
static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
{
t_grpopts *opts;
- const gmx_groups_t *groups;
pull_params_t *pull;
int natoms, ai, aj, i, j, d, g, imin, jmin;
int *nrdf2, *na_vcm, na_tot;
opts = &ir->opts;
- groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
natoms = mtop->natoms;
/* Allocate one more for a possible rest group */
/* We need to sum degrees of freedom into doubles,
* since floats give too low nrdf's above 3 million atoms.
*/
- snew(nrdf_tc, groups->grps[egcTC].nr+1);
- snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
- snew(dof_vcm, groups->grps[egcVCM].nr+1);
- snew(na_vcm, groups->grps[egcVCM].nr+1);
- snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
+ snew(nrdf_tc, groups.grps[egcTC].nr+1);
+ snew(nrdf_vcm, groups.grps[egcVCM].nr+1);
+ snew(dof_vcm, groups.grps[egcVCM].nr+1);
+ snew(na_vcm, groups.grps[egcVCM].nr+1);
+ snew(nrdf_vcm_sub, groups.grps[egcVCM].nr+1);
- for (i = 0; i < groups->grps[egcTC].nr; i++)
+ for (i = 0; i < groups.grps[egcTC].nr; i++)
{
nrdf_tc[i] = 0;
}
- for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
+ for (i = 0; i < groups.grps[egcVCM].nr+1; i++)
{
nrdf_vcm[i] = 0;
clear_ivec(dof_vcm[i]);
nrdf_vcm[getGroupType(groups, egcVCM, ai)] -= 0.5*imin;
if (nrdf_tc[getGroupType(groups, egcTC, ai)] < 0)
{
- gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups->grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
+ gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups.grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
}
}
else
* the number of degrees of freedom in each vcm group when COM
* translation is removed and 6 when rotation is removed as well.
*/
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
switch (ir->comm_mode)
{
}
}
- for (i = 0; i < groups->grps[egcTC].nr; i++)
+ for (i = 0; i < groups.grps[egcTC].nr; i++)
{
/* Count the number of atoms of TC group i for every VCM group */
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
na_vcm[j] = 0;
}
*/
nrdf_uc = nrdf_tc[i];
nrdf_tc[i] = 0;
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
if (nrdf_vcm[j] > nrdf_vcm_sub[j])
{
}
}
}
- for (i = 0; (i < groups->grps[egcTC].nr); i++)
+ for (i = 0; (i < groups.grps[egcTC].nr); i++)
{
opts->nrdf[i] = nrdf_tc[i];
if (opts->nrdf[i] < 0)
}
fprintf(stderr,
"Number of degrees of freedom in T-Coupling group %s is %.2f\n",
- gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
+ gnames[groups.grps[egcTC].nm_ind[i]], opts->nrdf[i]);
}
sfree(nrdf2);
const t_atom *atom;
while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
{
- mgrp[getGroupType(&sys->groups, egcACC, i)] += atom->m;
+ mgrp[getGroupType(sys->groups, egcACC, i)] += atom->m;
}
mt = 0.0;
for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
od->nref = 0;
for (int i = 0; i < mtop->natoms; i++)
{
- if (getGroupType(&mtop->groups, egcORFIT, i) == 0)
+ if (getGroupType(mtop->groups, egcORFIT, i) == 0)
{
od->nref++;
}
{
a0 = cgs->index[cg];
a1 = cgs->index[cg+1];
- if (getGroupType(&mtop->groups, egcENER, a_offset+am+a0) !=
- getGroupType(&mtop->groups, egcENER, a_offset +a0))
+ if (getGroupType(mtop->groups, egcENER, a_offset+am+a0) !=
+ getGroupType(mtop->groups, egcENER, a_offset +a0))
{
bId = FALSE;
}
a1 = cgs->index[cg+1];
/* Store the energy group in cginfo */
- gid = getGroupType(&mtop->groups, egcENER, a_offset+am+a0);
+ gid = getGroupType(mtop->groups, egcENER, a_offset+am+a0);
SET_CGINFO_GID(cginfo[cgm+cg], gid);
/* Check the intra/inter charge group exclusions */
md->bVCMgrps = FALSE;
for (int i = 0; i < mtop.natoms; i++)
{
- if (getGroupType(&mtop.groups, egcVCM, i) > 0)
+ if (getGroupType(mtop.groups, egcVCM, i) > 0)
{
md->bVCMgrps = TRUE;
}
{
gmx_bool bLJPME;
const t_grpopts *opts;
- const gmx_groups_t *groups;
int nthreads gmx_unused;
bLJPME = EVDW_PME(ir->vdwtype);
opts = &ir->opts;
- groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
- auto md = mdAtoms->mdatoms();
+ auto md = mdAtoms->mdatoms();
/* nindex>=0 indicates DD where we use an index */
if (nindex >= 0)
{
else
{
/* The friction coefficient is mass/tau_t */
- fac = ir->delta_t/opts->tau_t[md->cTC ? groups->grpnr[egcTC][ag] : 0];
+ fac = ir->delta_t/opts->tau_t[md->cTC ? groups.grpnr[egcTC][ag] : 0];
mA = 0.5*atom.m*fac;
mB = 0.5*atom.mB*fac;
}
md->ptype[i] = atom.ptype;
if (md->cTC)
{
- md->cTC[i] = groups->grpnr[egcTC][ag];
+ md->cTC[i] = groups.grpnr[egcTC][ag];
}
md->cENER[i] = getGroupType(groups, egcENER, ag);
if (md->cACC)
{
- md->cACC[i] = groups->grpnr[egcACC][ag];
+ md->cACC[i] = groups.grpnr[egcACC][ag];
}
if (md->cVCM)
{
- md->cVCM[i] = groups->grpnr[egcVCM][ag];
+ md->cVCM[i] = groups.grpnr[egcVCM][ag];
}
if (md->cORF)
{
if (md->cU1)
{
- md->cU1[i] = groups->grpnr[egcUser1][ag];
+ md->cU1[i] = groups.grpnr[egcUser1][ag];
}
if (md->cU2)
{
- md->cU2[i] = groups->grpnr[egcUser2][ag];
+ md->cU2[i] = groups.grpnr[egcUser2][ag];
}
if (ir->bQMMM)
{
- if (groups->grpnr[egcQMMM] == nullptr ||
- groups->grpnr[egcQMMM][ag] < groups->grps[egcQMMM].nr-1)
+ if (groups.grpnr[egcQMMM] == nullptr ||
+ groups.grpnr[egcQMMM][ag] < groups.grps[egcQMMM].nr-1)
{
md->bQM[i] = TRUE;
}
of->natoms_x_compressed = 0;
for (i = 0; (i < top_global->natoms); i++)
{
- if (getGroupType(of->groups, egcCompressedX, i) == 0)
+ if (getGroupType(*of->groups, egcCompressedX, i) == 0)
{
of->natoms_x_compressed++;
}
auto x = makeArrayRef(state_global->x);
for (i = 0, j = 0; (i < of->natoms_global); i++)
{
- if (getGroupType(of->groups, egcCompressedX, i) == 0)
+ if (getGroupType(*of->groups, egcCompressedX, i) == 0)
{
copy_rvec(x[i], xxtc[j++]);
}
qr->nrQMlayers = 1;
}
- const gmx_groups_t *groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
/* there are jmax groups of QM atoms. In case of multiple QM groups
* I assume that the users wants to do ONIOM. However, maybe it
static void init_grpstat(const gmx_mtop_t *mtop, int ngacc, t_grp_acc gstat[])
{
- const gmx_groups_t *groups;
gmx_mtop_atomloop_all_t aloop;
int i, grp;
const t_atom *atom;
if (ngacc > 0)
{
- groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
aloop = gmx_mtop_atomloop_all_init(mtop);
while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
{
/* In parallel, store we need to extract localWeights from weights at DD time */
std::vector<real> &weights = ((cr && PAR(cr)) ? pg->globalWeights : pg->localWeights);
- const gmx_groups_t *groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
/* Count frozen dimensions and (weighted) mass */
int nfrozen = 0;
}
else
{
- if (groups->grpnr[egcTC] == nullptr)
+ if (groups.grpnr[egcTC] == nullptr)
{
mbd = ir->delta_t/ir->opts.tau_t[0];
}
else
{
- mbd = ir->delta_t/ir->opts.tau_t[groups->grpnr[egcTC][ii]];
+ mbd = ir->delta_t/ir->opts.tau_t[groups.grpnr[egcTC][ii]];
}
}
w *= m/mbd;
top[0] = gmx_mtop_t_to_t_topology(&mtop[0], false);
top[1] = gmx_mtop_t_to_t_topology(&mtop[1], false);
cmp_top(stdout, &top[0], &top[1], ftol, abstol);
- cmp_groups(stdout, &mtop[0].groups, &mtop[1].groups,
- mtop[0].natoms, mtop[1].natoms);
+ compareAtomGroups(stdout, mtop[0].groups, mtop[1].groups,
+ mtop[0].natoms, mtop[1].natoms);
comp_state(&state[0], &state[1], bRMSD, ftol, abstol);
}
else
t_state state;
t_tpxheader tpx;
gmx_mtop_t mtop;
- gmx_groups_t *groups;
t_topology top;
read_tpxheader(fn, &tpx, TRUE);
pr_rvecs(stdout, indent, "v", tpx.bV ? state.v.rvec_array() : nullptr, state.natoms);
}
- groups = &mtop.groups;
+ const gmx_groups_t &groups = mtop.groups;
snew(gcount, egcNR);
for (i = 0; (i < egcNR); i++)
{
- snew(gcount[i], groups->grps[i].nr);
+ snew(gcount[i], groups.grps[i].nr);
}
for (i = 0; (i < mtop.natoms); i++)
{
atot = 0;
printf("%-12s: ", gtypes[i]);
- for (j = 0; (j < groups->grps[i].nr); j++)
+ for (j = 0; (j < groups.grps[i].nr); j++)
{
printf(" %5d", gcount[i][j]);
atot += gcount[i][j];
}
}
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
- int natoms0, int natoms1)
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+ int natoms0, int natoms1)
{
- char buf[32];
-
fprintf(fp, "comparing groups\n");
for (int i = 0; i < egcNR; i++)
{
- sprintf(buf, "grps[%d].nr", i);
- cmp_int(fp, buf, -1, g0->grps[i].nr, g1->grps[i].nr);
- if (g0->grps[i].nr == g1->grps[i].nr)
+ std::string buf = gmx::formatString("grps[%d].nr", i);
+ cmp_int(fp, buf.c_str(), -1, g0.grps[i].nr, g1.grps[i].nr);
+ if (g0.grps[i].nr == g1.grps[i].nr)
{
- for (int j = 0; j < g0->grps[i].nr; j++)
+ for (int j = 0; j < g0.grps[i].nr; j++)
{
- sprintf(buf, "grps[%d].name[%d]", i, j);
- cmp_str(fp, buf, -1,
- *g0->grpname[g0->grps[i].nm_ind[j]],
- *g1->grpname[g1->grps[i].nm_ind[j]]);
+ buf = gmx::formatString("grps[%d].name[%d]", i, j);
+ cmp_str(fp, buf.c_str(), -1,
+ *g0.grpname[g0.grps[i].nm_ind[j]],
+ *g1.grpname[g1.grps[i].nm_ind[j]]);
}
}
- cmp_int(fp, "ngrpnr", i, g0->ngrpnr[i], g1->ngrpnr[i]);
- if (g0->ngrpnr[i] == g1->ngrpnr[i] && natoms0 == natoms1 &&
- (g0->grpnr[i] != nullptr || g1->grpnr[i] != nullptr))
+ cmp_int(fp, "ngrpnr", i, g0.ngrpnr[i], g1.ngrpnr[i]);
+ if (g0.ngrpnr[i] == g1.ngrpnr[i] && natoms0 == natoms1 &&
+ (g0.grpnr[i] != nullptr || g1.grpnr[i] != nullptr))
{
for (int j = 0; j < natoms0; j++)
{
*/
}
-int getGroupType(const gmx_groups_t *group, int type, int atom)
+int getGroupType(const gmx_groups_t &group, int type, int atom)
{
- return (group->grpnr[type] ? group->grpnr[type][atom] : 0);
+ return (group.grpnr[type] ? group.grpnr[type][atom] : 0);
}
void copy_moltype(const gmx_moltype_t *src, gmx_moltype_t *dst)
* \param[in] type Type of group to check.
* \param[in] atom Atom to check if it has an entry.
*/
-int getGroupType (const gmx_groups_t *group, int type, int atom);
+int getGroupType (const gmx_groups_t &group, int type, int atom);
/* The global, complete system topology struct, based on molecule types.
* This structure should contain no data that is O(natoms) in memory.
gmx_bool bShowNumbers, gmx_bool bShowParameters);
void cmp_top(FILE *fp, const t_topology *t1, const t_topology *t2, real ftol, real abstol);
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
- int natoms0, int natoms1);
+
+/*! \brief Compare groups.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] g0 First group for comparison.
+ * \param[in] g1 Second group for comparison.
+ * \param[in] natoms0 Number of atoms for first group.
+ * \param[in] natoms1 Number of atoms for second group.
+ */
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+ int natoms0, int natoms1);
//! Deleter for gmx_localtop_t, needed until it has a proper destructor.
using ExpandedTopologyPtr = gmx::unique_cptr<gmx_localtop_t, done_and_sfree_localtop>;