r_min_rad = probe_rad*probe_rad;
gmx::RangePartitioning molecules = gmx_mtop_molecules(*mtop);
snew(rm_p->block, molecules.numBlocks());
+ snew(rm_p->mol, molecules.numBlocks());
nrm = nupper = 0;
nlower = low_up_rm;
for (i = 0; i < ins_at->nr; i++)
for (int i = 0; i < rm_p->nr; i++)
{
mol_id = rm_p->mol[i];
- at = molecules.block(mol_id).size();
+ at = molecules.block(mol_id).begin();
block = rm_p->block[i];
mtop->molblock[block].nmol--;
for (j = 0; j < mtop->moltype[mtop->molblock[block].type].atoms.nr; j++)
}
mtop->natoms -= n;
- state_change_natoms(state, state->natoms - n);
- snew(x_tmp, state->natoms);
- snew(v_tmp, state->natoms);
+ /* We cannot change the size of the state datastructures here
+ * because we still access the coordinate arrays for all positions
+ * before removing the molecules we want to remove.
+ */
+ const int newStateAtomNumber = state->natoms - n;
+ snew(x_tmp, newStateAtomNumber);
+ snew(v_tmp, newStateAtomNumber);
for (auto group : keysOf(groups->groupNumbers))
{
if (!groups->groupNumbers[group].empty())
{
- groups->groupNumbers[group].resize(state->natoms);
- new_egrp[group].resize(state->natoms);
+ groups->groupNumbers[group].resize(newStateAtomNumber);
+ new_egrp[group].resize(newStateAtomNumber);
}
}
auto x = makeArrayRef(state->x);
auto v = makeArrayRef(state->v);
rm = 0;
- for (int i = 0; i < state->natoms+n; i++)
+ for (int i = 0; i < state->natoms; i++)
{
bRM = FALSE;
for (j = 0; j < n; j++)
}
}
}
+ state_change_natoms(state, newStateAtomNumber);
for (int i = 0; i < state->natoms; i++)
{
copy_rvec(x_tmp[i], x[i]);