void p_graph(FILE *log, const char *title, t_graph *g) { int i, j; const char *cc[egcolNR] = { "W", "G", "B" }; GCHECK(g); fprintf(log, "graph: %s\n", title); fprintf(log, "nnodes: %d\n", g->nnodes); fprintf(log, "nbound: %d\n", g->nbound); fprintf(log, "start: %d\n", g->at_start); fprintf(log, "end: %d\n", g->at_end); fprintf(log, " atom shiftx shifty shiftz C nedg e1 e2 etc.\n"); for (i = 0; (i < g->nnodes); i++) { if (g->nedge[i] > 0) { fprintf(log, "%5d%7d%7d%7d %1s%5d", g->at_start+i+1, g->ishift[g->at_start+i][XX], g->ishift[g->at_start+i][YY], g->ishift[g->at_start+i][ZZ], (g->negc > 0) ? cc[g->egc[i]] : " ", g->nedge[i]); for (j = 0; (j < g->nedge[i]); j++) { fprintf(log, " %5d", g->edge[i][j]+1); } fprintf(log, "\n"); } } fflush(log); }
void done_graph(t_graph *g) { GCHECK(g); if (g->nnodes > 0) { sfree(g->nedge); sfree(g->edge[0]); sfree(g->edge); sfree(g->egc); } sfree(g->ishift); }
void testGetFundamental(TestScriptContext * context) { QVAR(f = 100) QVAR(s = "abc") GVariant v; if(context->getBindingLib()) { v = scriptGetValue(context->getBindingLib(), "f").toFundamental(); GCHECK(fromVariant<int>(v) == 100); v = scriptGetValue(context->getBindingLib(), "s").toFundamental(); GCHECK(v.isEmpty()); } if(context->getBindingApi()) { v = scriptGetValue(context->getBindingApi(), "f").toFundamental(); GCHECK(fromVariant<int>(v) == 100); v = scriptGetValue(context->getBindingApi(), "s").toFundamental(); GCHECK(v.isEmpty()); } }
void shift_x(const t_graph *g, matrix box, const rvec x[], rvec x_s[]) { ivec *is; int g0, g1; int j, tx, ty, tz; GCHECK(g); g0 = g->at_start; g1 = g->at_end; is = g->ishift; for (j = g->at0; j < g0; j++) { copy_rvec(x[j], x_s[j]); } if (g->bScrewPBC) { for (j = g0; (j < g1); j++) { tx = is[j][XX]; ty = is[j][YY]; tz = is[j][ZZ]; if ((tx > 0 && tx % 2 == 1) || (tx < 0 && -tx %2 == 1)) { x_s[j][XX] = x[j][XX] + tx*box[XX][XX]; x_s[j][YY] = box[YY][YY] + box[ZZ][YY] - x[j][YY]; x_s[j][ZZ] = box[ZZ][ZZ] - x[j][ZZ]; } else { x_s[j][XX] = x[j][XX]; } x_s[j][YY] = x[j][YY] + ty*box[YY][YY] + tz*box[ZZ][YY]; x_s[j][ZZ] = x[j][ZZ] + tz*box[ZZ][ZZ]; } } else if (TRICLINIC(box)) { for (j = g0; (j < g1); j++) { tx = is[j][XX]; ty = is[j][YY]; tz = is[j][ZZ]; x_s[j][XX] = x[j][XX]+tx*box[XX][XX]+ty*box[YY][XX]+tz*box[ZZ][XX]; x_s[j][YY] = x[j][YY]+ty*box[YY][YY]+tz*box[ZZ][YY]; x_s[j][ZZ] = x[j][ZZ]+tz*box[ZZ][ZZ]; } } else { for (j = g0; (j < g1); j++) { tx = is[j][XX]; ty = is[j][YY]; tz = is[j][ZZ]; x_s[j][XX] = x[j][XX]+tx*box[XX][XX]; x_s[j][YY] = x[j][YY]+ty*box[YY][YY]; x_s[j][ZZ] = x[j][ZZ]+tz*box[ZZ][ZZ]; } } for (j = g1; j < g->at1; j++) { copy_rvec(x[j], x_s[j]); } }
void mk_mshift(FILE *log, t_graph *g, int ePBC, matrix box, const rvec x[]) { static int nerror_tot = 0; int npbcdim; int ng, nnodes, i; int nW, nG, nB; /* Number of Grey, Black, White */ int fW, fG; /* First of each category */ int nerror = 0; g->bScrewPBC = (ePBC == epbcSCREW); if (ePBC == epbcXY) { npbcdim = 2; } else { npbcdim = 3; } GCHECK(g); /* This puts everything in the central box, that is does not move it * at all. If we return without doing this for a system without bonds * (i.e. only settles) all water molecules are moved to the opposite octant */ for (i = g->at0; (i < g->at1); i++) { g->ishift[i][XX] = g->ishift[i][YY] = g->ishift[i][ZZ] = 0; } if (!g->nbound) { return; } nnodes = g->nnodes; if (nnodes > g->negc) { g->negc = nnodes; srenew(g->egc, g->negc); } memset(g->egc, 0, (size_t)(nnodes*sizeof(g->egc[0]))); nW = g->nbound; nG = 0; nB = 0; fW = 0; /* We even have a loop invariant: * nW+nG+nB == g->nbound */ #ifdef DEBUG2 fprintf(log, "Starting W loop\n"); #endif while (nW > 0) { /* Find the first white, this will allways be a larger * number than before, because no nodes are made white * in the loop */ if ((fW = first_colour(fW, egcolWhite, g, g->egc)) == -1) { gmx_fatal(FARGS, "No WHITE nodes found while nW=%d\n", nW); } /* Make the first white node grey */ g->egc[fW] = egcolGrey; nG++; nW--; /* Initial value for the first grey */ fG = fW; #ifdef DEBUG2 fprintf(log, "Starting G loop (nW=%d, nG=%d, nB=%d, total %d)\n", nW, nG, nB, nW+nG+nB); #endif while (nG > 0) { if ((fG = first_colour(fG, egcolGrey, g, g->egc)) == -1) { gmx_fatal(FARGS, "No GREY nodes found while nG=%d\n", nG); } /* Make the first grey node black */ g->egc[fG] = egcolBlack; nB++; nG--; /* Make all the neighbours of this black node grey * and set their periodicity */ ng = mk_grey(g->egc, g, &fG, npbcdim, box, x, &nerror); /* ng is the number of white nodes made grey */ nG += ng; nW -= ng; } } if (nerror > 0) { nerror_tot++; if (nerror_tot <= 100) { fprintf(stderr, "There were %d inconsistent shifts. Check your topology\n", nerror); if (log) { fprintf(log, "There were %d inconsistent shifts. Check your topology\n", nerror); } } if (nerror_tot == 100) { fprintf(stderr, "Will stop reporting inconsistent shifts\n"); if (log) { fprintf(log, "Will stop reporting inconsistent shifts\n"); } } } }