Ejemplo n.º 1
0
void RefMap::force_transform(uint64 sub_idx, Trf *ctm) {
	_F_
	this->sub_idx = sub_idx;
	stack[top] = *ctm;
	ctm = stack + top;
	if (is_const_jacobian) calc_const_inv_ref_map();
}
Ejemplo n.º 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;
}
Ejemplo n.º 3
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;
}