snew(top, 1);
/* TODO: Get rid of the const casts below, e.g. by using a reference */
- top->idef.ntypes = top_global->ffparams.numTypes();
- top->idef.atnr = top_global->ffparams.atnr;
- top->idef.functype = const_cast<t_functype *>(top_global->ffparams.functype.data());
- top->idef.iparams = const_cast<t_iparams *>(top_global->ffparams.iparams.data());
- top->idef.fudgeQQ = top_global->ffparams.fudgeQQ;
- top->idef.cmap_grid = top_global->ffparams.cmap_grid;
-
- top->idef.ilsort = ilsortUNKNOWN;
+ top->idef.ntypes = top_global->ffparams.numTypes();
+ top->idef.atnr = top_global->ffparams.atnr;
+ top->idef.functype = const_cast<t_functype *>(top_global->ffparams.functype.data());
+ top->idef.iparams = const_cast<t_iparams *>(top_global->ffparams.iparams.data());
+ top->idef.fudgeQQ = top_global->ffparams.fudgeQQ;
+ top->idef.cmap_grid = new gmx_cmap_t;
+ *top->idef.cmap_grid = top_global->ffparams.cmap_grid;
+
+ top->idef.ilsort = ilsortUNKNOWN;
return top;
}
static void do_cmap(t_fileio *fio, gmx_cmap_t *cmap_grid, gmx_bool bRead)
{
- int i, j, ngrid, gs, nelem;
- gmx_fio_do_int(fio, cmap_grid->ngrid);
+ int ngrid = cmap_grid->cmapdata.size();
+ gmx_fio_do_int(fio, ngrid);
gmx_fio_do_int(fio, cmap_grid->grid_spacing);
- ngrid = cmap_grid->ngrid;
- gs = cmap_grid->grid_spacing;
- nelem = gs * gs;
+ int gs = cmap_grid->grid_spacing;
+ int nelem = gs * gs;
if (bRead)
{
- snew(cmap_grid->cmapdata, ngrid);
+ cmap_grid->cmapdata.resize(ngrid);
- for (i = 0; i < cmap_grid->ngrid; i++)
+ for (int i = 0; i < ngrid; i++)
{
- snew(cmap_grid->cmapdata[i].cmap, 4*nelem);
+ cmap_grid->cmapdata[i].cmap.resize(4*nelem);
}
}
- for (i = 0; i < cmap_grid->ngrid; i++)
+ for (int i = 0; i < ngrid; i++)
{
- for (j = 0; j < nelem; j++)
+ for (int j = 0; j < nelem; j++)
{
gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4]);
gmx_fio_do_real(fio, cmap_grid->cmapdata[i].cmap[j*4+1]);
}
else
{
- mtop->ffparams.cmap_grid.ngrid = 0;
mtop->ffparams.cmap_grid.grid_spacing = 0;
- mtop->ffparams.cmap_grid.cmapdata = nullptr;
+ mtop->ffparams.cmap_grid.cmapdata.clear();
}
do_groups(fio, &mtop->groups, bRead, &(mtop->symtab));
{
int i, nelem;
- cmap_grid->ngrid = ngrid;
cmap_grid->grid_spacing = grid_spacing;
nelem = cmap_grid->grid_spacing*cmap_grid->grid_spacing;
- snew(cmap_grid->cmapdata, ngrid);
+ cmap_grid->cmapdata.resize(ngrid);
- for (i = 0; i < cmap_grid->ngrid; i++)
+ for (i = 0; i < ngrid; i++)
{
- snew(cmap_grid->cmapdata[i].cmap, 4*nelem);
+ cmap_grid->cmapdata[i].cmap.resize(4*nelem);
}
}
int i, n;
int ai, aj, ak, al, am;
int a1i, a1j, a1k, a1l, a2i, a2j, a2k, a2l;
- int type, cmapA;
+ int type;
int t11, t21, t31, t12, t22, t32;
int iphi1, ip1m1, ip1p1, ip1p2;
int iphi2, ip2m1, ip2p1, ip2p2;
ivec jt1, dt1_ij, dt1_kj, dt1_lj;
ivec jt2, dt2_ij, dt2_kj, dt2_lj;
- const real *cmapd;
-
int loop_index[4][4] = {
{0, 4, 8, 12},
{1, 5, 9, 13},
am = forceatoms[n++];
/* Which CMAP type is this */
- cmapA = forceparams[type].cmap.cmapA;
- cmapd = cmap_grid->cmapdata[cmapA].cmap;
+ const int cmapA = forceparams[type].cmap.cmapA;
+ const real *cmapd = cmap_grid->cmapdata[cmapA].cmap.data();
/* First torsion */
a1i = ai;
wallcycle needs to be extended to support calling from
multiple threads. */
v = cmap_dihs(nbn, iatoms+nb0,
- idef->iparams, &idef->cmap_grid,
+ idef->iparams, idef->cmap_grid,
x, f, fshift,
pbc, g, lambda[efptFTYPE], &(dvdl[efptFTYPE]),
md, fcd, global_atom_index);
static void bc_cmap(const t_commrec *cr, gmx_cmap_t *cmap_grid)
{
- int i, nelem, ngrid;
-
- block_bc(cr, cmap_grid->ngrid);
+ int ngrid = cmap_grid->cmapdata.size();
+ block_bc(cr, ngrid);
block_bc(cr, cmap_grid->grid_spacing);
- ngrid = cmap_grid->ngrid;
- nelem = cmap_grid->grid_spacing * cmap_grid->grid_spacing;
+ int nelem = cmap_grid->grid_spacing * cmap_grid->grid_spacing;
if (ngrid > 0)
{
- snew_bc(cr, cmap_grid->cmapdata, ngrid);
+ if (!MASTER(cr))
+ {
+ cmap_grid->cmapdata.resize(ngrid);
+ }
- for (i = 0; i < ngrid; i++)
+ for (int i = 0; i < ngrid; i++)
{
- snew_bc(cr, cmap_grid->cmapdata[i].cmap, 4*nelem);
- nblock_bc(cr, 4*nelem, cmap_grid->cmapdata[i].cmap);
+ nblock_abc(cr, 4*nelem, &cmap_grid->cmapdata[i].cmap);
}
}
}
{
fprintf(fp, "%s\n", title);
- for (i = 0; i < cmap_grid->ngrid; i++)
+ for (i = 0; i < static_cast<int>(cmap_grid->cmapdata.size()); i++)
{
idx = -180.0;
fprintf(fp, "%8s %8s %8s %8s\n", "V", "dVdx", "dVdy", "d2dV");
idef->il[f].nr = 0;
idef->il[f].nr_nonperturbed = 0;
}
- idef->cmap_grid.cmapdata = nullptr;
+ idef->cmap_grid = nullptr;
idef->iparams_posres_nalloc = 0;
idef->iparams_fbposres_nalloc = 0;
idef->ilsort = 0;
sfree(idef->il[f].iatoms);
}
- sfree(idef->cmap_grid.cmapdata);
+ delete idef->cmap_grid;
init_idef(idef);
}
return handles;
}
-typedef struct
+struct gmx_cmapdata_t
{
- real *cmap; /* Has length 4*grid_spacing*grid_spacing, */
+ std::vector<real> cmap; /* Has length 4*grid_spacing*grid_spacing, */
/* there are 4 entries for each cmap type (V,dVdx,dVdy,d2dVdxdy) */
-} gmx_cmapdata_t;
+};
-typedef struct gmx_cmap_t
+struct gmx_cmap_t
{
- int ngrid; /* Number of allocated cmap (cmapdata_t ) grids */
- int grid_spacing; /* Grid spacing */
- gmx_cmapdata_t *cmapdata; /* Pointer to grid with actual, pre-interpolated data */
-} gmx_cmap_t;
+ int grid_spacing; /* Grid spacing */
+ std::vector<gmx_cmapdata_t> cmapdata; /* Lists of grids with actual, pre-interpolated data */
+};
/* Struct that holds all force field parameters for the simulated system */
t_functype *functype;
t_iparams *iparams;
real fudgeQQ;
- gmx_cmap_t cmap_grid;
+ gmx_cmap_t *cmap_grid;
t_iparams *iparams_posres, *iparams_fbposres;
int iparams_posres_nalloc, iparams_fbposres_nalloc;
idef->iparams_fbposres = nullptr;
idef->iparams_fbposres_nalloc = 0;
idef->fudgeQQ = ffp->fudgeQQ;
- idef->cmap_grid.ngrid = ffp->cmap_grid.ngrid;
- idef->cmap_grid.grid_spacing = ffp->cmap_grid.grid_spacing;
- if (ffp->cmap_grid.cmapdata)
- {
- snew(idef->cmap_grid.cmapdata, ffp->cmap_grid.ngrid);
- std::copy(ffp->cmap_grid.cmapdata, ffp->cmap_grid.cmapdata + ffp->cmap_grid.ngrid, idef->cmap_grid.cmapdata);
- }
- else
- {
- idef->cmap_grid.cmapdata = nullptr;
- }
+ idef->cmap_grid = new gmx_cmap_t;
+ *idef->cmap_grid = ffp->cmap_grid;
idef->ilsort = ilsortUNKNOWN;
init_block(&top->cgs);
// TODO: Move to ffparams when that is converted to C++
mtop->ffparams.functype.clear();
mtop->ffparams.iparams.clear();
- mtop->ffparams.cmap_grid.ngrid = 0;
mtop->ffparams.cmap_grid.grid_spacing = 0;
- mtop->ffparams.cmap_grid.cmapdata = nullptr;
+ mtop->ffparams.cmap_grid.cmapdata.clear();
mtop->moltype.clear();
mtop->molblock.clear();
{
done_symtab(&symtab);
- for (int i = 0; i < ffparams.cmap_grid.ngrid; i++)
- {
- sfree(ffparams.cmap_grid.cmapdata[i].cmap);
- }
- sfree(ffparams.cmap_grid.cmapdata);
-
moltype.clear();
molblock.clear();
done_atomtypes(&atomtypes);
static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2, real ftol, real abstol)
{
- cmp_int(fp, "cmap ngrid", -1, cmap1->ngrid, cmap2->ngrid);
+ int cmap1_ngrid = (cmap1 ? cmap1->cmapdata.size() : 0);
+ int cmap2_ngrid = (cmap2 ? cmap2->cmapdata.size() : 0);
+
+ cmp_int(fp, "cmap ngrid", -1, cmap1_ngrid, cmap2_ngrid);
+
+ if (cmap1 == nullptr || cmap2 == nullptr)
+ {
+ return;
+ }
+
cmp_int(fp, "cmap grid_spacing", -1, cmap1->grid_spacing, cmap2->grid_spacing);
- if (cmap1->ngrid == cmap2->ngrid &&
+ if (cmap1->cmapdata.size() == cmap2->cmapdata.size() &&
cmap1->grid_spacing == cmap2->grid_spacing)
{
- int g;
-
- for (g = 0; g < cmap1->ngrid; g++)
+ for (size_t g = 0; g < cmap1->cmapdata.size(); g++)
{
int i;
- fprintf(fp, "comparing cmap %d\n", g);
+ fprintf(fp, "comparing cmap %zu\n", g);
for (i = 0; i < 4*cmap1->grid_spacing*cmap1->grid_spacing; i++)
{
id1->iparams[i], id2->iparams[i], ftol, abstol);
}
cmp_real(fp, "fudgeQQ", -1, id1->fudgeQQ, id2->fudgeQQ, ftol, abstol);
- cmp_cmap(fp, &id1->cmap_grid, &id2->cmap_grid, ftol, abstol);
+ cmp_cmap(fp, id1->cmap_grid, id2->cmap_grid, ftol, abstol);
for (i = 0; (i < F_NRE); i++)
{
cmp_ilist(fp, i, &(id1->il[i]), &(id2->il[i]));