Plugins
Loading...
Searching...
No Matches
fract_eval_impl.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Gesellschaft fuer Anlagen- und Reaktorsicherheit gGmbH
3 * SPDX-License-Identifier: EUPL-1.2
4 * SPDX-FileContributor: Dmitry Logashenko
5 * SPDX-FileContributor: Goethe Universität Frankfurt
6 * SPDX-FileType: SOURCE
7 *
8 * This file is part of d3f++.
9 * d3f++ is an extension for UG4. Licensing information and citation requirements of UG4 are provided in LICENSES/UG4-LGPL_2.1
10 */
11/*
12 * Implementation of the evaluation of values of functions at fractures.
13 */
14
15namespace ug {
16namespace d3f {
17
21template <typename TGridFunc>
23(
24 SmartPtr<grid_func_type> spGridFunc,
25 const char * cmp_name,
26 SmartPtr<deg_layer_mngr_type> spDegLayerMngr,
27 const position_type & point_0,
28 const position_type & point_1
29)
30: m_spGridFunc (spGridFunc), m_spDegLayerMngr (spDegLayerMngr),
31 m_point_0 (point_0), m_point_1 (point_1)
32{
33 init_and_check (cmp_name);
34}
35
36#ifdef UG_FOR_LUA
40template <typename TGridFunc>
42(
43 SmartPtr<grid_func_type> spGridFunc,
44 const char * cmp_name,
45 SmartPtr<deg_layer_mngr_type> spDegLayerMngr,
46 const std::vector<number> & point_0,
47 const std::vector<number> & point_1
48)
49: m_spGridFunc (spGridFunc), m_spDegLayerMngr (spDegLayerMngr)
50{
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++)
54 {
55 m_point_0 [i] = point_0 [i];
56 m_point_1 [i] = point_1 [i];
57 }
58
59 init_and_check (cmp_name);
60}
61#endif
62
66template <typename TGridFunc>
68(
69 const char * cmp_name
70)
71{
72// check the data
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.");
77
78// get the component
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 << "'.");
82
83// local the finite element id
84 m_lfeID = m_spGridFunc->local_finite_element_id (m_fct);
85}
86
90template <typename TGridFunc>
92(
93 element_type * elem,
94 Grid & grid,
96 position_type & intersection,
97 size_t & num_fract_co,
98 side_type * & inner_side,
99 size_t inner_side_corners [],
100 size_t ass_co []
101)
102{
103 side_type * outer_side;
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);
108
109 MathVector<dim> dir;
110 number lambda_min, lambda_max;
111 VecSubtract (dir, m_point_1, m_point_0);
112 if (RayElementIntersection (lambda_min, lambda_max, m_point_0, dir, inner_side, grid, aaPos))
113 {
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)
117 return false; // not inside the segment
118 intersection = m_point_0;
119 VecScaleAppend (intersection, lambda_min, dir);
120 return true;
121 }
122
123 return false;
124}
125
129template <typename TGridFunc>
131(
132 side_type * side,
133 size_t num_co,
134 position_accessor_type & aaPos,
135 position_type & global,
136 MathVector<dim-1> & local
137)
138{
139 position_type corners [maxLayerSideCorners];
140 for (size_t i = 0; i < num_co; i++)
141 corners [i] = aaPos [side->vertex (i)];
142
143 DimReferenceMapping<dim-1, dim> & rmap
144 = ReferenceMappingProvider::get<dim-1, dim> (side->reference_object_id (), corners);
145 rmap.global_to_local (local, global);
146}
147
151template <typename TGridFunc>
153(
154 element_type * elem,
155 side_type * side,
156 size_t num_fract_co,
157 size_t inner_side_corners [],
158 size_t ass_co [],
159 MathVector<dim-1> & local,
160 number & inner_val,
161 number & outer_val
162)
163{
164 const ReferenceObjectID roid = side->reference_object_id ();
165 const LocalShapeFunctionSet<dim-1>& r_trial_space =
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.");
171
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++)
175 {
176 size_t inner_co = inner_side_corners [side_co];
177 size_t outer_co = ass_co [inner_co];
178
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];
185 }
186}
187
191template <typename TGridFunc>
193(
194 const side_type * side,
195 const position_type & intersection,
196 number inner_val,
197 number outer_val
198)
199{
200 for (size_t i = 0; i < m_values.size (); i++)
201 {
202 t_fract_pnt_data & data = m_values [i];
203 if (data.face == side)
204 {
205 if (data.closed)
206 UG_THROW ("FractGFEval: More than 2 fracture sides!");
207 data.side_val[1] = outer_val;
208 data.closed = true;
209 return;
210 }
211 }
212 m_values.push_back (t_fract_pnt_data (side, intersection, inner_val, outer_val));
213}
214
218template <typename TGridFunc>
220{
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!");
224}
225
229template <typename TGridFunc>
231{
232 typedef typename grid_func_type::template dim_traits<dim>::const_iterator t_elem_iter;
233
234 Grid & grid = (Grid &) * (m_spGridFunc->domain()->grid ());
235 position_accessor_type & aaPos = m_spGridFunc->domain()->position_accessor ();
236
237 m_values.clear ();
238 for (size_t i_si = 0; i_si < m_spDegLayerMngr->num_subsets (); i_si++)
239 {
240 int si = m_spDegLayerMngr->subset (i_si);
241 t_elem_iter iter_end = m_spGridFunc->template end<element_type> (si);
242
243 for (t_elem_iter iter = m_spGridFunc->template begin<element_type> (si); iter != iter_end; ++iter)
244 {
245 element_type * elem = *iter;
246 side_type * side;
247 position_type intersection;
248 size_t num_fract_co, inner_side_corners [maxLayerSideCorners], ass_co [2 * maxLayerSideCorners];
249
250 if (! is_intersected (elem, grid, aaPos, intersection, num_fract_co, side, inner_side_corners, ass_co))
251 continue;
252
253 MathVector<dim-1> local;
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);
257
258 append_values (side, intersection, inner_val, outer_val);
259 }
260 }
261
262 check_values ();
263}
264
265template <typename TGridFunc>
267(
268 std::ostream & out,
269 const char * inner_sep,
270 const char * outer_sep
271) const
272{
273 for (size_t k = 0; k < num_intersections (); k++)
274 {
275 out << outer_sep;
276 position_type pos = position (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);
282 }
283}
284
285} // namespace d3f
286} // end namespace ug
287
288/* End of File */
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
SmartPtr< TGrid > grid()
#define UG_THROW(msg)
double number
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)
ReferenceObjectID
const number SMALL
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