21template <
typename TGr
idFunc>
25 const char * cmp_name,
30: m_spGridFunc (spGridFunc), m_spDegLayerMngr (spDegLayerMngr),
31 m_point_0 (point_0), m_point_1 (point_1)
40template <
typename TGr
idFunc>
44 const char * cmp_name,
46 const std::vector<number> & point_0,
47 const std::vector<number> & point_1
49: m_spGridFunc (spGridFunc), m_spDegLayerMngr (spDegLayerMngr)
51 if (point_0.size () !=
dim || point_1.size () !=
dim)
52 UG_THROW (
"FractGFEval: Dimension mismatch of the coordinates");
53 for (
size_t i = 0; i <
dim; i++)
66template <
typename TGr
idFunc>
73 if (m_spGridFunc.invalid ())
74 UG_THROW (
"FractGFEval: No grid function specified.");
75 if (m_spDegLayerMngr.invalid ())
76 UG_THROW (
"FractGFEval: No fracture manager specified.");
79 m_fct = m_spGridFunc->fct_id_by_name (cmp_name);
80 if (m_fct >= m_spGridFunc->num_fct ())
81 UG_THROW (
"FractGFEval: Function space does not contain a function with name '" << cmp_name <<
"'.");
84 m_lfeID = m_spGridFunc->local_finite_element_id (m_fct);
90template <
typename TGr
idFunc>
97 size_t & num_fract_co,
99 size_t inner_side_corners [],
104 size_t inner_side_idx, outer_side_idx, outer_side_corners [maxLayerSideCorners];
105 m_spDegLayerMngr->get_layer_sides (elem, num_fract_co,
106 inner_side, inner_side_idx, inner_side_corners,
107 outer_side, outer_side_idx, outer_side_corners, ass_co);
110 number lambda_min, lambda_max;
114 if (std::fabs (lambda_max - lambda_min) >
SMALL)
115 UG_THROW (
"FractGFEval: The line lyes directly in the fracture!");
116 if (lambda_min < 0 || lambda_max > 1)
118 intersection = m_point_0;
129template <
typename TGr
idFunc>
140 for (
size_t i = 0; i < num_co; i++)
141 corners [i] = aaPos [side->vertex (i)];
151template <
typename TGr
idFunc>
157 size_t inner_side_corners [],
166 LocalFiniteElementProvider::get<dim-1> (roid, m_lfeID);
167 std::vector<number> shape (maxLayerSideCorners);
168 r_trial_space.shapes (shape, local);
169 if (shape.size () != num_fract_co)
170 UG_THROW (
"FractGFEval: Illegal number of shapes.");
172 inner_val = outer_val = 0;
173 std::vector<DoFIndex> inner_ind (1), outer_ind (1);
174 for (
size_t side_co = 0; side_co < num_fract_co; side_co++)
176 size_t inner_co = inner_side_corners [side_co];
177 size_t outer_co = ass_co [inner_co];
179 m_spGridFunc->dof_indices (elem->vertex (inner_co), m_fct, inner_ind);
180 m_spGridFunc->dof_indices (elem->vertex (outer_co), m_fct, outer_ind);
181 if (inner_ind.size () != 1 || outer_ind.size () != 1)
182 UG_THROW (
"FractGFEval: A non-scalar function specified.");
183 inner_val +=
DoFRef (*m_spGridFunc, inner_ind[0]) * shape [side_co];
184 outer_val +=
DoFRef (*m_spGridFunc, outer_ind[0]) * shape [side_co];
191template <
typename TGr
idFunc>
200 for (
size_t i = 0; i < m_values.size (); i++)
203 if (data.
face == side)
206 UG_THROW (
"FractGFEval: More than 2 fracture sides!");
212 m_values.push_back (
t_fract_pnt_data (side, intersection, inner_val, outer_val));
218template <
typename TGr
idFunc>
221 for (
size_t i = 0; i < m_values.size (); i++)
222 if (! m_values[i].closed)
223 UG_THROW (
"FractGFEval: Less than 2 fracture sides!");
229template <
typename TGr
idFunc>
232 typedef typename grid_func_type::template dim_traits<dim>::const_iterator t_elem_iter;
234 Grid &
grid = (
Grid &) * (m_spGridFunc->domain()->grid ());
238 for (
size_t i_si = 0; i_si < m_spDegLayerMngr->num_subsets (); i_si++)
240 int si = m_spDegLayerMngr->subset (i_si);
241 t_elem_iter iter_end = m_spGridFunc->template end<element_type> (si);
243 for (t_elem_iter iter = m_spGridFunc->template begin<element_type> (si); iter != iter_end; ++iter)
248 size_t num_fract_co, inner_side_corners [maxLayerSideCorners], ass_co [2 * maxLayerSideCorners];
250 if (! is_intersected (elem,
grid, aaPos, intersection, num_fract_co, side, inner_side_corners, ass_co))
254 number inner_val, outer_val;
255 get_local_coord (side, num_fract_co, aaPos, intersection, local);
256 get_co_values (elem, side, num_fract_co, inner_side_corners, ass_co, local, inner_val, outer_val);
258 append_values (side, intersection, inner_val, outer_val);
265template <
typename TGr
idFunc>
269 const char * inner_sep,
270 const char * outer_sep
273 for (
size_t k = 0; k < num_intersections (); k++)
277 for (
size_t i = 0; i < dim; i++)
278 out << pos[i] << inner_sep;
279 out << fract_value (k)
280 << inner_sep << side_value_1 (k)
281 << inner_sep << side_value_2 (k);
virtual void global_to_local(MathVector< dim > &locPos, const MathVector< worldDim > &globPos, const size_t maxIter=1000, const number tol=1e-10) const=0
static DimReferenceMapping< TDim, TWorldDim > & get(ReferenceObjectID roid)
void get_local_coord(side_type *side, size_t num_co, position_accessor_type &aaPos, position_type &global, MathVector< dim-1 > &local)
gets the local coordinates of the intersection
Definition fract_eval_impl.h:131
static const int dim
world dimension
Definition fract_eval.h:50
void check_values()
checks whether all the values are initialized
Definition fract_eval_impl.h:219
void init_and_check(const char *cmp_name)
completes the initialization and checks the data
Definition fract_eval_impl.h:68
bool is_intersected(element_type *elem, Grid &grid, position_accessor_type &aaPos, position_type &intersection, size_t &num_fract_co, side_type *&inner_side, size_t inner_side_corners[], size_t ass_co[])
checks if the element and finds the intersection point with the inner side
Definition fract_eval_impl.h:92
position_type m_point_0
one point on the line
Definition fract_eval.h:245
void get_co_values(element_type *elem, side_type *side, size_t num_fract_co, size_t inner_side_corners[], size_t ass_co[], MathVector< dim-1 > &local, number &inner_val, number &outer_val)
gets values in the intersected element
Definition fract_eval_impl.h:153
deg_layer_mngr_type::side_type side_type
type of sides of the degenerated elements
Definition fract_eval.h:68
void append_values(const side_type *side, const position_type &intersection, number inner_val, number outer_val)
appends the values into the list
Definition fract_eval_impl.h:193
domain_type::position_type position_type
type of the vectors for positions
Definition fract_eval.h:56
domain_type::position_accessor_type position_accessor_type
type of the position accessor
Definition fract_eval.h:59
void get_all_values()
gets all values in all the intersected elements
Definition fract_eval_impl.h:230
position_type m_point_1
another point on the line
Definition fract_eval.h:246
FractGFEval(SmartPtr< grid_func_type > spGridFunc, const char *cmp_name, SmartPtr< deg_layer_mngr_type > spDegLayerMngr, const position_type &point_0, const position_type &point_1)
class constructor
Definition fract_eval_impl.h:23
deg_layer_mngr_type::element_type element_type
type of the degenerated elements
Definition fract_eval.h:65
void write(std::ostream &out, const char *inner_sep, const char *outer_sep) const
writes all the values into a given stream
Definition fract_eval_impl.h:267
void VecScaleAppend(vector_t &vOut, typename vector_t::value_type s1, const vector_t &v1)
void VecSubtract(vector_t &vOut, const vector_t &v, typename vector_t::value_type s)
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
bool RayElementIntersection(number &sminOut, number &smaxOut, const vector2 &from, const vector2 &dir, Edge *e, Grid &g, Grid::VertexAttachmentAccessor< AVector2 > aaPos, number sml=SMALL)
an auxiliary structure for the computed data
Definition fract_eval.h:80
number side_val[2]
values at the sides of the fractures
Definition fract_eval.h:86
bool closed
if the two side values have been already initialized
Definition fract_eval.h:88
const side_type * face
the inner face of the fracture
Definition fract_eval.h:81