Plugins
Loading...
Searching...
No Matches
st_venant_elem_disc.h
Go to the documentation of this file.
1//
2// Created by julian on 5/15/25.
3//
4
5#ifndef D3F_ST_VENANT_ELEM_DISC_H
6#define D3F_ST_VENANT_ELEM_DISC_H
8#include "sohle.h"
9#include "../../../ConvectionDiffusion/fv1/convection_diffusion_fv1.h"
14#include "st_venant_wall_bnd.h"
15
16namespace ug {namespace d3f{
17
23template <typename TDomain>
55
56
60template<typename TDomain>
62public:
63 static const int dim = TDomain::dim;
64
65 // --- Type Definitions ---
71
77
79 m_gravity = 9.81;
80 m_diffusion = 1.0;
81 m_functions = {"A", "v"}; // Cross-sectional Area (A) and Velocity (v)
82 }
83
84 virtual ~StVenantElemDiscFactory() = default;
85
91 std::vector<SmartPtr<TStVenant>> create_1d_swe(const char* subsets) {
92 UG_LOG("Creating 1D St. Venant element discretizations...\n");
93
94 std::vector<SmartPtr<TStVenant>> elemDiscs;
95
96 // 1. Initialize Base Discretizations
97 SmartPtr<TStVenant> disc_A = make_sp<TStVenant>(new TStVenant(m_functions[0].c_str(), subsets));
98 SmartPtr<TStVenant> disc_v = make_sp<TStVenant>(new TStVenant(m_functions[1].c_str(), subsets));
99
100 auto A = disc_A->value();
101 auto v = disc_v->value();
102
103 // 2. Geometric Linkers
104 // Water Depth: $h = A / b$
105 auto h = make_sp(new TInverseLinker());
106 h->divide(A, m_b);
107
108 // 3. Stabilization (Upwinding)
109 auto upwind = make_sp(new TUpwind());
110 disc_A->set_upwind(upwind);
111 disc_v->set_upwind(upwind);
112
113 // 4. Advection/Velocity Vectors
114 SmartPtr<TOrient> downStreamVec = make_sp(new TOrient(m_domain));
115 auto boundaryDirection = make_sp(new StVenantWallBndDir<dim>(downStreamVec.template cast_dynamic<TVectorData>()));
116 m_boundary_dir = boundaryDirection.template cast_dynamic<TNumberData>();
117
118 // Convective velocity for the transport equations: $\vec{v}_{adv} = v \cdot \hat{d}$
119 auto adv_velocity = make_sp(new TScaleAddLinkerVector());
120 adv_velocity->add(v, downStreamVec);
121
122 disc_A->set_velocity(adv_velocity);
123 disc_v->set_velocity(adv_velocity);
124
125 // 5. Flux/Pressure Terms for Velocity Equation
126 // Absolute water surface elevation: $Z = h + z_{bed}$
127 SmartPtr<s_type> bed_elevation = make_sp<s_type>(new s_type("Sink", 0.001, m_domain));
128 m_s = bed_elevation;
129
130
131
132 // Pressure gradient flux: $\vec{F} = g(h + z_{bed})\hat{d}$
133 auto flux_inner = make_sp(new TScaleAddLinkerVector());
134 flux_inner->add(h, downStreamVec);
135 flux_inner->add(bed_elevation, downStreamVec);
136
137 auto flux_v = make_sp(new TScaleAddLinkerVector());
138 flux_v->add(m_gravity, flux_inner);
139
140 m_v_flux_term = flux_v;
141 disc_v->set_flux(flux_v);
142
143 // 6. Diffusion
144 disc_v->set_diffusion(m_diffusion);
145
146 // 7. Reaction Rate / Friction Term
147 auto roughness = make_sp(new ManningRoughness1d<dim>());
148 roughness->set_h(h);
149 roughness->set_v(v);
150 roughness->set_manning_coefficient(m_frictionKs);
151 roughness->set_hmin(1e-8);
152 roughness->set_gravity(m_gravity);
153
154 m_manningRoughness = roughness.template cast_dynamic<TNumberData>();
155 disc_v->set_reaction_rate(roughness);
156
157 // 8. Finalize
158 elemDiscs.push_back(disc_A);
159 elemDiscs.push_back(disc_v);
160
161 UG_LOG("Successfully created St. Venant element discretizations.\n");
162 return elemDiscs;
163 }
164
165 // --- Exporters ---
175
176 // --- Setters ---
177 void set_domain(SmartPtr<TDomain> domain) { m_domain = domain; }
178 void set_gravity(number g) { m_gravity = g; }
180 void set_width(SmartPtr<TNumberData> b) { m_b = b; } // Alias for set_b
184
185 const char* get_disc_type() { return "fv1"; }
186
187protected:
188 std::vector<std::string> m_functions;
190
191 // Physical Parameters
195
196 // User Data Fields
198 SmartPtr<TNumberData> m_b = make_sp<TNumberData>(new ConstUserNumber<dim>(1.0));
200
201 // Cached Linkers/Terms for export
207
208 SmartPtr<TScaleAddLinkerVector> m_v_flux = make_sp<TScaleAddLinkerVector>(new TScaleAddLinkerVector());
209 SmartPtr<TScaleAddLinkerNumber> m_v_gsh = make_sp<TScaleAddLinkerNumber>(new TScaleAddLinkerNumber());
212 SmartPtr<TScaleAddLinkerNumber> m_v_05 = make_sp<TScaleAddLinkerNumber>(new TScaleAddLinkerNumber());
214 SmartPtr<TUpwind> m_upwind = make_sp<TUpwind>(new TUpwind());
215};
216
217
218
219}
220}
221#endif //ST_VENANT_ELEM_DISC_H
FV Discretization for the Convection-Diffusion Equation.
Definition convection_diffusion_fv1.h:61
Calculates a river bed profile by applying a constant slope starting from a specific boundary.
Definition sohle.h:61
Calculates the river bottom friction (reaction rate) using Manning's formula.
Definition manning_roughness_1d.h:18
Factory class to construct and link the coupled St. Venant equations.
Definition st_venant_elem_disc.h:61
SmartPtr< TScaleAddLinkerVector > m_v_velocity
Definition st_venant_elem_disc.h:211
SmartPtr< TNumberData > m_A_neumann
Definition st_venant_elem_disc.h:205
SmartPtr< TScaleAddLinkerNumber > export_flux()
Definition st_venant_elem_disc.h:167
CplUserData< MathVector< dim >, dim > TVectorData
Definition st_venant_elem_disc.h:73
void set_b(SmartPtr< TNumberData > b)
Definition st_venant_elem_disc.h:179
std::vector< std::string > m_functions
Definition st_venant_elem_disc.h:188
SmartPtr< TScaleAddLinkerNumber > m_v_gsh
Definition st_venant_elem_disc.h:209
SmartPtr< s_type > m_s
Definition st_venant_elem_disc.h:199
SmartPtr< TNumberData > export_manning_roughness()
Definition st_venant_elem_disc.h:169
void set_ks(SmartPtr< TNumberData > ks)
Definition st_venant_elem_disc.h:181
StVenantElemDiscFactory()
Definition st_venant_elem_disc.h:78
void set_width(SmartPtr< TNumberData > b)
Definition st_venant_elem_disc.h:180
virtual ~StVenantElemDiscFactory()=default
SmartPtr< TNumberData > m_boundary_dir
Definition st_venant_elem_disc.h:204
SmartPtr< TNumberData > get_boundary_dir()
Definition st_venant_elem_disc.h:172
ConvectionShapesFullUpwind< dim > TUpwind
Definition st_venant_elem_disc.h:70
EdgeOrientation< TDomain > TOrient
Definition st_venant_elem_disc.h:69
IElemDisc< TDomain > TElemDisc
Definition st_venant_elem_disc.h:66
SmartPtr< TNumberData > m_v_neumann
Definition st_venant_elem_disc.h:206
CplUserData< number, dim > TNumberData
Definition st_venant_elem_disc.h:72
SmartPtr< TScaleAddLinkerNumber > m_v_05
Definition st_venant_elem_disc.h:212
void set_gravity(number g)
Definition st_venant_elem_disc.h:178
SmartPtr< TScaleAddLinkerNumber > get_source_term()
Definition st_venant_elem_disc.h:171
void set_diffusion(number nu)
Definition st_venant_elem_disc.h:182
number m_diffusion
Definition st_venant_elem_disc.h:193
SmartPtr< TNumberData > get_neumann_V()
Definition st_venant_elem_disc.h:174
void set_h_threshold(number t)
Definition st_venant_elem_disc.h:183
void set_domain(SmartPtr< TDomain > domain)
Definition st_venant_elem_disc.h:177
SmartPtr< TScaleAddLinkerVector > m_v_flux
Definition st_venant_elem_disc.h:208
SmartPtr< TVectorData > export_v_flux_term()
Definition st_venant_elem_disc.h:170
static const int dim
Definition st_venant_elem_disc.h:63
SmartPtr< TScaleAddLinkerNumber > m_total_source_term
Definition st_venant_elem_disc.h:213
SmartPtr< TDomain > m_domain
Definition st_venant_elem_disc.h:189
SmartPtr< TVectorData > m_v_flux_term
Definition st_venant_elem_disc.h:203
StVenantElemDisc< TDomain > TStVenant
Definition st_venant_elem_disc.h:67
SmartPtr< TNumberData > m_manningRoughness
Definition st_venant_elem_disc.h:202
SmartPtr< TNumberData > get_neumann_A()
Definition st_venant_elem_disc.h:173
std::vector< SmartPtr< TStVenant > > create_1d_swe(const char *subsets)
Creates the elemental discretizations for the 1D Shallow Water Equations.
Definition st_venant_elem_disc.h:91
ScaleAddLinker< MathVector< dim >, dim, number > TScaleAddLinkerVector
Definition st_venant_elem_disc.h:74
number m_threshold
Definition st_venant_elem_disc.h:194
number m_gravity
Definition st_venant_elem_disc.h:192
const char * get_disc_type()
Definition st_venant_elem_disc.h:185
ConstantSohlGradient< TDomain > s_type
Definition st_venant_elem_disc.h:68
SmartPtr< TScaleAddLinkerNumber > export_velocity()
Definition st_venant_elem_disc.h:168
SmartPtr< TNumberData > m_b
Definition st_venant_elem_disc.h:198
InverseLinker< dim > TInverseLinker
Definition st_venant_elem_disc.h:76
SmartPtr< TUpwind > m_upwind
Definition st_venant_elem_disc.h:214
SmartPtr< TScaleAddLinkerVector > m_A_velocity
Definition st_venant_elem_disc.h:210
SmartPtr< TNumberData > m_frictionKs
Definition st_venant_elem_disc.h:197
SmartPtr< s_type > export_sohle()
Definition st_venant_elem_disc.h:166
ScaleAddLinker< number, dim, number > TScaleAddLinkerNumber
Definition st_venant_elem_disc.h:75
Element discretization for the 1D Shallow Water (St. Venant) Equations.
Definition st_venant_elem_disc.h:24
CplUserData< MathVector< dim >, dim > TVectorData
Definition st_venant_elem_disc.h:31
SmartPtr< TNumberData > get_width_data()
Definition st_venant_elem_disc.h:44
SmartPtr< DataExport< MathVector< dim >, dim > > m_exGrad
Definition st_venant_elem_disc.h:51
CplUserData< number, dim > TNumberData
Definition st_venant_elem_disc.h:30
SmartPtr< TInverseLinker > get_height_data()
Definition st_venant_elem_disc.h:45
void set_width_data(SmartPtr< TNumberData > b)
Definition st_venant_elem_disc.h:47
static const int dim
Definition st_venant_elem_disc.h:26
SmartPtr< DataExport< number, dim > > m_exValue
Definition st_venant_elem_disc.h:50
SmartPtr< TNumberData > m_height
Definition st_venant_elem_disc.h:52
ug::ConvectionDiffusionPlugin::ConvectionDiffusionFV1< TDomain > base_type
Definition st_venant_elem_disc.h:29
SmartPtr< TNumberData > m_width
Definition st_venant_elem_disc.h:53
InverseLinker< dim > TInverseLinker
Definition st_venant_elem_disc.h:32
StVenantElemDisc(const char *functions, const char *subsets)
Constructor initializing the underlying convection-diffusion element.
Definition st_venant_elem_disc.h:37
Linker to evaluate the normal component of a downstream vector at a boundary.
Definition st_venant_wall_bnd.h:24
#define UG_LOG(msg)
double number
SmartPtr< T, FreePolicy > make_sp(T *inst)
Boundary condition linkers for the St. Venant equations.