else
{
do_mtop(fio, &dum_top, bRead, fileVersion);
- done_mtop(&dum_top, TRUE);
+ done_mtop(&dum_top);
}
}
do_test(fio, tpx.bX, x);
write_IMDgroup_to_file(ir->bIMD, ir, &state, sys, NFILE, fnm);
done_atomtype(atype);
- done_mtop(sys, TRUE);
+ done_mtop(sys);
done_inputrec_strings();
return 0;
{
if (top_ != NULL)
{
- done_mtop(top_, TRUE);
+ done_mtop(top_);
sfree(top_);
}
}
{
if (mtop_ != nullptr)
{
- done_mtop(mtop_, TRUE);
+ done_mtop(mtop_);
sfree(mtop_);
}
GMX_RELEASE_ASSERT(mtop_ != NULL, "Topology not initialized");
int index = 0;
mtop_->mols.nalloc_index = (mtop_->natoms + moleculeSize - 1) / moleculeSize + 1;
- snew(mtop_->mols.index, mtop_->mols.nalloc_index);
+ srenew(mtop_->mols.index, mtop_->mols.nalloc_index);
mtop_->mols.nr = 0;
while (index < mtop_->natoms)
{
return top;
}
-static void done_gmx_groups_t(gmx_groups_t *g)
-{
- int i;
-
- for (i = 0; (i < egcNR); i++)
- {
- if (NULL != g->grps[i].nm_ind)
- {
- sfree(g->grps[i].nm_ind);
- g->grps[i].nm_ind = NULL;
- }
- if (NULL != g->grpnr[i])
- {
- sfree(g->grpnr[i]);
- g->grpnr[i] = NULL;
- }
- }
- /* The contents of this array is in symtab, don't free it here */
- sfree(g->grpname);
-}
-
t_topology gmx_mtop_t_to_t_topology(gmx_mtop_t *mtop, bool freeMTop)
{
int mt, mb;
}
}
-void done_mtop(gmx_mtop_t *mtop, gmx_bool bDoneSymtab)
+void done_gmx_groups_t(gmx_groups_t *g)
{
- if (bDoneSymtab)
+ int i;
+
+ for (i = 0; (i < egcNR); i++)
{
- done_symtab(&mtop->symtab);
+ if (NULL != g->grps[i].nm_ind)
+ {
+ sfree(g->grps[i].nm_ind);
+ g->grps[i].nm_ind = NULL;
+ }
+ if (NULL != g->grpnr[i])
+ {
+ sfree(g->grpnr[i]);
+ g->grpnr[i] = NULL;
+ }
}
+ /* The contents of this array is in symtab, don't free it here */
+ sfree(g->grpname);
+}
+
+void done_mtop(gmx_mtop_t *mtop)
+{
+ done_symtab(&mtop->symtab);
sfree(mtop->ffparams.functype);
sfree(mtop->ffparams.iparams);
done_molblock(&mtop->molblock[i]);
}
sfree(mtop->molblock);
+ done_atomtypes(&mtop->atomtypes);
+ done_gmx_groups_t(&mtop->groups);
done_block(&mtop->mols);
}
done_blocka(&(top->excls));
}
+void done_top_mtop(t_topology *top, gmx_mtop_t *mtop)
+{
+ if (mtop != nullptr)
+ {
+ if (top != nullptr)
+ {
+ for (int f = 0; f < F_NRE; ++f)
+ {
+ sfree(top->idef.il[f].iatoms);
+ top->idef.il[f].iatoms = NULL;
+ top->idef.il[f].nalloc = 0;
+ }
+ done_atom(&top->atoms);
+ done_block(&top->cgs);
+ done_blocka(&top->excls);
+ done_symtab(&top->symtab);
+ open_symtab(&mtop->symtab);
+ }
+ done_mtop(mtop);
+ }
+}
+
bool gmx_mtop_has_masses(const gmx_mtop_t *mtop)
{
if (mtop == nullptr)
void init_top(t_topology *top);
void done_moltype(gmx_moltype_t *molt);
void done_molblock(gmx_molblock_t *molb);
-void done_mtop(gmx_mtop_t *mtop, gmx_bool bDoneSymtab);
+void done_gmx_groups_t(gmx_groups_t *g);
+void done_mtop(gmx_mtop_t *mtop);
void done_top(t_topology *top);
+// Frees both t_topology and gmx_mtop_t when the former has been created from
+// the latter.
+void done_top_mtop(t_topology *top, gmx_mtop_t *mtop);
bool gmx_mtop_has_masses(const gmx_mtop_t *mtop);
bool gmx_mtop_has_charges(const gmx_mtop_t *mtop);
TopologyInformation::~TopologyInformation()
{
- if (mtop_)
- {
- done_mtop(mtop_, TRUE);
- sfree(mtop_);
- }
- // TODO: Free that part of the memory that is not shared with mtop_.
+ done_top_mtop(top_, mtop_);
+ sfree(mtop_);
sfree(top_);
sfree(xtop_);
}