36 static const int dim = TDomain::dim;
43 if (dLayerManager == NULL)
return;
46 std::vector<size_t> ind;
49 for (
size_t ss_grp_i = 0; ss_grp_i < dLayerManager->
subset_grp().size (); ss_grp_i++)
51 size_t si = dLayerManager->
subset_grp() [ss_grp_i];
52 t_elem_iter e_end = dd->template end<element_type> (si);
53 for (t_elem_iter e_iter = dd->template begin<element_type> (si);
54 e_iter != e_end; ++e_iter)
57 size_t n_co, inner_side_idx, outer_side_idx;
58 size_t inner_side_corners [maxLayerSideCorners];
59 size_t outer_side_corners [maxLayerSideCorners];
60 side_type * inner_side, * outer_side;
61 size_t ass_co [maxLayerSideCorners];
65 inner_side, inner_side_idx, inner_side_corners,
66 outer_side, outer_side_idx, outer_side_corners, ass_co);
71 size_t n_side_co = ref_elem.
num (dim - 1, outer_side_idx, 0);
72 Vertex * side_vert [maxLayerSideCorners];
73 for (
size_t co = 0; co < n_side_co; co++)
74 side_vert [co] = elem->vertex (ref_elem.
id (dim - 1, outer_side_idx, 0, co));
77 const typename TDomain::position_accessor_type & aaPos = domain->position_accessor();
81 for (
size_t co = 0; co < n_side_co; ++co)
82 vSideCoords [co] = aaPos [side_vert [co]];
83 ElementNormal<dim> (sideRoid, outer_normal, vSideCoords);
84 if ((outer_normal_norm =
VecLength (outer_normal)) < 1e-32)
85 UG_THROW (
"Cannot get the unit normal to a fracture.");
88 UG_ASSERT (n_side_co >= 2,
"To few corners of a side: 1d?");
91 for (
size_t i = 0; i < n_side_co; i++)
92 for (
size_t j = i + 1; j < n_side_co; j++)
93 if (min_edge > (t =
VecDistanceSq (vSideCoords[i], vSideCoords[j])))
95 if ((min_edge = std::sqrt (min_edge)) < 1e-32)
96 UG_THROW (
"Too short edges in the element!");
99 outer_normal *= step * min_edge / outer_normal_norm;
100 for (
size_t co = 0; co < n_side_co; ++co)
102 dd->inner_algebra_indices (side_vert [co], ind);
103 for(
size_t i = 0; i < ind.size (); i++)
104 vPositions [ind[i]].first += outer_normal;
125 static const int dim = TDomain::dim;
128 for (
size_t fct = 0; fct < dd->num_fct(); fct++)
130 UG_THROW (
"FractOrderLexForDofDist: Lex. order for fract. domains implemented for LagrangeP1 only!");
133 std::vector<typename std::pair<MathVector<TDomain::dim>,
size_t> > vPositions;
134 ExtractPositions<TDomain> (domain, dd, vPositions);
140 std::vector<size_t> vNewIndex (dd->num_indices());
141 ComputeLexicographicOrder<TDomain::dim> (vNewIndex, vPositions);
144 dd->permute_indices (vNewIndex);
void get_layer_sides(element_type *elem, size_t &num_fract_co, side_type *&inner_side, size_t &inner_side_idx, size_t inner_side_corners[], side_type *&outer_side, size_t &outer_side_idx, size_t outer_side_corners[], size_t ass_co[]=NULL)
void FractOrderLex(ApproximationSpace< TDomain > &approxSpace, DegeneratedLayerManager< TDomain::dim > *dLayerManager, number step)
orders the all DofDistributions of the ApproximationSpace using lexicographic order
Definition fract_lexorder_impl.h:150
void CorrectFractPositions(ConstSmartPtr< TDomain > domain, SmartPtr< DoFDistribution > dd, std::vector< typename std::pair< MathVector< TDomain::dim >, size_t > > &vPositions, DegeneratedLayerManager< TDomain::dim > *dLayerManager, number step)
Definition fract_lexorder_impl.h:28
void FractOrderLexForDofDist(SmartPtr< DoFDistribution > dd, ConstSmartPtr< TDomain > domain, DegeneratedLayerManager< TDomain::dim > *dLayerManager, number step)
orders a dof distribution using lexicographic order
Definition fract_lexorder_impl.h:117