5#ifndef D3F_MANNING_ROUGHNESS_1D_H
6#define D3F_MANNING_ROUGHNESS_1D_H
9namespace ug {
namespace d3f{
40 m_dn = n.template cast_dynamic<TDNumberData>();
46 m_dh = h.template cast_dynamic<TDNumberData>();
52 m_dv = v.template cast_dynamic<TDNumberData>();
59 UG_THROW(
"ManningRoughness1d: Not implemented for single global positions.\n");
82 (*m_h)(&vh[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
83 (*m_v)(&vVel[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
84 (*m_n)(&vn[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
86 for (
size_t ip = 0;
ip < nip; ++
ip) {
94 vValue[
ip] =
m_g * vn[
ip] * vn[
ip] * std::fabs(vVel[
ip]);
95 vValue[
ip] /= std::pow(std::max(vh[
ip],
m_hmin), (4.0 / 3.0));
102 template <
int refDim>
113 std::vector<std::vector<number>> vvvDeriv[],
117 evaluate<refDim>(vValue, vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
127 (*m_h)(&vh[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
128 (*m_v)(&vVel[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
129 (*m_n)(&vn[0], vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
131 this->set_zero(vvvDeriv, nip);
133 for (
size_t ip = 0;
ip < nip; ++
ip) {
141 if (
m_dh.valid() && !
m_dh->zero_derivative()) {
142 for (
size_t fct = 0; fct <
m_dh->num_fct(); fct++) {
146 if (this->num_sh(commonFct) == nip) {
147 vvvDeriv[
ip][commonFct][
ip] += dh * vDHeight[
ip];
149 for (
size_t sh = 0; sh < this->num_sh(commonFct); ++sh) {
150 vvvDeriv[
ip][commonFct][sh] += dh * vDHeight[sh];
158 if (
m_dv.valid() && !
m_dv->zero_derivative()) {
159 for (
size_t fct = 0; fct <
m_dv->num_fct(); fct++) {
163 if (this->num_sh(commonFct) == nip) {
164 vvvDeriv[
ip][commonFct][
ip] += dv * vDVel[
ip];
166 for (
size_t sh = 0; sh < this->num_sh(commonFct); ++sh) {
167 vvvDeriv[
ip][commonFct][sh] += dv * vDVel[sh];
175 if (
m_n.valid() && !
m_n->zero_derivative()) {
176 for (
size_t fct = 0; fct <
m_dn->num_fct(); fct++) {
180 if (this->num_sh(commonFct) == nip) {
181 vvvDeriv[
ip][commonFct][
ip] += dn * vDn[
ip];
183 for (
size_t sh = 0; sh < this->num_sh(commonFct); ++sh) {
184 vvvDeriv[
ip][commonFct][sh] += dn * vDn[sh];
199 return g * n * n * v / (std::fabs(v +
SMALL_SQ) * std::pow(std::max(h,
m_hmin), (4.0 / 3.0)));
204 return (-4.0 / 3.0) * g * n * n * std::fabs(v) / std::pow(std::max(h,
m_hmin), (7.0 / 3.0));
209 return (2.0 * g * n * std::fabs(v)) / std::pow(std::max(h,
m_hmin), (4.0 / 3.0));
parameterString s
Definition Biogas.lua:2
TData & value(size_t s, size_t ip)
const MathVector< dim > & ip(size_t s, size_t ip) const
void set_num_input(size_t num)
size_t series_id(size_t i, size_t s) const
size_t input_common_fct(size_t i, size_t fct) const
virtual void set_input(size_t i, SmartPtr< ICplUserData< dim > > input, SmartPtr< UserDataInfo > info)
virtual bool zero_derivative() const
Calculates the river bottom friction (reaction rate) using Manning's formula.
Definition manning_roughness_1d.h:18
void set_gravity(number gin)
Definition manning_roughness_1d.h:36
void set_h(SmartPtr< TNumberData > h)
Definition manning_roughness_1d.h:44
SmartPtr< TDNumberData > m_dv
Definition manning_roughness_1d.h:214
number m_g
Definition manning_roughness_1d.h:223
number evaluate_dn(const number v, const number n, const number h, const number g) const
Definition manning_roughness_1d.h:208
number evaluate_dh(const number v, const number n, const number h, const number g) const
Definition manning_roughness_1d.h:203
SmartPtr< TDNumberData > m_dh
Definition manning_roughness_1d.h:216
bool requires_grid_fct() const
Definition manning_roughness_1d.h:192
SmartPtr< TNumberData > m_n
Definition manning_roughness_1d.h:217
void evaluate(number &value, const MathVector< dim > &globIP, number time, int si) const
Definition manning_roughness_1d.h:58
DependentUserData< number, dim > TDNumberData
Definition manning_roughness_1d.h:23
SmartPtr< TDNumberData > m_dn
Definition manning_roughness_1d.h:218
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
Evaluates the value AND the Jacobian (derivatives w.r.t h, v, n) for the Newton solver.
Definition manning_roughness_1d.h:103
SmartPtr< TNumberData > m_v
Definition manning_roughness_1d.h:213
number m_vmin
Definition manning_roughness_1d.h:221
ManningRoughness1d()
Definition manning_roughness_1d.h:30
void set_hmin(number h)
Definition manning_roughness_1d.h:35
void set_v(SmartPtr< TNumberData > v)
Definition manning_roughness_1d.h:50
number m_hmin
Definition manning_roughness_1d.h:222
number evaluate_dv(const number v, const number n, const number h, const number g) const
Definition manning_roughness_1d.h:197
CplUserData< MathVector< dim >, dim > TVectorData
Definition manning_roughness_1d.h:22
CplUserData< number, dim > TNumberData
Definition manning_roughness_1d.h:21
inputs
Definition manning_roughness_1d.h:28
@ _h_
Definition manning_roughness_1d.h:28
@ _n_
Definition manning_roughness_1d.h:28
@ _v_
Definition manning_roughness_1d.h:28
SmartPtr< TNumberData > m_h
Definition manning_roughness_1d.h:215
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
Evaluates the Manning roughness reaction rate at local integration points.
Definition manning_roughness_1d.h:66
void set_manning_coefficient(SmartPtr< TNumberData > n)
Definition manning_roughness_1d.h:38
DependentUserData< MathVector< dim >, dim > TDVectorData
Definition manning_roughness_1d.h:24