void interval_set_element_iter_4_discrete_types()
{
    typedef IntervalSet<T> IntervalSetT;
    typedef typename IntervalSetT::interval_type IntervalT;
    typedef std::vector<T> VectorT;

    IntervalSetT set_a;
    set_a.add(I_I(1,3)).add(I_I(6,7));

    VectorT vec(5), cev(5);
    vec[0]=MK_v(1);vec[1]=MK_v(2);vec[2]=MK_v(3);vec[3]=MK_v(6);vec[4]=MK_v(7);
    cev[0]=MK_v(7);cev[1]=MK_v(6);cev[2]=MK_v(3);cev[3]=MK_v(2);cev[4]=MK_v(1);

    VectorT dest;
    std::copy(elements_begin(set_a), elements_end(set_a), std::back_inserter(dest));
    BOOST_CHECK_EQUAL( vec == dest, true );

    dest.clear();
    std::copy(elements_rbegin(set_a), elements_rend(set_a), std::back_inserter(dest));
    BOOST_CHECK_EQUAL( cev == dest, true );

    dest.clear();
    std::reverse_copy(elements_begin(set_a), elements_end(set_a), std::back_inserter(dest));
    BOOST_CHECK_EQUAL( cev == dest, true );

    dest.clear();
    std::reverse_copy(elements_rbegin(set_a), elements_rend(set_a), std::back_inserter(dest));
    BOOST_CHECK_EQUAL( vec == dest, true );
}
void LRSplineEvalGrid::testCoefComputation()
{

    std::vector<double> tmpCoefs(dim_*order_v_*order_v_);
    std::vector<double> coefs;
    std::vector<double> tmpPoints(dim_*order_v_*order_v_);
    double *p =&tmpPoints[0];
    int i=0;
//    for(auto it=orig.elements_begin(); it!=orig.elements_end(); it++, i++) {
    for(auto it=elements_begin(); it!=elements_end(); it++, i++) {
	param_float_type ll_x, ll_y, ur_x, ur_y;
	low(*it, ll_x, ll_y);
	high(*it, ur_x, ur_y);
	double ll[2];
	ll[0] = ll_x;
	ll[1] = ll_y;
	double ur[2];
	ur[0] = ur_x;
	ur[1] = ur_y;
	int index = i;
//	knotIntervals.push_back(KnotInterval(ll, ur, index));
	evaluateGrid(*it, &tmpPoints[0]);
	computeBezCoefs(dim_, &tmpPoints[0], order_u_, order_v_, &tmpCoefs[0]);
//	coefficients.insert(coefficients.end(), tmpCoefs.begin(), tmpCoefs.end());
	coefs.insert(coefs.end(), tmpCoefs.begin(), tmpCoefs.end());
	// element_boundaries.push_back(ll_x);
	// element_boundaries.push_back(ll_y);
	// element_boundaries.push_back(ur_x);
	// element_boundaries.push_back(ur_y);
    }
//    m_knotSearcher.reset(new KnotIntervalSearcher(knotIntervals, glm::ivec2(128, 128)));
    // m_patchesU = 10;
    // m_patchesV = 10;
    // init(&element_boundaries[0], &coefficients[0]);
    std::cout << "Done with testCoefComputation()." << std::endl;
}
bool UnstructuredMesh::contract ()
{
  LOG_SCOPE ("contract()", "Mesh");

  // Flag indicating if this call actually changes the mesh
  bool mesh_changed = false;

  element_iterator in        = elements_begin();
  const element_iterator end = elements_end();

#ifdef DEBUG
  for ( ; in != end; ++in)
    if (*in != libmesh_nullptr)
      {
        Elem * el = *in;
        libmesh_assert(el->active() || el->subactive() || el->ancestor());
      }
  in = elements_begin();
#endif

  // Loop over the elements.
  for ( ; in != end; ++in)
    if (*in != libmesh_nullptr)
      {
        Elem * el = *in;

        // Delete all the subactive ones
        if (el->subactive())
          {
            // No level-0 element should be subactive.
            // Note that we CAN'T test elem->level(), as that
            // touches elem->parent()->dim(), and elem->parent()
            // might have already been deleted!
            libmesh_assert(el->parent());

            // Delete the element
            // This just sets a pointer to NULL, and doesn't
            // invalidate any iterators
            this->delete_elem(el);

            // the mesh has certainly changed
            mesh_changed = true;
          }
        else
          {
            // Compress all the active ones
            if (el->active())
              el->contract();
            else
              libmesh_assert (el->ancestor());
          }
      }

  // Strip any newly-created NULL voids out of the element array
  this->renumber_nodes_and_elements();

  // FIXME: Need to understand why deleting subactive children
  // invalidates the point locator.  For now we will clear it explicitly
  this->clear_point_locator();

  return mesh_changed;
}