37#ifndef __H__UG__PLUGINS__GRID_FUNC_LS_USER_DATA__
38#define __H__UG__PLUGINS__GRID_FUNC_LS_USER_DATA__
60template <
typename TGr
idFunction>
63 number, TGridFunction::dim>
67 static const int dim = TGridFunction::dim;
96 this->set_functions(cmp);
99 m_fct = spGridFct->fct_id_by_name(cmp);
102 if(
m_fct >= spGridFct->num_fct())
103 UG_THROW(
"GridFuncLSNumberData: Function space does not contain"
104 " a function with name " << cmp <<
".");
110 UG_THROW (
"GridFuncLSNumberData: Only Lagrange spaces are currently supported.");
115 return LocalFiniteElementProvider::continuous(
m_lfeID);
118 template <
int refDim>
129 std::vector<std::vector<number> > vvvDeriv[],
142 g_level =
m_spGridFct->approx_space()->num_levels() - 1;
144 (rRefElem.
num(0), elem, si, g_level,
false, vCornerCoords,
time)) < 0)
146 for(
size_t ip = 0;
ip < nip; ++
ip)
155 LocalFiniteElementProvider::get<refDim>(roid,
m_lfeID);
158 std::vector<number> vShape;
159 std::vector<number> vVal;
162 std::vector<DoFIndex> ind;
166 for(
size_t ip = 0;
ip < nip; ++
ip)
169 rTrialSpace.
shapes(vShape, vLocIP[
ip]);
172 vVal.resize(vShape.size());
173 for(
size_t sh = 0; sh < vVal.size(); ++sh)
180 for(
size_t sh = 0; sh < vShape.size(); ++sh)
181 vValue[
ip] += vVal[sh] * vShape[sh];
185 for(
size_t ip = 0;
ip < nip; ++
ip){
187 rTrialSpace.
shapes(vShape, vLocIP[
ip]);
189 for(
size_t sh = 0; sh < vShape.size(); ++sh)
190 vvvDeriv[
ip][0][sh] = vShape[sh];
194 UG_CATCH_THROW(
"GridFuncLSNumberData: Shape Function Set missing for"
195 " Reference Object: "<<roid<<
", Trial Space: "
196 <<
m_lfeID<<
", refDim="<<refDim);
207template <
typename TGr
idFunction>
210 MathVector<TGridFunction::dim>, TGridFunction::dim>
214 static const int dim = TGridFunction::dim;
243 this->set_functions(cmp);
246 m_fct = spGridFct->fct_id_by_name(cmp);
249 if(
m_fct >= spGridFct->num_fct())
250 UG_THROW(
"GridFuncLSGradientData: Function space does not contain"
251 " a function with name " << cmp <<
".");
257 UG_THROW (
"GridFuncLSGradientData: Only Lagrange spaces are currently supported.");
265 template <
int refDim>
288 g_level =
m_spGridFct->approx_space()->num_levels() - 1;
290 (rRefElem.
num(0), elem, si, g_level,
false, vCornerCoords,
time)) < 0)
292 for(
size_t ip = 0;
ip < nip; ++
ip)
301 LocalFiniteElementProvider::get<refDim>(roid,
m_lfeID);
304 std::vector<MathVector<refDim> > vLocGrad;
308 std::vector<number> vVal;
314 std::vector<DoFIndex > ind;
321 std::vector<MathMatrix<refDim, dim> > vJTTmp(nip);
325 = ReferenceMappingProvider::get<refDim, dim>(roid, vCornerCoords);
335 for(
size_t ip = 0;
ip < nip; ++
ip)
338 rTrialSpace.
grads(vLocGrad, vLocIP[
ip]);
341 vVal.resize(vLocGrad.size());
342 for(
size_t sh = 0; sh < vVal.size(); ++sh)
347 for(
size_t sh = 0; sh < vLocGrad.size(); ++sh)
357 = ReferenceElementProvider::get<refDim> (roid);
362 = ReferenceMappingProvider::get<refDim, dim>(roid, vCornerCoords);
367 size_t n_base_co = 0;
368 for(
size_t base_co = 0; base_co < rRefElem.
num(0); ++base_co)
372 rTrialSpace.
grads(vLocGrad, rRefElem.
corner(base_co));
375 vVal.resize(vLocGrad.size());
376 for(
size_t sh = 0; sh < vVal.size(); ++sh)
382 for(
size_t sh = 0; sh < vLocGrad.size(); ++sh)
391 elemGrad += baseGrad;
396 UG_THROW(
"GridFunctionNumberData: Failed in a cut element.");
399 elemGrad /= (
number) n_base_co;
400 for(
size_t ip = 0;
ip < nip; ++
ip)
401 vValue[
ip] = elemGrad;
406 " Reference Object: "<<roid<<
", Trial Space: "
407 <<
m_lfeID<<
", refDim="<<refDim);
419template <
typename TDomain,
typename TAlgebra>
421 :
public StdDataLinker< LSBearScheidegger<TDomain, TAlgebra>, MathMatrix<TDomain::dim,TDomain::dim>, TDomain::dim>
428 static const int dim = TDomain::dim;
447 if (spDispersion.invalid ())
448 UG_THROW (
"LSBearScheidegger: No valid disperion specified.");
451 m_spDDispersion = spDispersion.template cast_dynamic<DependentUserData<MathMatrix<dim,dim>,
dim> > ();
452 this->
set_input (0, spDispersion, spDispersion);
459 UG_THROW (
"LSBearScheidegger needs the grid element.");
462 template <
int refDim>
484 (rRefElem.
num(0), elem, si,
false, vCornerCoords,
time) <= 0)
486 for (
size_t ip = 0;
ip < nip; ++
ip)
493 (* m_spDispersion) (vValue, vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
496 template <
int refDim>
521 (rRefElem.
num(0), elem, si,
false, vCornerCoords,
time) <= 0)
523 for (
size_t ip = 0;
ip < nip; ++
ip)
526 this->set_zero (vvvDeriv, nip);
533 for (
size_t i = 0; i < nip; i++)
535 vValue[i] = vVector[i];
537 if (! bDeriv)
continue;
542 for (
size_t sh = 0; sh < this->num_sh (c_fct); sh++)
543 vvvDeriv[i][c_fct][sh] = vDDispersion [sh];
564template <
typename TDomain,
typename TAlgebra>
566 :
public StdDataLinker< LSBearScheidegger2<TDomain, TAlgebra>, MathMatrix<TDomain::dim,TDomain::dim>, TDomain::dim>
573 static const int dim = TDomain::dim;
593 if (spDispersion_under.invalid ())
594 UG_THROW (
"LSBearScheidegger2: No valid disperion under the interface specified.");
595 if (spDispersion_at.invalid ())
596 UG_THROW (
"LSBearScheidegger2: No valid disperion at the interface specified.");
600 this->
set_input (0, spDispersion_under, spDispersion_under);
602 m_spDDispersion_at = spDispersion_at.template cast_dynamic<DependentUserData<MathMatrix<dim,dim>,
dim> > ();
603 this->
set_input (1, spDispersion_at, spDispersion_at);
610 UG_THROW (
"LSBearScheidegger2 needs the grid element.");
613 template <
int refDim>
636 (rRefElem.
num(0), elem, si,
false, vCornerCoords,
time)) < 0)
638 for (
size_t ip = 0;
ip < nip; ++
ip)
644 (* m_spDispersion_at) (vValue, vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
650 (* m_spDispersion_under) (vValue, vGlobIP,
time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
653 template <
int refDim>
679 (rRefElem.
num(0), elem, si,
false, vCornerCoords,
time)) < 0)
681 for (
size_t ip = 0;
ip < nip; ++
ip)
684 this->set_zero (vvvDeriv, nip);
691 for (
size_t i = 0; i < nip; i++)
693 vValue[i] = vVector[i];
695 if (! bDeriv)
continue;
700 for (
size_t sh = 0; sh < this->num_sh (c_fct); sh++)
701 vvvDeriv[i][c_fct][sh] = vDDispersion_at [sh];
710 for (
size_t i = 0; i < nip; i++)
712 vValue[i] = vVector[i];
714 if (! bDeriv)
continue;
719 for (
size_t sh = 0; sh < this->num_sh (c_fct); sh++)
720 vvvDeriv[i][c_fct][sh] = vDDispersion_under [sh];
parameterString s
Definition Biogas.lua:2
const MathVector< dim, int > * corner() const
virtual void jacobian_transposed(MathMatrix< dim, worldDim > &JT, const MathVector< dim > &locPos) const=0
virtual ReferenceObjectID reference_object_id() const=0
const MathVector< dim > & ip(size_t s, size_t ip) const
Definition grid_func_ls_user_data.h:211
virtual bool continuous() const
Definition grid_func_ls_user_data.h:260
static const int dim
Definition grid_func_ls_user_data.h:214
IInterfaceExtrapolation< domain_type, algebra_type > extrapol_type
Definition grid_func_ls_user_data.h:223
size_t m_fct
Definition grid_func_ls_user_data.h:233
GridFuncLSGradientData(SmartPtr< TGridFunction > spGridFct, const char *cmp, SmartPtr< extrapol_type > spExtrapol)
constructor
Definition grid_func_ls_user_data.h:240
TGridFunction::domain_type domain_type
Definition grid_func_ls_user_data.h:217
SmartPtr< TGridFunction > m_spGridFct
Definition grid_func_ls_user_data.h:227
LFEID m_lfeID
Definition grid_func_ls_user_data.h:236
TGridFunction::algebra_type algebra_type
Definition grid_func_ls_user_data.h:220
void eval_and_deriv(MathVector< dim > 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< MathVector< dim > > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition grid_func_ls_user_data.h:266
SmartPtr< extrapol_type > m_spExtrapolation
Definition grid_func_ls_user_data.h:230
Definition grid_func_ls_user_data.h:64
TGridFunction::domain_type domain_type
Definition grid_func_ls_user_data.h:70
SmartPtr< extrapol_type > m_spExtrapolation
Definition grid_func_ls_user_data.h:83
GridFuncLSNumberData(SmartPtr< TGridFunction > spGridFct, const char *cmp, SmartPtr< extrapol_type > spExtrapol)
constructor
Definition grid_func_ls_user_data.h:93
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 grid_func_ls_user_data.h:119
virtual bool continuous() const
Definition grid_func_ls_user_data.h:113
size_t m_fct
Definition grid_func_ls_user_data.h:86
IInterfaceExtrapolation< domain_type, algebra_type > extrapol_type
Definition grid_func_ls_user_data.h:76
TGridFunction::algebra_type algebra_type
Definition grid_func_ls_user_data.h:73
LFEID m_lfeID
Definition grid_func_ls_user_data.h:89
SmartPtr< TGridFunction > m_spGridFct
Definition grid_func_ls_user_data.h:80
static const int dim
Definition grid_func_ls_user_data.h:67
Definition grid_func_ls_user_data.h:567
StdDataLinker< LSBearScheidegger2< TDomain, TAlgebra >, MathMatrix< TDomain::dim, TDomain::dim >, TDomain::dim > base_type
Definition grid_func_ls_user_data.h:568
SmartPtr< DependentUserData< MathMatrix< dim, dim >, dim > > m_spDDispersion_at
Definition grid_func_ls_user_data.h:736
TAlgebra algebra_type
Definition grid_func_ls_user_data.h:579
SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > m_spDispersion_at
Definition grid_func_ls_user_data.h:735
IInterfaceExtrapolation< domain_type, algebra_type > extrapol_type
Definition grid_func_ls_user_data.h:582
void evaluate(MathMatrix< dim, dim > &D, const MathVector< dim > &globIP, number time, int si) const
Definition grid_func_ls_user_data.h:606
LSBearScheidegger2(SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > spDispersion_under, SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > spDispersion_at, SmartPtr< extrapol_type > spExtrapol)
Definition grid_func_ls_user_data.h:586
SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > m_spDispersion_under
Definition grid_func_ls_user_data.h:731
void evaluate(MathMatrix< dim, dim > 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
Definition grid_func_ls_user_data.h:615
static const int dim
Definition grid_func_ls_user_data.h:573
void eval_and_deriv(MathMatrix< dim, dim > 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< MathMatrix< dim, dim > > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition grid_func_ls_user_data.h:655
SmartPtr< DependentUserData< MathMatrix< dim, dim >, dim > > m_spDDispersion_under
Definition grid_func_ls_user_data.h:732
SmartPtr< extrapol_type > m_spExtrapolation
Definition grid_func_ls_user_data.h:728
TDomain domain_type
Definition grid_func_ls_user_data.h:576
Definition grid_func_ls_user_data.h:422
SmartPtr< extrapol_type > m_spExtrapolation
Definition grid_func_ls_user_data.h:551
LSBearScheidegger(SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > spDispersion, SmartPtr< extrapol_type > spExtrapol)
Definition grid_func_ls_user_data.h:441
TAlgebra algebra_type
Definition grid_func_ls_user_data.h:434
TDomain domain_type
Definition grid_func_ls_user_data.h:431
void eval_and_deriv(MathMatrix< dim, dim > 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< MathMatrix< dim, dim > > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition grid_func_ls_user_data.h:498
StdDataLinker< LSBearScheidegger< TDomain, TAlgebra >, MathMatrix< TDomain::dim, TDomain::dim >, TDomain::dim > base_type
Definition grid_func_ls_user_data.h:423
SmartPtr< CplUserData< MathMatrix< dim, dim >, dim > > m_spDispersion
Definition grid_func_ls_user_data.h:554
static const int dim
Definition grid_func_ls_user_data.h:428
SmartPtr< DependentUserData< MathMatrix< dim, dim >, dim > > m_spDDispersion
Definition grid_func_ls_user_data.h:555
void evaluate(MathMatrix< dim, dim > &D, const MathVector< dim > &globIP, number time, int si) const
Definition grid_func_ls_user_data.h:455
IInterfaceExtrapolation< domain_type, algebra_type > extrapol_type
Definition grid_func_ls_user_data.h:437
void evaluate(MathMatrix< dim, dim > 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
Definition grid_func_ls_user_data.h:464
virtual void grads(std::vector< std::vector< grad_type > > &vvGrad, const std::vector< MathVector< dim > > &vLocPos) const=0
virtual void shapes(std::vector< std::vector< shape_type > > &vvShape, const std::vector< MathVector< dim > > &vLocPos) const=0
size_t num(int dim) const
void set_num_input(size_t num)
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
void MatSet(matrix_t &mInOut, typename matrix_t::value_type s)
MathMatrix< N, M, T >::value_type Inverse(MathMatrix< N, M, T > &mOut, const MathMatrix< M, N, T > &m)
#define UG_CATCH_THROW(msg)
void MatVecMult(vector_t_out &vOut, const matrix_t &m, const vector_t_in &v)
void VecScaleAppend(vector_t &vOut, typename vector_t::value_type s1, const vector_t &v1)
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
void VecSet(vector_t &dest, number alpha, const std::vector< size_t > vIndex)