33#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__CONSISTENT_GRAVITY_LINKER__
34#define __H__UG__LIB_DISC__SPATIAL_DISC__CONSISTENT_GRAVITY_LINKER__
73 :
public StdDataLinker<ConsistentGravityLinker<dim>, MathVector<dim>, dim>
94 UG_THROW(
"ConsistentGravityLinker: Element required for evaluation.")
117 std::vector<MathVector<refDim> > vConsGravity(nco);
118 std::vector<MathVector<refDim> > vLocalGrad(nco);
122 std::vector<number> vDensity(nco);
124 (*m_spDensity)(&(vDensity[0]), vCornerCoords,
time, si,
125 elem, vCornerCoords, refElem.
corners(), nco, u, NULL);
129 ConsGravityMethod.template prepare<dim>
130 (&(vConsGravity[0]), nco, vCornerCoords, &(vDensity[0]),
m_gravity);
132 UG_CATCH_THROW (
"ConsistentDarcyVelLinker: Cannot prepare the consistent gravity.");
135 std::vector<MathMatrix<refDim, dim> > vJT_;
139 = ReferenceMappingProvider::get<refDim, dim>(roid, vCornerCoords);
145 for(
size_t ip = 0;
ip < nip; ++
ip)
148 trialSpace.
grads(&(vLocalGrad[0]), vLocalIP[
ip]);
155 ConsGravityMethod.template compute<dim>
156 (vValue[
ip], vLocalIP[
ip], JTInv, &(vLocalGrad[0]), &(vConsGravity[0]));
160 template <
int refDim>
168 (refElem.
corners(), refElem.
num(0), this->time_point(),
false);
179 case 1: this->
template prepare_dim_elem<1> (elem, roid, vCornerCoords);
break;
180 case 2: this->
template prepare_dim_elem<2> (elem, roid, vCornerCoords);
break;
181 case 3: this->
template prepare_dim_elem<3> (elem, roid, vCornerCoords);
break;
182 default:
UG_THROW(
"ConsistentDarcyVelLinker: Ref. dimension " << ref_dim <<
" not supported.");
186 template <
int refDim>
209 std::vector<MathVector<refDim> > vConsGravity(nco);
212 std::vector<MathMatrix<dim,refDim> > vJTInv(nip);
215 std::vector<MathVector<refDim> > vLocalGrad(nco);
223 ConsGravityMethod.template prepare<dim>
224 (&(vConsGravity[0]), nco, vCornerCoords, vDensity,
m_gravity);
226 UG_CATCH_THROW (
"ConsistentGravityLinker: Cannot prepare the consistent gravity.");
229 std::vector<MathMatrix<refDim, dim> > vJT_;
233 = ReferenceMappingProvider::get<refDim, dim>(roid, vCornerCoords);
239 for(
size_t ip = 0;
ip < nip; ++
ip)
242 trialSpace.
grads(&(vLocalGrad[0]), vLocalIP[
ip]);
248 ConsGravityMethod.template compute<dim>
249 (vValue[
ip], vLocalIP[
ip], vJTInv[
ip], &(vLocalGrad[0]), &(vConsGravity[0]));
257 this->set_zero(vvvDeriv, nip);
263 std::vector<std::vector<MathVector<refDim> > > vvDConsGravity(nco);
266 std::vector<number> DCoVal(nco);
267 DCoVal.assign(nco, 0);
268 for (
size_t co = 0; co < nco; co++)
271 vvDConsGravity[co].resize(nco);
272 ConsGravityMethod.template prepare<dim>
273 (&(vvDConsGravity[co][0]), nco, vCornerCoords, &(DCoVal[0]),
m_gravity);
277 UG_CATCH_THROW (
"ConsistentGravityLinker: Cannot prepare Consistent Gravity for its derivatives.");
283 for(
size_t fct = 0; fct <
m_spDDensity->num_fct(); ++fct)
287 if(this->num_sh(commonFct) != nco)
288 UG_THROW (
"ConsistentGravityLinker: Number of shapes mismatch.");
290 for(
size_t ip = 0;
ip < nip; ++
ip)
292 trialSpace.
grads(&(vLocalGrad[0]), vLocalIP[
ip]);
294 for(
size_t co = 0; co < nco; ++co)
299 ConsGravityMethod.template compute<dim>(deriv,
300 vLocalIP[
ip], vJTInv[
ip], &(vLocalGrad[0]), &(vvDConsGravity[co][0]));
301 VecScale(deriv, deriv, vDDensity[co]);
319 m_spDDensity = data.template cast_dynamic<DependentUserData<number, dim> >();
337 if(vGravity.size() != dim)
338 UG_THROW(
"ConsistentGravityLinker: Illegal dimension of the specified gravity vector.");
339 for(
size_t i = 0; i < dim; i++)
m_gravity[i] = vGravity[i];
Definition smart_pointer.h:107
Linker for the consistent gravity (according to P. Frolkovic)
Definition cons_gravity_linker.h:74
void set_gravity(number g)
set gravity in the z direction
Definition cons_gravity_linker.h:343
void eval_and_deriv(MathVector< dim > vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocalIP[], 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 cons_gravity_linker.h:187
void prepare_dim_elem(GridObject *elem, const ReferenceObjectID roid, const MathVector< dim > vCornerCoords[])
Definition cons_gravity_linker.h:161
SmartPtr< CplUserData< number, dim > > m_spDensity
Definition cons_gravity_linker.h:352
void evaluate(MathVector< dim > &value, const MathVector< dim > &globIP, number time, int si) const
Definition cons_gravity_linker.h:90
void set_gravity(MathVector< dim > g)
set gravity vector
Definition cons_gravity_linker.h:329
virtual void prepare_element(GridObject *elem, const MathVector< dim > vCornerCoords[])
called in the preparation for a particular element
Definition cons_gravity_linker.h:172
void evaluate(MathVector< dim > vValue[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocalIP[], const size_t nip, LocalVector *u, const MathMatrix< refDim, dim > *vJT=NULL) const
Definition cons_gravity_linker.h:98
void set_gravity(const std::vector< number > &vGravity)
set gravity from an array
Definition cons_gravity_linker.h:335
static const size_t _RHO_
import density
Definition cons_gravity_linker.h:351
static const int world_dim
The world dimension.
Definition cons_gravity_linker.h:79
ConsistentGravityLinker()
Definition cons_gravity_linker.h:82
StdDataLinker< ConsistentGravityLinker< dim >, MathVector< dim >, dim > base_type
Base class type.
Definition cons_gravity_linker.h:76
void set_no_derivatives(bool v)
Definition cons_gravity_linker.h:361
void set_density(number val)
Definition cons_gravity_linker.h:323
size_t m_densityCornerS
Definition cons_gravity_linker.h:354
bool m_noDerivatives
Definition cons_gravity_linker.h:365
SmartPtr< DependentUserData< number, dim > > m_spDDensity
Definition cons_gravity_linker.h:353
MathVector< dim > m_gravity
constant gravity
Definition cons_gravity_linker.h:357
void set_density(SmartPtr< CplUserData< number, dim > > data)
set density import
Definition cons_gravity_linker.h:316
constant scalar user data
Definition const_user_data.h:153
Type based UserData.
Definition user_data.h:506
const TData * values(size_t s) const
returns all values for a series
Definition user_data.h:521
const TData & value(size_t s, size_t ip) const
returns the value at ip
Definition user_data.h:517
dimension dependent base class for reference elements
Definition reference_element.h:183
const MathVector< dim > * corners() const
coordinates of reference corner in a vector
Definition reference_element.h:189
virtual base class for reference mappings
Definition reference_mapping_provider.h:53
virtual void jacobian_transposed(MathMatrix< dim, worldDim > &JT, const MathVector< dim > &locPos) const =0
returns transposed of jacobian
The base class for all geometric objects, such as vertices, edges, faces, volumes,...
Definition grid_base_objects.h:157
virtual ReferenceObjectID reference_object_id() const =0
number time() const
get the current evaluation time
Definition user_data.h:287
const MathVector< dim > & ip(size_t s, size_t ip) const
returns global ip
Definition user_data.h:406
void set_global_ips(size_t s, const MathVector< dim > *vPos, size_t numIP)
set global positions
Definition user_data_impl.h:231
Identifier for Local Finite Elements.
Definition local_finite_element_id.h:98
@ LAGRANGE
Definition local_finite_element_id.h:104
virtual base class for local shape function sets
Definition local_shape_function_set.h:70
virtual void grads(grad_type *vGrad, const MathVector< dim > &x) const =0
returns all gradients evaluated at a point
Definition local_algebra.h:198
A class for fixed size, dense matrices.
Definition math_matrix.h:63
a mathematical Vector with N entries.
Definition math_vector.h:97
base class for reference elements
Definition reference_element.h:70
size_t num(int dim) const
returns the number of geometric objects of dim
Definition reference_element.h:95
int dimension() const
returns the dimension where reference element lives
Definition reference_element.h:80
static const DimReferenceElement< dim > & get(ReferenceObjectID roid)
returns a dimension dependent Reference Element
Definition reference_element.h:280
combines several UserDatas to a new UserData of a specified type
Definition linker.h:54
void set_num_input(size_t num)
sets the number of inputs
Definition linker.h:107
size_t input_common_fct(size_t i, size_t fct) const
returns the number in the common FctGrp for a fct of an input
Definition linker.h:153
virtual void set_input(size_t i, SmartPtr< ICplUserData< dim > > input, SmartPtr< UserDataInfo > info)
sets an input
Definition linker.h:114
virtual bool zero_derivative() const
returns if derivative is zero
Definition linker_impl.h:179
Class for the computation of the standard version ('Voss-Souza-type') of the consistent gravity.
Definition consistent_gravity.h:100
MathMatrix< N, M, T >::value_type RightInverse(MathMatrix< N, M, T > &mOut, const MathMatrix< M, N, T > &m)
Right-Inverse of a Matrix.
Definition math_matrix_functions_common_impl.hpp:679
#define UG_CATCH_THROW(msg)
Definition error.h:64
#define UG_THROW(msg)
Definition error.h:57
double number
Definition types.h:124
void VecScale(vector_t &vOut, const vector_t &v, typename vector_t::value_type s)
scales a MathVector<N>
Definition math_vector_functions_common_impl.hpp:252
ReferenceObjectID
these ids are used to identify the shape of a geometric object.
Definition grid_base_objects.h:74
@ ROID_VERTEX
Definition grid_base_objects.h:76
SmartPtr< T, FreePolicy > make_sp(T *inst)
returns a SmartPtr for the passed raw pointer
Definition smart_pointer.h:839