27template <
typename TGr
idFunction>
30 const char* subsetNames,
44 m_top_tolerance = top_tolerance;
48 std::vector<g_surf_elem_t*> top_faces;
49 for (
size_t i = 0; i < ssGrp.
size (); i++)
52 if (top_grid_level >= 0)
55 top_faces.push_back (*it);
57 for (
int lvl = 0; lvl < (int) sh.
num_levels(); lvl++)
63 top_faces.push_back (t);
66 m_spTopTracerTree->create_tree (top_faces.begin (), top_faces.end ());
70template <
typename TGr
idFunction>
76 m_topTracePoints.
clear ();
81 RayElementIntersections (m_topIntersectionRecords, * (m_spTopTracerTree.get ()), over, up_dir, m_top_tolerance);
89 return m_topTracePoints.size ();
93template <
typename TGr
idFunction>
99 typedef typename domain_type::position_accessor_type position_accessor_type;
100 typedef typename grid_func_type::template traits<Vertex>::const_iterator const_vrt_iter_t;
103 position_accessor_type & aaPos = spRecharge->domain()->position_accessor ();
106 std::vector<DoFIndex> ind (1);
107 const_vrt_iter_t vrtIterEnd = spRecharge->template end<Vertex> ();
108 for (const_vrt_iter_t iter = spRecharge->template begin<Vertex> (); iter != vrtIterEnd; ++iter)
111 spRecharge->inner_dof_indices (vrt, 0, ind);
112 DoFRef (*spRecharge, ind[0]) = simple_smoothed_recharge_at (aaPos[vrt]);
117template <
typename TGr
idFunction>
123 typedef typename domain_type::position_accessor_type position_accessor_type;
124 typedef typename grid_func_type::template traits<Vertex>::const_iterator const_vrt_iter_t;
127 position_accessor_type & aaPos = spRecharge->domain()->position_accessor ();
133 std::vector<DoFIndex> ind (1);
134 const_vrt_iter_t vrtIterEnd = spRecharge->template end<Vertex> ();
135 for (const_vrt_iter_t iter = spRecharge->template begin<Vertex> (); iter != vrtIterEnd; ++iter)
138 spRecharge->inner_dof_indices (vrt, 0, ind);
139 DoFRef (*spRecharge, ind[0]) = smoothed_recharge_at (aaPos[vrt]);
146template <
typename TGr
idFunction>
150 this->prepare_ls_height ();
153 for (
size_t well_i = 0; well_i < m_wells.size (); well_i++)
160 well.
fs_depth = this->get_ls_height_at (well.
x);
163 if (this->ls_depth_is_relative ())
167 if (this->min_top_depth (well.
x, top_depth) == 0)
169 well.
well_depth = std::numeric_limits<number>::max ();
177 if (this->restrict_depth () && well.
fs_depth != - std::numeric_limits<number>::max ()
185 std::vector<number> fs_depth_vec (m_wells.size ());
186 std::vector<number> well_depth_vec (m_wells.size ());
187 for (
size_t well_i = 0; well_i < m_wells.size (); well_i++)
190 fs_depth_vec [well_i] = well.
fs_depth;
193 std::vector<number> red_fs_depth_vec;
194 std::vector<number> red_well_depth_vec;
197 if (red_fs_depth_vec.size () != fs_depth_vec.size () || red_well_depth_vec.size () != well_depth_vec.size ())
198 UG_THROW (
"VertexWellRecharge: Failed to reduce the depth vectors.");
199 for (
size_t well_i = 0; well_i < m_wells.size (); well_i++)
202 well.
fs_depth = red_fs_depth_vec [well_i];
203 well.
well_depth = red_well_depth_vec [well_i];
209template <
typename TGr
idFunction>
217 for (
size_t i = 0; i < dim-1; i++) xc[i] = x[i];
221 for (
size_t well_i = 0; well_i < m_wells.size (); well_i++)
226 if (dist > this->smooth_len ())
231 if (fs_depth == - std::numeric_limits<number>::max ())
236 if (well_depth == std::numeric_limits<number>::max ())
240 number well_q = this->object_recharge (well_depth, fs_depth, this->m_width)
241 * cone_mollifier<this_type::mol_dim> (dist, this->smooth_len());
242 if (this->no_inflow () && well_q >= 0)
250template <
typename TGr
idFunction>
262template <
typename TGr
idFunction>
270 Grid & riverGrid = m_spRiverNetwork->grid ();
272 EdgeConstIterator iterEnd = riverGrid.template end<Edge> ();
273 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
274 m_aaRiverWidth[*iter] = riverWidth;
278template <
typename TGr
idFunction>
290 EdgeConstIterator iterEnd = SH.template end<Edge> (ssi);
291 for (EdgeConstIterator iter = SH.template begin<Edge> (ssi); iter != iterEnd; ++iter)
292 m_aaRiverWidth[*iter] = riverWidth;
296template <
typename TGr
idFunction>
304 std::vector<std::string> names;
308 for (
size_t i = 0; i < names.size (); i++)
312 UG_THROW (
"VertexRiverRecharge::set_river_width: no subset '" << names[i] <<
"' found in the river grid!");
313 set_river_width (riverWidth, ssi);
318template <
typename TGr
idFunction>
322 Grid & riverGrid = m_spRiverNetwork->grid ();
323 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
330 nodal_depth_accessor_type aaNodalFSDepth;
332 aaNodalFSDepth.access (riverGrid, aNodalFSDepth);
335 this->prepare_ls_height ();
338 VertConstIterator vertIterEnd = riverGrid.template end<Vertex> ();
339 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
341 Vertex * vert = *vertIter;
342 aaNodalFSDepth[vert] = this->get_ls_height_at (river_vrt_pos_acc [vert]);
348 std::vector<number> fs_depth_vec (riverGrid.
num_vertices ());
350 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
351 fs_depth_vec [vert_i++] = aaNodalFSDepth [*vertIter];
352 std::vector<number> red_fs_depth_vec;
354 if (red_fs_depth_vec.size () != fs_depth_vec.size ())
355 UG_THROW (
"VertexRiverRecharge: Failed to reduce the free surface depth vector.");
357 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
358 aaNodalFSDepth [*vertIter] = red_fs_depth_vec [vert_i++];
362 EdgeConstIterator iterEnd = riverGrid.template end<Edge> ();
363 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
372 if (fs_depth_1 != - std::numeric_limits<number>::max () && fs_depth_2 != - std::numeric_limits<number>::max ())
373 m_aaFSDepth[seg] = (fs_depth_1 + fs_depth_2) / 2;
375 m_aaFSDepth[seg] = - std::numeric_limits<number>::max ();
382template <
typename TGr
idFunction>
388 Grid & riverGrid = m_spRiverNetwork->grid ();
389 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
392 this->prepare_ls_height ();
395 EdgeConstIterator iterEnd = riverGrid.template end<Edge> ();
396 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
402 seg_center_c = river_vrt_pos_acc [seg->
vertex (0)];
403 seg_center_c += river_vrt_pos_acc [seg->
vertex (1)];
407 number fs_depth = this->get_ls_height_at (seg_center_c);
408 m_aaFSDepth[seg] = fs_depth;
414 std::vector<number> fs_depth_vec (riverGrid.
num_edges ());
416 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
417 fs_depth_vec [seg_i++] = m_aaFSDepth [*iter];
418 std::vector<number> red_fs_depth_vec;
420 if (red_fs_depth_vec.size () != fs_depth_vec.size ())
421 UG_THROW (
"VertexRiverRecharge: Failed to reduce the free surface depth vector.");
423 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
424 m_aaFSDepth [*iter] = red_fs_depth_vec [seg_i++];
429template <
typename TGr
idFunction>
436 Grid & riverGrid = m_spRiverNetwork->grid ();
437 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
438 river_depth_acc_t river_vrt_depth_acc = river_network()->gauge_accessor ();
442 this->compute_fs_depths_at_nodes ();
444 this->compute_fs_depths_at_segments ();
447 EdgeConstIterator iterEnd = riverGrid.template end<Edge> ();
448 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
455 number depth_0 = river_vrt_depth_acc[vrt_0];
458 number depth_1 = river_vrt_depth_acc[vrt_1];
460 number seg_depth = (depth_0 + depth_1) / 2;
463 if (this->ls_depth_is_relative ())
466 MathVector<dim-1> pos_0 = river_vrt_pos_acc[vrt_0];
467 MathVector<dim-1> pos_1 = river_vrt_pos_acc[vrt_1];
469 seg_center_c = pos_0; seg_center_c += pos_1; seg_center_c /= 2;
473 if (this->min_top_depth (seg_center_c, top_depth) == 0)
475 m_aaRiverDepth[seg] = std::numeric_limits<number>::max ();
479 seg_depth += top_depth;
483 number fs_depth = m_aaFSDepth[seg];
484 if (this->restrict_depth () && fs_depth != - std::numeric_limits<number>::max ()
485 && seg_depth < fs_depth - this->max_depth_diff ())
486 seg_depth = fs_depth - this->max_depth_diff ();
489 m_aaRiverDepth[seg] = seg_depth;
495 std::vector<number> river_depth_vec (riverGrid.
num_edges ());
497 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
498 river_depth_vec [seg_i++] = m_aaRiverDepth [*iter];
499 std::vector<number> red_river_depth_vec;
501 if (red_river_depth_vec.size () != river_depth_vec.size ())
502 UG_THROW (
"VertexRiverRecharge: Failed to reduce the river depth vector.");
504 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
505 m_aaRiverDepth [*iter] = red_river_depth_vec [seg_i++];
509 if (m_bCheckTopCovering)
510 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
513 if (m_aaRiverDepth [seg] == std::numeric_limits<number>::max ())
514 UG_THROW (
"VertexRiverRecharge: River segment ["
515 << river_vrt_pos_acc[seg->
vertex(0)] <<
", " << river_vrt_pos_acc[seg->
vertex(1)]
516 <<
"] is not (completely) covered by the top subset.");
518 if (m_bCheckFSCovering)
519 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
522 if (m_aaRiverDepth [seg] != std::numeric_limits<number>::max ()
523 && m_aaFSDepth [seg] == - std::numeric_limits<number>::max ())
524 UG_THROW (
"VertexRiverRecharge: River segment ["
525 << river_vrt_pos_acc[seg->
vertex(0)] <<
", " << river_vrt_pos_acc[seg->
vertex(1)]
526 <<
"] is not (completely) covered by the free surface.");
530 if (m_bPrintTotalRecharge)
531 do_print_total_recharge ();
535template <
typename TGr
idFunction>
542 Grid & riverGrid = m_spRiverNetwork->grid ();
543 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
544 number total_recharge = 0;
546 EdgeConstIterator iterEnd = riverGrid.template end<Edge> ();
547 for (EdgeConstIterator iter = riverGrid.template begin<Edge> (); iter != iterEnd; ++iter)
557 number fs_depth = fs_depth_for (seg);
558 if (fs_depth == - std::numeric_limits<number>::max ())
562 number seg_depth = river_depth_for (seg);
563 if (seg_depth == std::numeric_limits<number>::max ())
566 number seg_recharge = this->object_recharge (seg_depth, fs_depth, river_width_for (seg));
567 if (this->no_inflow () && seg_recharge >= 0)
570 total_recharge += seg_recharge * seg_length;
572 UG_LOG (
"----> Total contribution by the rivers: " << total_recharge <<
'\n');
574 if (! m_sTotalRechargeFile.empty ())
581 std::ofstream output (m_sTotalRechargeFile.c_str (), std::ofstream::app);
582 UG_COND_THROW (output.fail (),
"VertexRiverRecharge: Cannot open data file '" << m_sTotalRechargeFile <<
"' for output!");
583 output << m_sOutputPrefix <<
' ' << total_recharge <<
'\n';
588template <
typename TGr
idFunction>
597 Grid & riverGrid = river_network()->grid ();
598 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
602 for (
size_t i = 0; i < dim-1; i++) xc[i] = x[i];
606 for (edge_iter_t s_iter = riverGrid.
begin<
Edge>(); s_iter != riverGrid.
end<
Edge>(); ++s_iter)
608 Edge * seg = *s_iter;
613 MathVector<dim-1> pos_0 = river_vrt_pos_acc[vrt_0];
616 MathVector<dim-1> pos_1 = river_vrt_pos_acc[vrt_1];
619 seg_center_c = pos_0; seg_center_c += pos_1; seg_center_c /= 2;
622 if (dist >= this->smooth_len ())
628 number fs_depth = fs_depth_for (seg);
629 if (fs_depth == - std::numeric_limits<number>::max ())
633 number seg_depth = river_depth_for (seg);
634 if (seg_depth == std::numeric_limits<number>::max ())
638 number river_q = this->object_recharge (seg_depth, fs_depth, river_width_for (seg))
639 * cone_mollifier<this_type::mol_dim> (dist, this->smooth_len()) * seg_length;
640 if (this->no_inflow () && river_q >= 0)
649template <
typename TGr
idFunction>
654 Grid & riverGrid = m_spRiverNetwork->grid ();
655 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
656 river_depth_acc_t river_vrt_depth_acc = river_network()->gauge_accessor ();
663 nodal_depth_accessor_type aaNodalFSDepth;
665 aaNodalFSDepth.access (riverGrid, aNodalFSDepth);
668 this->prepare_ls_height ();
671 VertConstIterator vertIterEnd = riverGrid.template end<Vertex> ();
672 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
674 Vertex * vert = *vertIter;
675 aaNodalFSDepth[vert] = this->get_ls_height_at (river_vrt_pos_acc [vert]);
681 std::vector<number> fs_depth_vec (riverGrid.
num_vertices ());
683 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
684 fs_depth_vec [vert_i++] = aaNodalFSDepth [*vertIter];
685 std::vector<number> red_fs_depth_vec;
687 if (red_fs_depth_vec.size () != fs_depth_vec.size ())
688 UG_THROW (
"VertexRiverRecharge: Failed to reduce the free surface depth vector.");
690 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
691 aaNodalFSDepth [*vertIter] = red_fs_depth_vec [vert_i++];
695 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
697 number depth = aaNodalFSDepth [*vertIter];
698 if (depth != - std::numeric_limits<number>::max ())
699 river_vrt_depth_acc[*vertIter] = depth;
706template <
typename TGr
idFunction>
709 const char * file_name
714 Grid & riverGrid = m_spRiverNetwork->grid ();
715 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor ();
716 river_depth_acc_t river_vrt_depth_acc = river_network()->gauge_accessor ();
723 nodal_depth_accessor_type aaNodalFSDepth;
725 aaNodalFSDepth.access (riverGrid, aNodalFSDepth);
728 this->prepare_ls_height ();
731 VertConstIterator vertIterEnd = riverGrid.template end<Vertex> ();
732 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
734 Vertex * vert = *vertIter;
735 aaNodalFSDepth[vert] = this->get_ls_height_at (river_vrt_pos_acc [vert]);
741 std::vector<number> fs_depth_vec (riverGrid.
num_vertices ());
743 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
744 fs_depth_vec [vert_i++] = aaNodalFSDepth [*vertIter];
745 std::vector<number> red_fs_depth_vec;
747 if (red_fs_depth_vec.size () != fs_depth_vec.size ())
748 UG_THROW (
"VertexRiverRecharge: Failed to reduce the free surface depth vector.");
750 for (VertConstIterator vertIter = riverGrid.template begin<Vertex> (); vertIter != vertIterEnd; ++vertIter)
751 aaNodalFSDepth [*vertIter] = red_fs_depth_vec [vert_i++];
755 m_spRiverNetwork->save_to_file_with_ (aaNodalFSDepth, file_name);
760template <
typename TGr
idFunction>
770 Grid & riverGrid = river_network()->grid ();
771 river_vrt_pos_acc_t river_vrt_pos_acc = river_network()->position_accessor();
772 river_depth_acc_t river_vrt_depth_acc = river_network()->gauge_accessor();
776 for (
size_t i = 0; i < dim-1; i++) xc[i] = x[i];
781 for (edge_iter_t s_iter = riverGrid.
begin<
Edge>(); s_iter != riverGrid.
end<
Edge>(); ++s_iter)
783 Edge * seg = *s_iter;
788 MathVector<dim-1> pos_0 = river_vrt_pos_acc[vrt_0];
789 number depth_0 = river_vrt_depth_acc[vrt_0];
792 MathVector<dim-1> pos_1 = river_vrt_pos_acc[vrt_1];
793 number depth_1 = river_vrt_depth_acc[vrt_1];
796 seg_center_c = pos_0; seg_center_c += pos_1; seg_center_c *= 0.5;
799 if (dist >= this->smooth_len ())
803 number seg_depth = (depth_0 + depth_1)*0.5;
806 number river_q = seg_depth * cone_mollifier<this_type::mol_dim> (dist, this->smooth_len()) * seg_length * 0.5;
808 if (this->no_inflow () && river_q >= 0)
continue;
size_t allreduce(const size_t &t, pcl::ReduceOperation op) const
int get_proc_id(size_t index) const
virtual Vertex * vertex(size_t index) const
void attach_to_vertices(IAttachment &attachment)
size_t num_vertices() const
void detach_from_vertices(IAttachment &attachment)
geometry_traits< TGeomObj >::iterator begin()
geometry_traits< TGeomObj >::iterator end()
int get_subset_index(const char *name) const
bool has_children(TElem *elem) const
geometry_traits< TElem >::iterator end(int subsetIndex, int level)
geometry_traits< TElem >::iterator begin(int subsetIndex, int level)
void add(const char *name)
TGridFunction::domain_type domain_type
type of the domain
Definition rivers.h:91
void simple_compute(SmartPtr< grid_func_type > spRecharge)
computes the recharge at the vertices
Definition rivers_impl.h:95
void set_relative_to(const char *subsetNames, number top_tolerance, int top_grid_level)
specifyes the subsets of the top
Definition rivers_impl.h:29
grid_dim_traits< dim >::side_type g_surf_elem_t
type of the elements constituting surfaces in the grid
Definition rivers.h:106
geometry_traits< g_surf_elem_t >::iterator g_surf_iter_t
type of the iterator of the grid surface elements
Definition rivers.h:109
void compute(SmartPtr< grid_func_type > spRecharge)
computes the recharge at the vertices
Definition rivers_impl.h:119
size_t get_top_z(const MathVector< dim > &over)
get the intersection with the top
Definition rivers_impl.h:72
void save_river_depth(const char *file_name)
save the river network with the fs depth in a file
Definition rivers_impl.h:708
void do_print_total_recharge()
prints the total recharge
Definition rivers_impl.h:536
void compute_fs_depths_at_nodes()
computes the depths of the free surface at the nodes of the river vertices
Definition rivers_impl.h:319
void set_river_width(number riverWidth)
sets river width for all segments
Definition rivers_impl.h:264
virtual number smoothed_recharge_at(MathVector< dim > &x) const
computes the smoothed recharge at a given point
Definition rivers_impl.h:590
virtual number simple_smoothed_recharge_at(MathVector< dim > &x) const
computes the smoothed recharge at a given point neglecting the depths, width etc.
Definition rivers_impl.h:762
void reset_river_depth()
set the river depth from the fs depth
Definition rivers_impl.h:650
void compute_fs_depths_at_segments()
computes the depths of the free surface at the centers of the river segments
Definition rivers_impl.h:383
virtual void compute_depths()
fills the attachment with the depths of the free surface
Definition rivers_impl.h:430
virtual void compute_depths()
fills the attachment with the depths of the free surface
Definition rivers_impl.h:147
virtual number smoothed_recharge_at(MathVector< dim > &x) const
computes the smoothed recharge at a given point
Definition rivers_impl.h:211
virtual number simple_smoothed_recharge_at(MathVector< dim > &x) const
computes the smoothed recharge at a given point
Definition rivers_impl.h:252
vector< string > TokenizeString(const char *str, const char delimiter=',')
UG_API std::vector< std::string > TokenizeTrimString(const std::string &str, const char delimiter=',')
#define UG_COND_THROW(cond, msg)
vector_t PointOnRay(const vector_t &from, const vector_t &dir, number s)
vector_t::value_type VecDistance(const vector_t &v1, const vector_t &v2)
bool RayElementIntersections(std::vector< RayElemIntersectionRecord< typename tree_t::elem_t > > &intersectionsOut, const tree_t &tree, const typename tree_t::vector_t &rayFrom, const typename tree_t::vector_t &rayDir, const number small=1.e-12)
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
geometry_traits< TElem >::const_iterator const_iterator
data of a recharge well
Definition rivers.h:356
MathVector< dim-1 > x
coordinates of the well
Definition rivers.h:357
number well_depth
effective level of the well
Definition rivers.h:361
number well_depth_spec
level of the well as specified
Definition rivers.h:358
number fs_depth
depth of the free surface at the well (computed)
Definition rivers.h:360
#define for_each_in_vec(_vfeDecl, _vfeVec)