Plugins
Loading...
Searching...
No Matches
fract_pf_fv1.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
13
14/*
15 * fract_pf_fv1.h - discretization of the pressure driven flow in porous media
16 * with fractures.
17 */
18#ifndef __H__UG__LIB_DISC__PRESSURE_DRIVEN_FLOW__FRACT_PF_FV1_
19#define __H__UG__LIB_DISC__PRESSURE_DRIVEN_FLOW__FRACT_PF_FV1_
20
21// other ug4 modules
22#include "common/common.h"
23#include "lib_grid/lg_base.h"
25
30#ifdef UG_FOR_LUA
32#endif
33
36
37namespace ug{
38namespace d3f{
39
42
44
57template <typename TDomain>
59 : public IElemDisc<TDomain>
60{
61private:
64
67
70
73
75 static const int dim = base_type::dim;
76
78 static const int low_dim = dim - 1;
79
82
85
88
91
94
96 static const size_t _P_ = 0;
97
98public:
99
102 (
103 const char* functions,
104 const char* subsets,
105 bool condensed_FV
106 );
107
110 (
111 const char* functions,
112 const char* subsets
113 );
114
115//---- Settings: ----
116public:
117
120 {
121 m_spFractManager = fract_manager;
122 }
123
125 void set_density (number density) {m_density = density;}
126 void set_viscosity (number viscosity) {m_viscosity = viscosity;}
128 {
129 m_imConstGravity.set_data (user);
130 }
131 void set_gravity (const std::vector<number>& vGravity)
132 {
134 }
135
138 {
139 m_imPermeability.set_data(user);
140 }
142 {
144 }
145#ifdef UG_FOR_LUA
146 void set_permeability (const char* fctName)
147 {
149 }
151 {
152 set_permeability (make_sp (new LuaUserData<MathMatrix<dim,dim>, dim> (fct)));
153 }
154#endif
155
157
159 {
160 m_spApertureData = user;
161 }
163 {
165 }
166#ifdef UG_FOR_LUA
167 void set_aperture (const char* fctName)
168 {
170 }
172 {
173 set_aperture (make_sp (new LuaUserData<number, dim> (fct)));
174 }
175#endif
176
185#ifdef UG_FOR_LUA
186 void set_fract_permeability (const char* fctName)
187 {
189 }
191 {
193 }
194#endif
195
204#ifdef UG_FOR_LUA
205 void set_orthofract_permeability (const char* fctName)
206 {
208 }
210 {
212 }
213#endif
214
216 bool condensed_FV () {return m_bCondensedFV;}
217
218//---- Local discretization interface: ----
219protected:
220
222 virtual void prepare_setting
223 (
224 const std::vector<LFEID> & vLfeID,
225 bool bNonRegular
226 );
227
228//---- Assembling functions: ----
229protected:
230
231 template <typename TElem, typename TBulkFVGeom>
232 void prepare_element_loop (ReferenceObjectID roid, int si);
233
234 template <typename TElem, typename TBulkFVGeom>
235 void prepare_element (const LocalVector& u, GridObject* elem, ReferenceObjectID roid, const position_type vCornerCoords[]);
236
237 template <typename TElem, typename TBulkFVGeom>
238 void finish_element_loop ();
239
240 template <typename TElem, typename TBulkFVGeom>
241 void ass_JA_elem (LocalMatrix& J, const LocalVector& u, GridObject* elem, const position_type vCornerCoords[]);
242
243 template <typename TElem, typename TBulkFVGeom>
244 void ass_JM_elem (LocalMatrix& J, const LocalVector& u, GridObject* elem, const position_type vCornerCoords[]);
245
246 template <typename TElem, typename TBulkFVGeom>
247 void ass_dA_elem (LocalVector& d, const LocalVector& u, GridObject* elem, const position_type vCornerCoords[]);
248
249 template <typename TElem, typename TBulkFVGeom>
250 void ass_dM_elem (LocalVector& d, const LocalVector& u, GridObject* elem, const position_type vCornerCoords[]);
251
252 template <typename TElem, typename TBulkFVGeom>
253 void ass_rhs_elem (LocalVector& d, GridObject* elem, const position_type vCornerCoords[]);
254
255//---- Assembling functions for bulk medium: ----
256private:
257
258 template <typename TElem, typename TBulkFVGeom>
259 inline void bulk_prepare_element_loop (ReferenceObjectID roid, int si);
260
261 template <typename TElem, typename TBulkFVGeom>
262 inline void bulk_prepare_element (const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
263
264 template <typename TElem, typename TBulkFVGeom>
265 inline void bulk_ass_JA_elem (LocalMatrix& J, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
266
267 template <typename TElem, typename TBulkFVGeom>
268 inline void bulk_ass_dA_elem (LocalVector& d, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
269
270 template <typename TElem, typename TBulkFVGeom>
271 inline void bulk_ass_rhs_elem (LocalVector& d, TElem* elem, const position_type vCornerCoords[]);
272
273//---- Assembling functions for fractures: ----
274private:
275
276 template <typename TElem>
277 inline void fract_prepare_element_loop (ReferenceObjectID roid, int si);
278
279 template <typename TElem>
280 inline void fract_prepare_element (const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
281
282 template <typename TElem>
283 inline void fract_ass_JA_elem (LocalMatrix& J, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
284
285 template <typename TElem>
286 inline void fract_bulk_ass_JA_elem (LocalMatrix& J, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
287
288 template <typename TElem>
289 inline void fract_ass_dA_elem (LocalVector& d, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
290
291 template <typename TElem>
292 inline void fract_bulk_ass_dA_elem (LocalVector& d, const LocalVector& u, TElem* elem, const position_type vCornerCoords[]);
293
294 template <typename TElem>
295 inline void fract_ass_rhs_elem (LocalVector& d, TElem* elem, const position_type vCornerCoords[]);
296
297//---- Computation of the Darcy velocity: ----
298private:
299
300 template<typename TFVGeom>
301 inline void compute_ip_velocity
302 (
303 MathVector<dim>& Vel,
304 size_t ip,
305 const TFVGeom& bulk_geo,
306 number vPressure[]
307 );
308
309 template<typename TFVGeom>
310 inline void compute_J_ip_velocity
311 (
312 MathVector<dim> Vel_p[],
313 size_t ip,
314 const TFVGeom& geo
315 );
316
317//---- Registration of the template functions: ----
318private:
319
322
326 template< typename TElem > void operator() (TElem &)
327 {m_pThis->register_loc_discr_func<TElem> ();}
328 };
329
330 template <typename TElem, typename TBulkFVGeom>
332
333 template <typename TElem>
335
337 (
338 bool condensed
339 );
340
341private:
342
343// Global parameters (for all subdomains):
347
348// Specific parameters for full-dimensional subdomains:
350
351// Specific parameters for low-dimensional subdomains (fractures):
355 /* If OrthoPermeability is not specified, the tensor Permeability parameter is used. */
356// Note that the data for the fracture parameters are kept permanently not in the DataImports, but here:
360 /* The purpose of these pointers is to prevend evaluation of the fracture parameters
361 * in the full-dimensional (non-degenerated) elements.
362 */
363
364// Parameters of the numerical methods of the discretization:
366
369
370private:
372
373// Temporary data used in the assembling
375
388};
389
391
392} // namespace d3f
393} // end namespace ug
394
395#include "fract_pf_fv1_impl.h"
396
397#endif /* __H__UG__LIB_DISC__PRESSURE_DRIVEN_FLOW__FRACT_PF_FV1_ */
398
399/* End of File */
static const size_t maxLayerSideCorners
grid_dim_traits< dim >::side_type side_type
static const size_t maxNumSCVF
TDomain::position_type position_type
static const int dim
FV-discretization of the density-driven flow in porous media with fractures.
Definition fract_pf_fv1.h:60
static const int dim
world ('full') dimension
Definition fract_pf_fv1.h:75
static const size_t _P_
abbreviation for the local function: pressure (the only variable)
Definition fract_pf_fv1.h:96
void finish_element_loop()
finalizes the loop over the elements
Definition fract_pf_fv1_impl.h:152
number m_viscosity
viscosity of the fluid phase
Definition fract_pf_fv1.h:345
TFractFVGeom * m_pFractGeo
FV geometry object of fracture elements.
Definition fract_pf_fv1.h:376
fract_manager_type::side_type side_type
type of the sides of elements (als low-dimensional fracture elements)
Definition fract_pf_fv1.h:90
size_t m_assCo[2 *maxFractSideCorners]
correspondence of the corners of the sides
Definition fract_pf_fv1.h:384
void set_fract_permeability(number val)
Definition fract_pf_fv1.h:181
number m_density
density of the fluid phase
Definition fract_pf_fv1.h:344
SmartPtr< CplUserData< number, dim > > m_spOrthoPermeabilityData
Definition fract_pf_fv1.h:359
MathVector< dim > m_elem_loc_scvf[TFractFVGeom::maxNumSCVF]
local ip's in a fracture element
Definition fract_pf_fv1.h:387
DataImport< number, dim > m_imOrthoPermeability
scalar permeability of the fract.-bulk interface (constant per element)
Definition fract_pf_fv1.h:354
side_type * m_innerFractSide
inner side of the fracture element
Definition fract_pf_fv1.h:378
IElemDisc< TDomain > base_type
base class type
Definition fract_pf_fv1.h:63
DataImport< number, dim > m_imAperture
the fracture width (constant per element)
Definition fract_pf_fv1.h:352
void fract_ass_JA_elem(LocalMatrix &J, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the local stiffness matrix on a fracture element
Definition fract_pf_fv1_impl.h:557
bool condensed_FV()
returns the 'condensed scvf ip' flag
Definition fract_pf_fv1.h:216
void bulk_ass_dA_elem(LocalVector &d, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the stiffness part of the local defect on a bulk element
Definition fract_pf_fv1_impl.h:343
void fract_prepare_element_loop(ReferenceObjectID roid, int si)
prepares the loop over the elements: the 'fracture' version
Definition fract_pf_fv1_impl.h:126
void set_density(number density)
set the Global parameters (for all subdomains):
Definition fract_pf_fv1.h:125
DataImport< MathVector< dim >, dim > m_imConstGravity
gravity (must be constant)
Definition fract_pf_fv1.h:346
static const int low_dim
manifold ('low') dimension
Definition fract_pf_fv1.h:78
void fract_ass_rhs_elem(LocalVector &d, TElem *elem, const position_type vCornerCoords[])
computes the right-hand side due to the gravitation and the mass sources
Definition fract_pf_fv1_impl.h:737
FractPF_FV1< TDomain > this_type
own type
Definition fract_pf_fv1.h:66
void prepare_element(const LocalVector &u, GridObject *elem, ReferenceObjectID roid, const position_type vCornerCoords[])
prepares a given element for assembling
Definition fract_pf_fv1_impl.h:160
void compute_J_ip_velocity(MathVector< dim > Vel_p[], size_t ip, const TFVGeom &geo)
computes the derivatives of the Darcy velocity (not scaled with the permeability)
Definition fract_pf_fv1_impl.h:476
side_type * m_outerFractSide
outer side of the fracture element
Definition fract_pf_fv1.h:379
void set_gravity(const std::vector< number > &vGravity)
Definition fract_pf_fv1.h:131
void register_loc_discr_func_with_fvgeom()
registers the local assembler functions for a given element
Definition fract_pf_fv1_impl.h:778
void fract_prepare_element(const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
prepares a given fracture element for assembling
Definition fract_pf_fv1_impl.h:203
void fract_bulk_ass_JA_elem(LocalMatrix &J, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the local stiffness matrix of the fracture-bulk interaction terms on a fracture element
Definition fract_pf_fv1_impl.h:601
virtual void prepare_setting(const std::vector< LFEID > &vLfeID, bool bNonRegular)
check type of the grid and the trial space
Definition fract_pf_fv1_impl.h:37
domain_traits< dim >::DimElemList AssembleElemList
list of element types for assembling
Definition fract_pf_fv1.h:84
void compute_ip_velocity(MathVector< dim > &Vel, size_t ip, const TFVGeom &bulk_geo, number vPressure[])
computes the pressure part of the Darcy velocity (not scaled with the permeability!...
Definition fract_pf_fv1_impl.h:296
void set_orthofract_permeability(number val)
Definition fract_pf_fv1.h:200
size_t m_numFractCo
number of corners of the fracture side
Definition fract_pf_fv1.h:377
MathVector< dim > m_elem_loc_coe
local coordinates of the mass center of a fracture element
Definition fract_pf_fv1.h:386
void fract_bulk_ass_dA_elem(LocalVector &d, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the stiffness fracture-bulk interaction terms of the local defect on a fracture element
Definition fract_pf_fv1_impl.h:428
void set_permeability(number val)
Definition fract_pf_fv1.h:141
MathVector< dim > m_unitOuterNormal
unit outer normal to the fracture
Definition fract_pf_fv1.h:385
size_t m_outerFractSideIdx
index of the outer side in the ref. elem.
Definition fract_pf_fv1.h:381
void set_aperture(number val)
Definition fract_pf_fv1.h:162
DegeneratedLayerManager< dim > fract_manager_type
fracture manager type
Definition fract_pf_fv1.h:87
SmartPtr< CplUserData< number, dim > > m_spApertureData
Definition fract_pf_fv1.h:357
SmartPtr< fract_manager_type > m_spFractManager
degenerated fracture manager (may be SPNULL)
Definition fract_pf_fv1.h:365
size_t m_innerFractSideIdx
index of the inner side in the ref. elem.
Definition fract_pf_fv1.h:380
void ass_JA_elem(LocalMatrix &J, const LocalVector &u, GridObject *elem, const position_type vCornerCoords[])
computes the local stiffness matrix
Definition fract_pf_fv1_impl.h:494
void prepare_element_loop(ReferenceObjectID roid, int si)
prepares the loop over the elements: checks whether the parameters are set, ...
Definition fract_pf_fv1_impl.h:65
void set_gravity(SmartPtr< CplUserData< MathVector< dim >, dim > > user)
Definition fract_pf_fv1.h:127
void bulk_ass_JA_elem(LocalMatrix &J, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the local stiffness matrix on a bulk element
Definition fract_pf_fv1_impl.h:517
void set_permeability(SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > user)
set permeability for full-dimensional subdomains (bulk medium):
Definition fract_pf_fv1.h:137
void set_aperture(SmartPtr< CplUserData< number, dim > > user)
set Specific parameters for low-dimensional subdomains (fractures):
Definition fract_pf_fv1.h:158
void bulk_prepare_element(const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
prepares a given bulk element for assembling
Definition fract_pf_fv1_impl.h:180
void bulk_ass_rhs_elem(LocalVector &d, TElem *elem, const position_type vCornerCoords[])
computes the right-hand side due to the gravitation and the mass sources
Definition fract_pf_fv1_impl.h:697
SmartPtr< DataExport< number, dim > > m_exBrine
Export parameter for the brine mass fraction.
Definition fract_pf_fv1.h:368
void register_discr_and_param(bool condensed)
calls functions for registering all the provided discretization functions and parameters
Definition fract_pf_fv1_impl.h:811
void ass_dA_elem(LocalVector &d, const LocalVector &u, GridObject *elem, const position_type vCornerCoords[])
computes the stiffness part of the local defect
Definition fract_pf_fv1_impl.h:318
size_t m_innerSideCo[maxFractSideCorners]
inner side corner idx -> elem. corner idx
Definition fract_pf_fv1.h:382
base_type::domain_type domain_type
domain type
Definition fract_pf_fv1.h:69
void set_orthofract_permeability(SmartPtr< CplUserData< number, dim > > user)
Definition fract_pf_fv1.h:196
void ass_dM_elem(LocalVector &d, const LocalVector &u, GridObject *elem, const position_type vCornerCoords[])
computes the mass part of the defect of a time-dependent problem
Definition fract_pf_fv1_impl.h:646
bool m_bCondensedFV
if to use the 'condensed' FV scvf ip's (corrently concerns only the bulk medium)
Definition fract_pf_fv1.h:321
MathVector< dim > m_Gravity
the gravity vector
Definition fract_pf_fv1.h:371
SmartPtr< CplUserData< number, dim > > m_spFractPermeabilityData
Definition fract_pf_fv1.h:358
bool m_isFracture
if the current subset is registered in the fracture manager
Definition fract_pf_fv1.h:374
void set_fract_permeability(SmartPtr< CplUserData< number, dim > > user)
Definition fract_pf_fv1.h:177
void bulk_prepare_element_loop(ReferenceObjectID roid, int si)
prepares the loop over the elements: the 'bulk' version
Definition fract_pf_fv1_impl.h:99
void ass_JM_elem(LocalMatrix &J, const LocalVector &u, GridObject *elem, const position_type vCornerCoords[])
computes the mass matrix of a time-dependent problem
Definition fract_pf_fv1_impl.h:660
void set_viscosity(number viscosity)
Definition fract_pf_fv1.h:126
DataImport< MathMatrix< dim, dim >, dim > m_imPermeability
permeability (constant per element)
Definition fract_pf_fv1.h:349
DimFV1Geometry< low_dim, dim > TFractFVGeom
FV geometry for the fractures.
Definition fract_pf_fv1.h:81
void fract_ass_dA_elem(LocalVector &d, const LocalVector &u, TElem *elem, const position_type vCornerCoords[])
computes the stiffness part of the local defect on a fracture element
Definition fract_pf_fv1_impl.h:387
void set_fract_manager(SmartPtr< fract_manager_type > fract_manager)
sets the fracture manager
Definition fract_pf_fv1.h:119
DataImport< number, dim > m_imFractPermeability
scalar permeability along the fracture (constant per element)
Definition fract_pf_fv1.h:353
size_t m_outerSideCo[maxFractSideCorners]
outer side corner idx -> elem. corner idx
Definition fract_pf_fv1.h:383
base_type::position_type position_type
position type
Definition fract_pf_fv1.h:72
void ass_rhs_elem(LocalVector &d, GridObject *elem, const position_type vCornerCoords[])
computes the right-hand side due to the gravitation and the mass sources
Definition fract_pf_fv1_impl.h:674
void register_loc_discr_func()
registers the local assembler functions for a given element
Definition fract_pf_fv1_impl.h:797
static const size_t maxFractSideCorners
max. number of corners of non-degenerated sides
Definition fract_pf_fv1.h:93
double number
ReferenceObjectID
SmartPtr< T, FreePolicy > make_sp(T *inst)
Definition fract_pf_fv1.h:323
this_type * m_pThis
Definition fract_pf_fv1.h:325
RegisterLocalDiscr(this_type *pThis)
Definition fract_pf_fv1.h:324
void operator()(TElem &)
Definition fract_pf_fv1.h:326