33#ifndef __H__UG__LIB_DISC__SPATIAL_DISC__ELEM_DISC__DENSITY_DRIVEN_FLOW__FV1__CONSISTENT_GRAVITY__
34#define __H__UG__LIB_DISC__SPATIAL_DISC__ELEM_DISC__DENSITY_DRIVEN_FLOW__FV1__CONSISTENT_GRAVITY__
103 static const size_t _X_ = 0;
104 static const size_t _Y_ = 1;
105 static const size_t _Z_ = 2;
123 UG_THROW (
"StdLinConsistentGravity: Combination of the world dim " << dim <<
124 "and the reference element dim " << refDim <<
" is not implemented.");
138 UG_ASSERT (
m_nCo > 0,
"StdLinConsistentGravity: Object not initialized.");
141 VecSet(LocalGravity, 0.0);
144 for(
size_t sh = 0; sh < (size_t)
m_nCo; sh++)
145 for(
size_t d = 0; d < refDim; d++)
146 LocalGravity[d] += vConsGravity[sh][d] * vLocalGrad[sh][d];
149 MatVecMult(ConsistentGravity, JTInv, LocalGravity);
170 EdgeMapping.
update (vCorners);
175 MatVecMult (LocalGravity, JT, PhysicalGravity);
177 vConsGravity[0][
_X_] = 0.0;
178 vConsGravity[1][
_X_] = LocalGravity[
_X_]*(vDensity[0] + vDensity[1])*0.5;
195 TriangleMapping.
update (vCorners);
200 MatVecMult (LocalGravity, JT, PhysicalGravity);
202 vConsGravity[0][
_X_] = 0.0; vConsGravity[2][
_X_] = 0.0;
203 vConsGravity[1][
_X_] = LocalGravity[
_X_]*(vDensity[0] + vDensity[1])*0.5;
205 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0;
206 vConsGravity[2][
_Y_] = LocalGravity[
_Y_]*(vDensity[0] + vDensity[2])*0.5;
223 QuadMapping.
update (vCorners);
228 MatVecMult (LocalGravityAt000, JT, PhysicalGravity);
233 MatVecMult (LocalGravityAt110, JT, PhysicalGravity);
235 vConsGravity[0][
_X_] = 0.0; vConsGravity[3][
_X_] = 0.0;
236 vConsGravity[1][
_X_] = LocalGravityAt000[
_X_]*(vDensity[0] + vDensity[1])*0.5;
237 vConsGravity[2][
_X_] = LocalGravityAt110[
_X_]*(vDensity[2] + vDensity[3])*0.5;
239 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0;
240 vConsGravity[2][
_Y_] = LocalGravityAt110[
_Y_]*(vDensity[1] + vDensity[2])*0.5;
241 vConsGravity[3][
_Y_] = LocalGravityAt000[
_Y_]*(vDensity[0] + vDensity[3])*0.5;
258 TetMapping.
update (vCorners);
261 LocalPoint.x() = 0.0; LocalPoint.y() = 0.0; LocalPoint.z() = 0.0;
263 MatVecMult (LocalGravity, JT, PhysicalGravity);
265 vConsGravity[0][
_X_] = 0.0; vConsGravity[2][
_X_] = 0.0; vConsGravity[3][
_X_] = 0.0;
266 vConsGravity[1][
_X_] = LocalGravity[
_X_]*(vDensity[0] + vDensity[1])*0.5;
268 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0; vConsGravity[3][
_Y_] = 0.0;
269 vConsGravity[2][
_Y_] = LocalGravity[
_Y_]*(vDensity[0] + vDensity[2])*0.5;
271 vConsGravity[0][
_Z_] = 0.0; vConsGravity[1][
_Z_] = 0.0; vConsGravity[2][
_Z_] = 0.0;
272 vConsGravity[3][
_Z_] = LocalGravity[
_Z_]*(vDensity[0] + vDensity[3])*0.5;
292 PyramidMapping.
update (vCorners);
295 LocalPoint.x() = 0.0; LocalPoint.y() = 0.0; LocalPoint.z() = 0.0;
297 MatVecMult (LocalGravityAt000, JT, PhysicalGravity);
300 LocalPoint.x() = 1.0; LocalPoint.y() = 1.0; LocalPoint.z() = 0.0;
302 MatVecMult (LocalGravityAt110, JT, PhysicalGravity);
304 vConsGravity[0][
_X_] = 0.0; vConsGravity[3][
_X_] = 0.0; vConsGravity[4][
_X_] = 0.0;
305 vConsGravity[1][
_X_] = LocalGravityAt000[
_X_]*(vDensity[0] + vDensity[1])*0.5;
306 vConsGravity[2][
_X_] = LocalGravityAt110[
_X_]*(vDensity[2] + vDensity[3])*0.5;
308 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0; vConsGravity[4][
_Y_] = 0.0;
309 vConsGravity[2][
_Y_] = LocalGravityAt110[
_Y_]*(vDensity[1] + vDensity[2])*0.5;
310 vConsGravity[3][
_Y_] = LocalGravityAt000[
_Y_]*(vDensity[0] + vDensity[3])*0.5;
312 vConsGravity[0][
_Z_] = 0.0; vConsGravity[1][
_Z_] = 0.0;
313 vConsGravity[2][
_Z_] = 0.0; vConsGravity[3][
_Z_] = 0.0;
314 vConsGravity[4][
_Z_] = LocalGravityAt000[
_Z_]*(vDensity[0] + vDensity[4])*0.5;
328 MathVector<3> LocalGravityAt000, LocalGravityAt101, LocalGravityAt011;
331 PrismMapping.
update (vCorners);
334 LocalPoint.x() = 0.0; LocalPoint.y() = 0.0; LocalPoint.z() = 0.0;
336 MatVecMult (LocalGravityAt000, JT, PhysicalGravity);
339 LocalPoint.x() = 1.0; LocalPoint.y() = 0.0; LocalPoint.z() = 1.0;
341 MatVecMult (LocalGravityAt101, JT, PhysicalGravity);
344 LocalPoint.x() = 0.0; LocalPoint.y() = 1.0; LocalPoint.z() = 1.0;
346 MatVecMult (LocalGravityAt011, JT, PhysicalGravity);
348 vConsGravity[0][
_X_] = 0.0; vConsGravity[2][
_X_] = 0.0;
349 vConsGravity[3][
_X_] = 0.0; vConsGravity[5][
_X_] = 0.0;
350 vConsGravity[1][
_X_] = LocalGravityAt000[
_X_]*(vDensity[0] + vDensity[1])*0.5;
351 vConsGravity[4][
_X_] = LocalGravityAt011[
_X_]*(vDensity[3] + vDensity[4])*0.5;
353 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0;
354 vConsGravity[3][
_Y_] = 0.0; vConsGravity[4][
_Y_] = 0.0;
355 vConsGravity[2][
_Y_] = LocalGravityAt000[
_Y_]*(vDensity[0] + vDensity[2])*0.5;
356 vConsGravity[5][
_Y_] = LocalGravityAt011[
_Y_]*(vDensity[3] + vDensity[5])*0.5;
358 vConsGravity[0][
_Z_] = 0.0; vConsGravity[1][
_Z_] = 0.0; vConsGravity[2][
_Z_] = 0.0;
359 vConsGravity[3][
_Z_] = LocalGravityAt000[
_Z_]*(vDensity[0] + vDensity[3])*0.5;
360 vConsGravity[4][
_Z_] = LocalGravityAt101[
_Z_]*(vDensity[1] + vDensity[4])*0.5;
361 vConsGravity[5][
_Z_] = LocalGravityAt011[
_Z_]*(vDensity[2] + vDensity[5])*0.5;
375 MathVector<3> LocalGravityAt000, LocalGravityAt110, LocalGravityAt101, LocalGravityAt011;
378 HexMapping.
update (vCorners);
381 LocalPoint.x() = 0.0; LocalPoint.y() = 0.0; LocalPoint.z() = 0.0;
383 MatVecMult (LocalGravityAt000, JT, PhysicalGravity);
386 LocalPoint.x() = 1.0; LocalPoint.y() = 1.0; LocalPoint.z() = 0.0;
388 MatVecMult (LocalGravityAt110, JT, PhysicalGravity);
391 LocalPoint.x() = 1.0; LocalPoint.y() = 0.0; LocalPoint.z() = 1.0;
393 MatVecMult (LocalGravityAt101, JT, PhysicalGravity);
396 LocalPoint.x() = 0.0; LocalPoint.y() = 1.0; LocalPoint.z() = 1.0;
398 MatVecMult (LocalGravityAt011, JT, PhysicalGravity);
400 vConsGravity[0][
_X_] = 0.0; vConsGravity[3][
_X_] = 0.0;
401 vConsGravity[4][
_X_] = 0.0; vConsGravity[7][
_X_] = 0.0;
402 vConsGravity[1][
_X_] = LocalGravityAt000[
_X_]*(vDensity[0] + vDensity[1])*0.5;
403 vConsGravity[2][
_X_] = LocalGravityAt110[
_X_]*(vDensity[2] + vDensity[3])*0.5;
404 vConsGravity[5][
_X_] = LocalGravityAt101[
_X_]*(vDensity[4] + vDensity[5])*0.5;
405 vConsGravity[6][
_X_] = LocalGravityAt011[
_X_]*(vDensity[6] + vDensity[7])*0.5;
407 vConsGravity[0][
_Y_] = 0.0; vConsGravity[1][
_Y_] = 0.0;
408 vConsGravity[4][
_Y_] = 0.0; vConsGravity[5][
_Y_] = 0.0;
409 vConsGravity[2][
_Y_] = LocalGravityAt110[
_Y_]*(vDensity[1] + vDensity[2])*0.5;
410 vConsGravity[3][
_Y_] = LocalGravityAt000[
_Y_]*(vDensity[0] + vDensity[3])*0.5;
411 vConsGravity[6][
_Y_] = LocalGravityAt101[
_Y_]*(vDensity[5] + vDensity[6])*0.5;
412 vConsGravity[7][
_Y_] = LocalGravityAt011[
_Y_]*(vDensity[4] + vDensity[7])*0.5;
414 vConsGravity[0][
_Z_] = 0.0; vConsGravity[1][
_Z_] = 0.0;
415 vConsGravity[2][
_Z_] = 0.0; vConsGravity[3][
_Z_] = 0.0;
416 vConsGravity[4][
_Z_] = LocalGravityAt000[
_Z_]*(vDensity[0] + vDensity[4])*0.5;
417 vConsGravity[5][
_Z_] = LocalGravityAt101[
_Z_]*(vDensity[1] + vDensity[5])*0.5;
418 vConsGravity[6][
_Z_] = LocalGravityAt110[
_Z_]*(vDensity[2] + vDensity[6])*0.5;
419 vConsGravity[7][
_Z_] = LocalGravityAt011[
_Z_]*(vDensity[3] + vDensity[7])*0.5;
435 UG_ASSERT (n_co == 2,
"StdLinConsistentGravity: Illegal number of corners of an edge.");
437 this->
template prepare_edge<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
452 switch (m_nCo = n_co)
455 this->
template prepare_triangle<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
458 this->
template prepare_quadrilateral<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
461 UG_THROW (
"StdLinConsistentGravity: Illegal number of corners ("
462 << n_co <<
") of an element with reference dimension 2.");
478 switch (m_nCo = n_co)
481 this->
template prepare_tetrahedron<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
484 this->
template prepare_pyramid<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
487 this->
template prepare_prism<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
490 this->
template prepare_hexahedron<dim> (vConsGravity, vCorners, vDensity, PhysicalGravity);
493 UG_THROW (
"StdLinConsistentGravity: Illegal number of corners ("
494 << n_co <<
") of an element with reference dimension 3.");
538 base_type::template prepare<dim>
539 (vConsGravity, n_co, vCorners, vDensity, PhysicalGravity);
554 if (base_type::m_nCo > 0)
555 base_type::template compute<dim> (ConsistentGravity, LocalCoord, JTInv, vLocalGrad, vConsGravity);
559 UG_ASSERT (dim == refDim && base_type::m_nCo == -(refDim+1),
"StdLinConsistentGravityX: Illegal initialization of the object.");
562 VecSet (LocalGravity, 0.0);
564 for (
size_t d = 0; d < refDim; d++)
565 LocalGravity[d] = vConsGravity[d+1][dim-1];
568 MatVecMult(ConsistentGravity, JTInv, LocalGravity);
571 for (
size_t d = 0; d < dim-1; d++)
572 for (
size_t sh = 1; sh <= refDim; sh++)
573 ConsistentGravity[d] -= vConsGravity[sh][d] * LocalCoord[sh-1];
580 template <
typename refElem,
int dim>
589 number DensityIP, Diff, gradient;
594 Mapping.
update (vCorners);
597 for (
size_t i = 1; i < dim+1; i++)
599 VecSubtract (ShiftedGlobalPoint, vCorners[i], vCorners[0]);
600 Diff = ShiftedGlobalPoint [dim-1];
602 ShiftedGlobalPoint [dim-1] = 0.0;
606 for (
size_t j = 0; j < dim; j++) DensityIP -= LocalPoint[j];
607 DensityIP *= vDensity[0];
608 for (
size_t j = 1; j < dim+1; j++)
609 DensityIP += vDensity[j] * LocalPoint[j-1];
611 for(
size_t j = 0; j < dim-1; ++j)
614 for (
size_t k = 0; k < dim; k++)
615 gradient += JT[j][k] * (vDensity[k+1] - vDensity[0]);
616 vConsGravity[i][j] = Diff * PhysicalGravity[dim-1] * gradient;
618 vConsGravity[i][dim-1] = Diff * PhysicalGravity[dim-1] * (vDensity[i] + DensityIP)*0.5;
635 if (dim == 2 && n_co == 3 && PhysicalGravity[0] == 0.0)
638 this->
template prepare_simplex<ReferenceTriangle, dim>
639 (vConsGravity, vCorners, vDensity, PhysicalGravity);
642 base_type::template prepare<dim>
643 (vConsGravity, n_co, vCorners, vDensity, PhysicalGravity);
658 if (dim == 3 && n_co == 4 && PhysicalGravity[0] == 0.0 && PhysicalGravity[1] == 0.0)
661 this->
template prepare_simplex<ReferenceTetrahedron, dim>
662 (vConsGravity, vCorners, vDensity, PhysicalGravity);
665 base_type::template prepare<dim>
666 (vConsGravity, n_co, vCorners, vDensity, PhysicalGravity);
A class for fixed size, dense matrices.
Definition math_matrix.h:63
a mathematical Vector with N entries.
Definition math_vector.h:97
Definition reference_mapping.h:65
number jacobian_transposed_inverse(MathMatrix< worldDim, dim > &JTInv, const MathVector< dim > &locPos) const
returns transposed of the inverse of the jacobian and sqrt of gram determinante
void update(const MathVector< worldDim > *vCornerCoord)
refresh mapping for new set of corners
void jacobian_transposed(MathMatrix< dim, worldDim > &JT, const MathVector< dim > &locPos) const
returns transposed of jacobian
Class for the computation of the standard version ('Voss-Souza-type') of the consistent gravity.
Definition consistent_gravity.h:100
static const size_t _Y_
Definition consistent_gravity.h:104
static const size_t _X_
Definition consistent_gravity.h:103
void prepare_triangle(MathVector< 2 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a triangle
Definition consistent_gravity.h:184
void prepare(MathVector< refDim > *vConsGravity, const int n_co, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners, cf. the specializations
Definition consistent_gravity.h:115
StdLinConsistentGravity()
constructor (sets the 'not init.' flag)
Definition consistent_gravity.h:110
void prepare_quadrilateral(MathVector< 2 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a quadrilateral
Definition consistent_gravity.h:212
void prepare_edge(MathVector< 1 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of an edge
Definition consistent_gravity.h:159
void prepare_pyramid(MathVector< 3 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a pyramid
Definition consistent_gravity.h:281
void compute(MathVector< dim > &ConsistentGravity, const MathVector< refDim > &LocalCoord, const MathMatrix< dim, refDim > &JTInv, const MathVector< refDim > *vLocalGrad, const MathVector< refDim > *vConsGravity)
computation of the consistent gravity at a given point
Definition consistent_gravity.h:130
int m_nCo
number of corners of the element for which the object is init. (0 if not init)
Definition consistent_gravity.h:154
void prepare_tetrahedron(MathVector< 3 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a tetrahedron
Definition consistent_gravity.h:247
void prepare_prism(MathVector< 3 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a prism
Definition consistent_gravity.h:320
void prepare_hexahedron(MathVector< 3 > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners of a hexahedron
Definition consistent_gravity.h:367
static const size_t _Z_
Definition consistent_gravity.h:105
Class for the computation of the enhanced version ('Frolkovic-type') of the consistent gravity.
Definition consistent_gravity.h:519
void prepare(MathVector< refDim > *vConsGravity, const int n_co, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the primary function for the consistent gravity at corners, cf. the specializations
Definition consistent_gravity.h:530
StdLinConsistentGravityX()
constructor
Definition consistent_gravity.h:525
void compute(MathVector< dim > &ConsistentGravity, const MathVector< refDim > &LocalCoord, const MathMatrix< dim, refDim > &JTInv, const MathVector< refDim > *vLocalGrad, const MathVector< refDim > *vConsGravity)
computation of the consistent gravity at a given point
Definition consistent_gravity.h:546
void prepare_simplex(MathVector< refDim > *vConsGravity, const MathVector< dim > *vCorners, const number *vDensity, const MathVector< dim > &PhysicalGravity)
computation of the extended version of the corner consistent gravity for simplices (only in full dime...
Definition consistent_gravity.h:582
StdLinConsistentGravity< refDim > base_type
Definition consistent_gravity.h:520
#define UG_ASSERT(expr, msg)
Definition assert.h:70
#define UG_THROW(msg)
Definition error.h:57
double number
Definition types.h:124
void TransposedMatVecMult(vector_t_out &vOut, const matrix_t &m, const vector_t_in &v)
Transposed Matrix - Vector Muliplication.
Definition math_matrix_vector_functions_common_impl.hpp:111
void MatVecMult(vector_t_out &vOut, const matrix_t &m, const vector_t_in &v)
Matrix - Vector Multiplication.
Definition math_matrix_vector_functions_common_impl.hpp:49
void VecSet(vector_t &vInOut, typename vector_t::value_type s)
Set each vector component to scalar (componentwise)
Definition math_vector_functions_common_impl.hpp:539
void VecSubtract(vector_t &vOut, const vector_t &v1, const vector_t &v2)
subtracts v2 from v1 and stores the result in a vOut
Definition math_vector_functions_common_impl.hpp:226