6#ifndef UG4_ADD_RIVER_SSS_H
7#define UG4_ADD_RIVER_SSS_H
12#include "../d3f_sss.h"
29template <
typename TDomain>
32 static const int dim = TDomain::dim;
33 typedef typename TDomain::grid_type
TGrid;
34 typedef typename TGrid::template EdgeAttachmentAccessor<ANumber>
accessor_type;
39 UG_THROW(
"ExfiltrationFlux: Point evaluation not supported. Use element-based evaluation.");
56 Edge* edgeElem =
static_cast<Edge*
>(elem);
58 for (
size_t ip = 0;
ip < nip; ++
ip) {
74 std::vector<std::vector<number>> vvvDeriv[],
77 evaluate<refDim>(vValue, vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
105template <
typename TDomain,
typename TAlgebra>
108 static const int dim = TDomain::dim;
111 typedef typename TDomain::grid_type
TGrid;
112 typedef typename TGrid::template EdgeAttachmentAccessor<ANumber>
accessor_type;
133 .template cast_dynamic<CplUserData<number, dim>>();
150 UG_LOG(
"Initializing River SSS managers...\n");
153 auto river_grid =
m_spRiverU->domain()->grid();
154 const size_t numEdges = river_grid->template num<Edge>();
158 auto iter =
m_spRiverU->template begin<Edge>();
162 for (; iter != end; ++iter, ++i) {
172 number subsurface_pressure = 0.0;
173 if (!
m_spGlobEval->try_evaluate_global(subsurface_pressure, eval_point)) {
180 spSSS->set_edge(edge);
183 std::vector<DoFIndex> ind;
184 m_spRiverU->template dof_indices<Edge>(edge, 0, ind);
191 ssmngr->add_line(spSSS);
203 auto iter =
m_spRiverU->template begin<Edge>();
207 for (; iter != end; ++iter, ++i) {
209 if (!spSSS.valid())
continue;
212 std::vector<DoFIndex> ind;
213 m_spRiverU->template dof_indices<Edge>(edge, 0, ind);
234 const size_t numEdges =
m_spRiverU->domain()->grid()->template num<Edge>();
238 auto river_grid =
m_spRiverU->domain()->grid();
239 for (
auto it =
m_spRiverU->template begin<Edge>(); it !=
m_spRiverU->template end<Edge>(); ++it) {
243 typedef typename TDomain::position_accessor_type t_pos_accessor;
245 line_iterator<TElem, t_pos_accessor, DimFV1Geometry<dim>> t_lin_sss_iter;
247 t_pos_accessor& aaPos = u->domain()->position_accessor();
248 auto&
grid =
static_cast<Grid&
>(*u->domain()->grid());
250 std::vector<MathVector<dim>> vCorner;
257 geo.
update(elem, &vCorner[0], u->domain()->subset_handler().
get());
260 for (
size_t ip = 0; ip < geo.
num_scv(); ip++) {
261 size_t co = geo.
scv(ip).node_id();
263 std::vector<DoFIndex> ind;
264 u->dof_indices(elem, u->fct_id_by_name(
"p"), ind);
268 for (t_lin_sss_iter line(
m_vspSSSManager[0].
get(), elem,
grid, aaPos, geo, co); !line.is_over(); ++line) {
269 auto* line_sss = *line;
270 Edge* river_edge = line_sss->get_edge();
273 const number p_riv = line_sss->intensity();
274 const number matrix_perm = line_sss->matrix_permeability();
275 const number rel_bot_perm = line_sss->relative_bottom_permeability();
279 if (p_sub < p_riv)
continue;
282 const number total_perm = matrix_perm * rel_bot_perm;
298 for (
auto it =
m_spRiverU->template begin<Edge>(); it !=
m_spRiverU->template end<Edge>(); ++it, ++idx) {
303 std::vector<number> global_fluxes(numEdges, 0.0);
307 for (
auto it =
m_spRiverU->template begin<Edge>(); it !=
m_spRiverU->template end<Edge>(); ++it, ++idx) {
320 typedef typename TDomain::position_accessor_type t_pos_accessor;
322 line_iterator<TElem, t_pos_accessor, DimFV1Geometry<dim>> t_lin_sss_iter;
324 t_pos_accessor& aaPos = u->domain()->position_accessor();
325 auto&
grid =
static_cast<Grid&
>(*u->domain()->grid());
327 std::vector<MathVector<dim>> vCorner;
329 for (
auto iter = u->template begin<TElem>(); iter != u->template end<TElem>(); ++iter) {
332 geo.
update(elem, &vCorner[0], u->domain()->subset_handler().
get());
335 for (
size_t i = 0; i < geo.
num_scv() && !found; i++) {
337 if (!line.is_over()) {
parameterString s
Definition Biogas.lua:2
size_t allreduce(const size_t &t, pcl::ReduceOperation op) const
TData & value(size_t s, size_t ip)
void update(GridObject *elem, const MathVector< worldDim > *vCornerCoords, const ISubsetHandler *ish=NULL)
const SCV & scv(size_t i) const
virtual Vertex * vertex(size_t index) const
dim_traits< dim >::grid_base_object element_type
const MathVector< dim > & ip(size_t s, size_t ip) const
Spatial linker that exposes exchange fluxes stored on 1D edges.
Definition add_river_sss.h:30
void eval_and_deriv(number vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, bool bDeriv, int s, std::vector< std::vector< number > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition add_river_sss.h:64
static const int dim
Definition add_river_sss.h:32
TDomain::grid_type TGrid
Definition add_river_sss.h:33
void evaluate(number &value, const MathVector< dim > &globIP, number time, int si) const
Definition add_river_sss.h:38
accessor_type & m_acc
Definition add_river_sss.h:84
ExfiltrationFlux(accessor_type &acc)
Definition add_river_sss.h:36
TGrid::template EdgeAttachmentAccessor< ANumber > accessor_type
Definition add_river_sss.h:34
bool requires_grid_fct() const
Definition add_river_sss.h:81
void evaluate(number vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, const MathMatrix< refDim, dim > *vJT=NULL) const
Retrieves the flux value for a given 1D edge element.
Definition add_river_sss.h:46
Orchestrates the mass exchange between a 1D river and a 3D subsurface.
Definition add_river_sss.h:106
TDomain::grid_type TGrid
Definition add_river_sss.h:111
RiverSSSManager()=default
SmartPtr< CplUserData< number, dim > > m_spExfiltrationFlux
Definition add_river_sss.h:351
number m_density
Definition add_river_sss.h:364
void update_line_sss(number dt)
Updates SSS intensities with current 1D river levels.
Definition add_river_sss.h:201
MathVector< dim > vAcc(Vertex *v) const
Definition add_river_sss.h:346
void set_density(SmartPtr< CplUserData< number, dim > > density)
Definition add_river_sss.h:140
std::vector< SmartPtr< line_sss_type > > m_vspLineSSS
Definition add_river_sss.h:355
number m_gravity
Definition add_river_sss.h:362
SmartPtr< TGridFunction > m_spSubsurfaceU
Definition add_river_sss.h:350
TGrid::template EdgeAttachmentAccessor< ANumber > accessor_type
Definition add_river_sss.h:112
void cache_interface_elements(SmartPtr< TGridFunction > u)
Identifies all 3D cells that contain at least one river segment.
Definition add_river_sss.h:318
SmartPtr< TGridFunction > m_spRiverU
Definition add_river_sss.h:349
static const int dim
Definition add_river_sss.h:108
void init_line_sss()
Creates line SSS objects in the 3D domain for all 1D river edges. Must be called once before the simu...
Definition add_river_sss.h:149
ANumber m_aExchangeFlux
Definition add_river_sss.h:366
SmartPtr< GlobalGridFunctionNumberData< TGridFunction > > m_spGlobEval
Definition add_river_sss.h:348
SmartPtr< CplUserData< number, dim > > m_spDensity
Definition add_river_sss.h:352
TSSSManager::line_sss_type line_sss_type
Definition add_river_sss.h:113
RiverSSSManager(SmartPtr< TGridFunction > riverU, SmartPtr< TGridFunction > ssU)
Constructor.
Definition add_river_sss.h:123
void set_bottom_thickness(number thickness)
Definition add_river_sss.h:138
void set_river_width(number width)
Definition add_river_sss.h:139
void evaluate_exchange_flux(SmartPtr< TGridFunction > u)
Computes the mass-conservative exchange flux [m^2/s] integrated over each river edge.
Definition add_river_sss.h:233
accessor_type m_aaExchangeFlux
Definition add_river_sss.h:367
TGridFunction::element_type TElem
Definition add_river_sss.h:114
SmartPtr< CplUserData< number, dim > > get_qex()
Definition add_river_sss.h:142
std::vector< TElem * > m_interface_elements
Definition add_river_sss.h:357
void push_sss_manager(SmartPtr< TSSSManager > ssmngr)
Definition add_river_sss.h:143
RiverSingularSourcesAndSinks< dim > TSSSManager
Definition add_river_sss.h:110
GridFunction< TDomain, TAlgebra > TGridFunction
Definition add_river_sss.h:109
std::vector< number > m_vflux
Definition add_river_sss.h:356
void set_bottom_permeability(number perm)
Definition add_river_sss.h:137
number m_viscosity
Definition add_river_sss.h:363
number m_bottom_thickness
Definition add_river_sss.h:361
std::vector< SmartPtr< TSSSManager > > m_vspSSSManager
Definition add_river_sss.h:354
number m_width
Definition add_river_sss.h:360
number m_perm
Definition add_river_sss.h:359
Specialization of the optimized SSS manager for river networks.
Definition river_sss.h:357
void CollectCornerCoordinates(int base_object_id, std::vector< typename TDomain::position_type > &vCornerCoordsOut, GridObject &elem, const TDomain &domain, bool clearContainer)
const NullSmartPtr SPNULL
vector_t::value_type VecDistance(const vector_t &v1, const vector_t &v2)
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
SmartPtr< T, FreePolicy > make_sp(T *inst)