Exemple #1
0
void MeshFunction::set_active_element(Element *e) {
    _F_
    element = e;
    mode = e->get_mode();
    refmap->set_active_element(e);
    reset_transform();
}
Exemple #2
0
void RefMap::set_active_element(Element* e)
{
  if (e != element) free();

  ref_map_pss.set_active_element(e);
  quad_2d->set_mode(e->get_mode());
  num_tables = quad_2d->get_num_tables();
  assert(num_tables <= H2D_MAX_TABLES);

  if (e == element) return;
  element = e;

  reset_transform();
  update_cur_node();

  is_const = !element->is_curved() &&
             (element->is_triangle() || is_parallelogram());

  // prepare the shapes and coefficients of the reference map
  int j, k = 0;
  for (unsigned int i = 0; i < e->nvert; i++)
    indices[k++] = ref_map_shapeset.get_vertex_index(i);

  // straight-edged element
  if (e->cm == NULL)
  {
    for (unsigned int i = 0; i < e->nvert; i++)
    {
      lin_coeffs[i][0] = e->vn[i]->x;
      lin_coeffs[i][1] = e->vn[i]->y;
    }
    coeffs = lin_coeffs;
    nc = e->nvert;
  }
  else // curvilinear element - edge and bubble shapes
  {
    int o = e->cm->order;
    for (unsigned int i = 0; i < e->nvert; i++)
      for (j = 2; j <= o; j++)
        indices[k++] = ref_map_shapeset.get_edge_index(i, 0, j);

    if (e->is_quad()) o = H2D_MAKE_QUAD_ORDER(o, o);
    memcpy(indices + k, ref_map_shapeset.get_bubble_indices(o),
           ref_map_shapeset.get_num_bubbles(o) * sizeof(int));

    coeffs = e->cm->coeffs;
    nc = e->cm->nc;
  }

  // calculate the order of the inverse reference map
  if (element->iro_cache == -1 && quad_2d->get_max_order() > 1)
  {
    element->iro_cache = is_const ? 0 : calc_inv_ref_order();
  }
  inv_ref_order = element->iro_cache;

  // constant inverse reference map
  if (is_const) calc_const_inv_ref_map(); else const_jacobian = 0.0;
}
Exemple #3
0
 void Transformable::set_transform(uint64_t idx)
 {
   int son[25];
   int i = 0;
   while (idx > 0)
   {
     son[i++] = (idx - 1) & 7;
     idx = (idx - 1) >> 3;
   }
   reset_transform();
   for (int k = i-1; k >= 0; k--)
     push_transform(son[k]);
 }
Exemple #4
0
void Transformable::set_transform(uint64 idx) {
	_F_
	int son[25];
	int i = 0;

	while (idx > 0) {
		son[i++] = (idx - 1) & SUB_ELEMENT_MASK;
		idx = (idx - 1) >> SUB_ELEMENT_BITS;
	}
	reset_transform();
	for (int k = i - 1; k >= 0; k--)
		push_transform(son[k]);
}
Exemple #5
0
void RefMap::set_active_element(Element *e) {
	_F_
	assert(e != NULL);

	ElementMode3D mode = e->get_mode();

	pss = ref_map_pss[mode];
	pss->set_active_element(e);

	if (e == element) return;
	element = e;

	reset_transform();

	is_const_jacobian = mode == MODE_TETRAHEDRON;

	int nvertices = element->get_num_vertices();

	// prepare the shapes and coefficients of the reference map
	Shapeset *shapeset = this->pss->get_shapeset();
	int i, k = 0;
	for (i = 0; i < nvertices; i++)
		indices[k++] = shapeset->get_vertex_index(i);

	// straight element
	for (int iv = 0; iv < nvertices; iv++)
		vertex[iv] = *mesh->vertices[e->get_vertex(iv)];
	coefs = vertex;
	n_coefs = nvertices;

	// calculate the order of the reference map
	switch (mode) {
		case MODE_TETRAHEDRON: ref_order = Ord3(0); break;
		case MODE_HEXAHEDRON:  ref_order = Ord3(1, 1, 1); break;
		case MODE_PRISM: EXIT(HERMES_ERR_NOT_IMPLEMENTED); break;
	}

	// calculate the order of the inverse reference map
	switch (mode) {
		case MODE_TETRAHEDRON: inv_ref_order = Ord3(0); break;
		case MODE_HEXAHEDRON:  inv_ref_order = Ord3(1, 1, 1); break;
		case MODE_PRISM: EXIT(HERMES_ERR_NOT_IMPLEMENTED); break;
	}

	// constant inverse reference map
	if (this->is_const_jacobian) calc_const_inv_ref_map();
	else const_jacobian = 0.0;
}
Exemple #6
0
Transformable::Transformable() {
	_F_
    memset(stack, 0, sizeof(stack));
	reset_transform();
	element = NULL;
}