void init_top(t_topology *top) { top->name = NULL; init_atom(&(top->atoms)); init_atomtypes(&(top->atomtypes)); init_block(&top->cgs); init_block(&top->mols); init_blocka(&top->excls); open_symtab(&top->symtab); }
void init_molinfo(t_molinfo *mol) { mol->nrexcl = 0; mol->excl_set = FALSE; mol->bProcessed = FALSE; init_plist(mol->plist); init_block(&mol->cgs); init_block(&mol->mols); init_blocka(&mol->excls); init_atom(&mol->atoms); }
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); }
static void gen_local_top(const gmx_mtop_t *mtop,const t_inputrec *ir, gmx_bool bMergeConstr, gmx_localtop_t *top) { int mb,srcnr,destnr,ftype,ftype_dest,mt,natoms,mol,nposre_old; gmx_molblock_t *molb; gmx_moltype_t *molt; const gmx_ffparams_t *ffp; t_idef *idef; real *qA,*qB; gmx_mtop_atomloop_all_t aloop; int ag; t_atom *atom; top->atomtypes = mtop->atomtypes; ffp = &mtop->ffparams; idef = &top->idef; idef->ntypes = ffp->ntypes; idef->atnr = ffp->atnr; idef->functype = ffp->functype; idef->iparams = ffp->iparams; idef->iparams_posres = NULL; idef->iparams_posres_nalloc = 0; idef->fudgeQQ = ffp->fudgeQQ; idef->cmap_grid = ffp->cmap_grid; idef->ilsort = ilsortUNKNOWN; init_block(&top->cgs); init_blocka(&top->excls); for(ftype=0; ftype<F_NRE; ftype++) { idef->il[ftype].nr = 0; idef->il[ftype].nalloc = 0; idef->il[ftype].iatoms = NULL; } natoms = 0; for(mb=0; mb<mtop->nmolblock; mb++) { molb = &mtop->molblock[mb]; molt = &mtop->moltype[molb->type]; srcnr = molt->atoms.nr; destnr = natoms; blockcat(&top->cgs,&molt->cgs,molb->nmol,destnr,srcnr); blockacat(&top->excls,&molt->excls,molb->nmol,destnr,srcnr); nposre_old = idef->il[F_POSRES].nr; for(ftype=0; ftype<F_NRE; ftype++) { if (bMergeConstr && ftype == F_CONSTR && molt->ilist[F_CONSTRNC].nr > 0) { /* Merge all constrains into one ilist. * This simplifies the constraint code. */ for(mol=0; mol<molb->nmol; mol++) { ilistcat(ftype,&idef->il[F_CONSTR],&molt->ilist[F_CONSTR], 1,destnr+mol*srcnr,srcnr); ilistcat(ftype,&idef->il[F_CONSTR],&molt->ilist[F_CONSTRNC], 1,destnr+mol*srcnr,srcnr); } } else if (!(bMergeConstr && ftype == F_CONSTRNC)) { ilistcat(ftype,&idef->il[ftype],&molt->ilist[ftype], molb->nmol,destnr,srcnr); } } if (idef->il[F_POSRES].nr > nposre_old) { set_posres_params(idef,molb,nposre_old/2,natoms); } natoms += molb->nmol*srcnr; } if (ir == NULL) { top->idef.ilsort = ilsortUNKNOWN; } else { if (ir->efep != efepNO && gmx_mtop_bondeds_free_energy(mtop)) { snew(qA,mtop->natoms); snew(qB,mtop->natoms); aloop = gmx_mtop_atomloop_all_init(mtop); while (gmx_mtop_atomloop_all_next(aloop,&ag,&atom)) { qA[ag] = atom->q; qB[ag] = atom->qB; } gmx_sort_ilist_fe(&top->idef,qA,qB); sfree(qA); sfree(qB); } else { top->idef.ilsort = ilsortNO_FE; } } }
static void gen_local_top(gmx_mtop_t *mtop,t_inputrec *ir, gmx_localtop_t *top) { int mb,srcnr,destnr,ftype,mt,natoms,nposre_old; gmx_molblock_t *molb; gmx_moltype_t *molt; gmx_ffparams_t *ffp; t_idef *idef; top->atomtypes = mtop->atomtypes; ffp = &mtop->ffparams; idef = &top->idef; idef->ntypes = ffp->ntypes; idef->atnr = ffp->atnr; idef->functype = ffp->functype; idef->iparams = ffp->iparams; idef->iparams_posres = NULL; idef->iparams_posres_nalloc = 0; idef->fudgeQQ = ffp->fudgeQQ; idef->ilsort = ilsortUNKNOWN; init_block(&top->cgs); init_blocka(&top->excls); for(ftype=0; ftype<F_NRE; ftype++) { idef->il[ftype].nr = 0; idef->il[ftype].nalloc = 0; idef->il[ftype].iatoms = NULL; } natoms = 0; for(mb=0; mb<mtop->nmolblock; mb++) { molb = &mtop->molblock[mb]; molt = &mtop->moltype[molb->type]; srcnr = molt->atoms.nr; destnr = natoms; blockcat(&top->cgs,&molt->cgs,molb->nmol,destnr,srcnr); blockacat(&top->excls,&molt->excls,molb->nmol,destnr,srcnr); nposre_old = idef->il[F_POSRES].nr; for(ftype=0; ftype<F_NRE; ftype++) { ilistcat(ftype,&idef->il[ftype],&molt->ilist[ftype],molb->nmol, destnr,srcnr); } if (idef->il[F_POSRES].nr > nposre_old) { set_posres_params(idef,molb,nposre_old/2,natoms); } natoms += molb->nmol*srcnr; } if (ir == NULL) { top->idef.ilsort = ilsortUNKNOWN; } else { if (ir->efep != efepNO && gmx_mtop_bondeds_free_energy(mtop)) { gmx_sort_ilist_fe(&top->idef); } else { top->idef.ilsort = ilsortNO_FE; } } }