/*! * \param[out] pos Position data structure to initialize. * \param[in] x Position vector to use. */ void gmx_ana_pos_init_const(gmx_ana_pos_t *pos, rvec x) { gmx_ana_pos_clear(pos); pos->nr = 1; snew(pos->x, 1); snew(pos->v, 1); snew(pos->f, 1); pos->nalloc_x = 1; copy_rvec(x, pos->x[0]); clear_rvec(pos->v[0]); clear_rvec(pos->f[0]); gmx_ana_indexmap_init(&pos->m, NULL, NULL, INDEX_UNKNOWN); }
SelectionData::SelectionData(SelectionTreeElement *elem, const char *selstr) : name_(elem->name()), selectionText_(selstr), rootElement_(*elem), coveredFractionType_(CFRAC_NONE), coveredFraction_(1.0), averageCoveredFraction_(1.0), bDynamic_(false), bDynamicCoveredFraction_(false) { gmx_ana_pos_clear(&rawPositions_); if (elem->child->type == SEL_CONST) { // TODO: This is not exception-safe if any called function throws. gmx_ana_pos_copy(&rawPositions_, elem->child->v.u.p, true); } else { SelectionTreeElementPointer child = elem->child; child->flags &= ~SEL_ALLOCVAL; _gmx_selvalue_setstore(&child->v, &rawPositions_); /* We should also skip any modifiers to determine the dynamic * status. */ while (child->type == SEL_MODIFIER) { child = child->child; if (child->type == SEL_SUBEXPRREF) { child = child->child; /* Because most subexpression elements are created * during compilation, we need to check for them * explicitly here. */ if (child->type == SEL_SUBEXPR) { child = child->child; } } } /* For variable references, we should skip the * SEL_SUBEXPRREF and SEL_SUBEXPR elements. */ if (child->type == SEL_SUBEXPRREF) { child = child->child->child; } bDynamic_ = (child->child->flags & SEL_DYNAMIC); } initCoveredFraction(CFRAC_NONE); }
/*! * \param[in,out] val Value structure to allocate. * \param[in] n Maximum number of values needed. * \returns Zero on success. * * Reserves memory for the values within \p val to store at least \p n values, * of the type specified in the \p val structure. * * If the type is \ref POS_VALUE or \ref GROUP_VALUE, memory is reserved for * the data structures, but no memory is reserved inside these newly allocated * data structures. * Similarly, for \ref STR_VALUE values, the pointers are set to NULL. * For other values, the memory is uninitialized. */ int _gmx_selvalue_reserve(gmx_ana_selvalue_t *val, int n) { int i; if (val->nalloc == -1) { return 0; } if (!val->u.ptr || val->nalloc < n) { switch (val->type) { case INT_VALUE: srenew(val->u.i, n); break; case REAL_VALUE: srenew(val->u.r, n); break; case STR_VALUE: srenew(val->u.s, n); for (i = val->nalloc; i < n; ++i) { val->u.s[i] = NULL; } break; case POS_VALUE: srenew(val->u.p, n); for (i = val->nalloc; i < n; ++i) { gmx_ana_pos_clear(&val->u.p[i]); } break; case GROUP_VALUE: srenew(val->u.g, n); for (i = val->nalloc; i < n; ++i) { gmx_ana_index_clear(&val->u.g[i]); } break; case NO_VALUE: break; } val->nalloc = n; } return 0; }