20
20
/// =========================================================================
22
#include "rheolef/tensor4.h"
22
23
#include "rheolef/ublas_matrix_range.h"
23
using namespace rheolef;
24
#include "map_projector.h"
24
27
using namespace std;
25
28
using namespace ublas;
29
// [ v0 ] [ d0^T*d0 d0^T*d1 d0^T*d2 ]
30
// [ v1 ] = [ d1^T*d0 d1^T*d1 d1^T*d2 ]
31
// [ v2 ] [ d2^T*d0 d2^T*d1 d2^T*d2 ]
33
// + (sum_{k=0}^2 dk^T*dk) Id
35
// = grad^T*grad + (sum_{k=0}^2 dk^T*dk) Id
37
// In the axisymmetric case (r,z):
38
// 2D_D(0,0) += 2 ur/r vr/r r dr dz
39
// = 2 ur vr (1/r) dr dz
42
_2D_D::operator() (const geo_element& K, matrix<Float>& dd) const
44
build_gradt_grad (K, dd);
39
typedef _2D_D::size_type size_type;
42
// ------------------------------------------
44
// ------------------------------------------
47
for (size_type i = 0; i < d; i++)
48
for (size_type j = 0; j < d; j++) {
49
for (size_type k = 0; k < d; k++)
50
for (size_type r = 0; r < map_d; r++) {
52
for (size_type l = 0; l < d; l++) {
53
sum += (P(i,k)*P(l,j) + P(i,l)*P(k,j))*G(l,r);
58
// calcul de C cas surfacique
59
for (size_type k = 0; k < d; k++)
60
for (size_type r = 0; r < map_d; r++) {
61
for (size_type p = 0; p < d; p++)
62
for (size_type t = 0; t < map_d; t++) {
63
for (size_type i = 0; i < d; i++)
64
for (size_type j = 0; j < d; j++) {
65
C(i,j,k,r) += B(i,j,k,r)*B(i,j,p,t);
70
// ------------------------------------------
71
// calcul de C cas classique;
72
// ------------------------------------------
73
for (size_type r = 0; r < map_d; r++)
74
for (size_type t = 0; t < map_d; t++) {
75
for (size_type k = 0; k < d; k++) {
77
for (size_type i = 0; i < d; i++) {
78
sum += 2*G(i,r)*G(i,t);
82
for (size_type k = 0; k < d; k++)
83
for (size_type p = 0; p < d; p++) {
84
for (size_type i = 0; i < d; i++) {
85
C(k,r,p,t) += 2*G(p,r)*G(k,t);
92
_2D_D::operator() (const geo_element& K, matrix<Float>& ak) const
45
94
size_type nj = get_first_basis().size(K);
46
95
size_type ni = get_second_basis().size(K);
96
#undef USE_NEW_VERSION
97
#ifdef USE_NEW_VERSION
98
size_type d = coordinate_dimension();
99
size_type map_d = K.dimension();
100
reference_element hat_K = K;
101
size_type nx = get_first_basis().size(hat_K);
102
size_type ny = get_second_basis().size(hat_K);
103
ak.resize (d*ny, d*nx);
105
quadrature::const_iterator first = _quad.begin(hat_K);
106
quadrature::const_iterator last = _quad.end (hat_K);
110
tensor P; // P = I - nxn
112
for (size_type q = 0; first != last; first++, q++) {
113
jacobian_piola_transformation (K,q,DF);
114
invDF = pseudo_inverse_jacobian_piola_transformation (DF, map_d);
115
Float wq = is_weighted() ? weight(K,q) : Float(1);
116
wq *= weight_coordinate_system (K, q);
117
wq *= det_jacobian_piola_transformation (DF, K.dimension());
119
jacobian_piola_transformation (K,q,DF);
121
map_projector (DF, d, map_d, P);
122
compute_tensor_c (K, G, P, d, map_d, C);
123
basis_on_quadrature::const_iterator_grad grad_phi = _by_table.begin_grad(hat_K, q);
124
basis_on_quadrature::const_iterator_grad last_grad_phi = _by_table.end_grad(hat_K, q);
125
basis_on_quadrature::const_iterator_grad first_grad_psi = _bx_table.begin_grad (hat_K, q);
126
basis_on_quadrature::const_iterator_grad last_grad_psi = _bx_table.end_grad (hat_K, q);
127
for (size_type i = 0; grad_phi != last_grad_phi; grad_phi++, i++) {
128
const point& grad_phi_i = *grad_phi;
129
basis_on_quadrature::const_iterator_grad grad_psi = first_grad_psi;
130
for (size_type j = 0; grad_psi != last_grad_psi; grad_psi++, j++) {
131
const point& grad_psi_j = *grad_psi;
132
for (size_type k = 0; k < d; k++)
133
for (size_type p = 0; p < d; p++)
134
for (size_type r = 0; r < map_d; r++)
135
for (size_type t = 0; t < map_d; t++) {
136
ak(i+k*ny,j+p*nx) += C(k,r,p,t)*wq*grad_phi_i[r]*grad_psi_j[t];
141
#else // USE_OLD_VERSION
142
build_gradt_grad (K, ak);
47
143
switch (K.dimension()) {
53
149
matrix<Float> trace (ni, nj);
55
151
for (size_type k = 0; k < K.dimension(); k++) {
56
matrix_range<matrix<Float> > dk (dd, range(k*ni,(k+1)*ni),range(k*nj,(k+1)*nj));
152
matrix_range<matrix<Float> > dk (ak, range(k*ni,(k+1)*ni),range(k*nj,(k+1)*nj));
59
155
for (size_type k = 0; k < K.dimension(); k++) {
60
matrix_range<matrix<Float> > dk (dd, range(k*ni,(k+1)*ni), range(k*nj,(k+1)*nj));
156
matrix_range<matrix<Float> > dk (ak, range(k*ni,(k+1)*ni), range(k*nj,(k+1)*nj));