t_cluster_ndx *cluster_index(FILE *fplog, const char *ndx) { t_cluster_ndx *c; int i; snew(c, 1); c->clust = init_index(ndx, &c->grpname); c->maxframe = -1; for (i = 0; (i < c->clust->nra); i++) { c->maxframe = max(c->maxframe, c->clust->a[i]); } fprintf(fplog ? fplog : stdout, "There are %d clusters containing %d structures, highest framenr is %d\n", c->clust->nr, c->clust->nra, c->maxframe); if (debug) { pr_blocka(debug, 0, "clust", c->clust, TRUE); for (i = 0; (i < c->clust->nra); i++) { if ((c->clust->a[i] < 0) || (c->clust->a[i] > c->maxframe)) { gmx_fatal(FARGS, "Range check error for c->clust->a[%d] = %d\n" "should be within 0 and %d", i, c->clust->a[i], c->maxframe+1); } } } c->inv_clust = make_invblocka(c->clust, c->maxframe); return c; }
static void make_shake_sblock_serial(struct gmx_constr *constr, t_idef *idef, t_mdatoms *md) { int i, j, m, ncons; int bstart, bnr; t_blocka sblocks; t_sortblock *sb; t_iatom *iatom; atom_id *inv_sblock; /* Since we are processing the local topology, * the F_CONSTRNC ilist has been concatenated to the F_CONSTR ilist. */ ncons = idef->il[F_CONSTR].nr/3; init_blocka(&sblocks); gen_sblocks(NULL, 0, md->homenr, idef, &sblocks, FALSE); /* bstart=(idef->nodeid > 0) ? blocks->multinr[idef->nodeid-1] : 0; nblocks=blocks->multinr[idef->nodeid] - bstart; */ bstart = 0; constr->nblocks = sblocks.nr; if (debug) { fprintf(debug, "ncons: %d, bstart: %d, nblocks: %d\n", ncons, bstart, constr->nblocks); } /* Calculate block number for each atom */ inv_sblock = make_invblocka(&sblocks, md->nr); done_blocka(&sblocks); /* Store the block number in temp array and * sort the constraints in order of the sblock number * and the atom numbers, really sorting a segment of the array! */ #ifdef DEBUGIDEF pr_idef(fplog, 0, "Before Sort", idef); #endif iatom = idef->il[F_CONSTR].iatoms; snew(sb, ncons); for (i = 0; (i < ncons); i++, iatom += 3) { for (m = 0; (m < 3); m++) { sb[i].iatom[m] = iatom[m]; } sb[i].blocknr = inv_sblock[iatom[1]]; } /* Now sort the blocks */ if (debug) { pr_sortblock(debug, "Before sorting", ncons, sb); fprintf(debug, "Going to sort constraints\n"); } qsort(sb, ncons, (size_t)sizeof(*sb), pcomp); if (debug) { pr_sortblock(debug, "After sorting", ncons, sb); } iatom = idef->il[F_CONSTR].iatoms; for (i = 0; (i < ncons); i++, iatom += 3) { for (m = 0; (m < 3); m++) { iatom[m] = sb[i].iatom[m]; } } #ifdef DEBUGIDEF pr_idef(fplog, 0, "After Sort", idef); #endif j = 0; snew(constr->sblock, constr->nblocks+1); bnr = -2; for (i = 0; (i < ncons); i++) { if (sb[i].blocknr != bnr) { bnr = sb[i].blocknr; constr->sblock[j++] = 3*i; } } /* Last block... */ constr->sblock[j++] = 3*ncons; if (j != (constr->nblocks+1)) { fprintf(stderr, "bstart: %d\n", bstart); fprintf(stderr, "j: %d, nblocks: %d, ncons: %d\n", j, constr->nblocks, ncons); for (i = 0; (i < ncons); i++) { fprintf(stderr, "i: %5d sb[i].blocknr: %5u\n", i, sb[i].blocknr); } for (j = 0; (j <= constr->nblocks); j++) { fprintf(stderr, "sblock[%3d]=%5d\n", j, (int)constr->sblock[j]); } gmx_fatal(FARGS, "DEATH HORROR: " "sblocks does not match idef->il[F_CONSTR]"); } sfree(sb); sfree(inv_sblock); }