36 ASSERT(!( ele == NULL ),
"NULL as argument of function local_matrix()\n");
38 double scale = 1/ conductivity.
value( ele->centre(), ele->element_accessor() ) / cross_section.
value( ele->centre(), ele->element_accessor() );
40 switch( ele->dim() ) {
56 xprintf(
Warn,
"Singular local matrix of the element %d\n",ele.
id());
77 switch( ele->dim() ) {
81 arma::vec3 line_vec = ele->node[1]->point() - ele->node[0]->point();
83 return - arma::norm( point - ele->node[1]->point(), 2) * line_vec / arma::dot( line_vec, line_vec) ;
85 return arma::norm( point - ele->node[0]->point(), 2) * line_vec / arma::dot( line_vec, line_vec) ;
91 arma::vec3 ex(ele->node[1]->point() - ele->node[0]->point());
94 arma::vec3 ac(ele->node[2]->point() - ele->node[0]->point());
106 (dot(u, ex) -
bas_alfa[ face ] ) * ex
107 +(dot(u, ey) -
bas_beta[ face ] ) * ey
117 return bas_delta[ face ]*(point - RT0_Y);
138 arma::vec3 line_vec = ele->node[1]->point() - ele->node[0]->point();
139 line_vec /= arma::norm(line_vec,2);
143 val = scale * arma::dot(line_vec,
144 (anisotropy.
value(ele->centre(), ele->element_accessor() )).i() * line_vec
145 ) * ele->measure() / 3.0;
149 loc[0][1] = - val / 2.0;
150 loc[1][0] = - val / 2.0;
163 double midpoint[ 3 ][ 2 ];
170 double nod_coor[ 3 ][ 2 ];
174 arma::vec3 ex(ele->node[1]->point() - ele->node[0]->point());
175 ex /= arma::norm(ex,2);
177 arma::vec3 ac(ele->node[2]->point() - ele->node[0]->point());
182 ey /= arma::norm(ey, 2);
190 arma::mat resistance_tensor = r.t() * ((anisotropy.
value(ele->centre(), ele->element_accessor() )).i() * r);
195 for( i = 0; i < 3; i++ )
196 for( j = i; j < 3; j++ ) {
198 alfa[ j ], beta[ j ],
199 resistance_tensor, poly );
203 loc[i][j] = scale * gama[i] * gama[j] * ele->measure() *
204 ( p[0] + p[1] + p[2] ) / 3.0;
205 loc[j][i] = loc[i][j];
207 for(i = 0; i < 3; i++) {
222 double u[ 3 ], v[ 3 ];
227 u[ 0 ] = ele->node[ 1 ]->getX() - ele->node[ 0 ]->getX();
228 u[ 1 ] = ele->node[ 1 ]->getY() - ele->node[ 0 ]->getY();
229 u[ 2 ] = ele->node[ 1 ]->getZ() - ele->node[ 0 ]->getZ();
230 v[ 0 ] = ele->node[ 2 ]->getX() - ele->node[ 0 ]->getX();
231 v[ 1 ] = ele->node[ 2 ]->getY() - ele->node[ 0 ]->getY();
232 v[ 2 ] = ele->node[ 2 ]->getZ() - ele->node[ 0 ]->getZ();
257 midpoint[ 0 ][ 0 ] = ( nod[ 0 ][ 0 ] + nod[ 1 ][ 0 ] ) / 2.0;
258 midpoint[ 0 ][ 1 ] = ( nod[ 0 ][ 1 ] + nod[ 1 ][ 1 ] ) / 2.0;
259 midpoint[ 1 ][ 0 ] = ( nod[ 1 ][ 0 ] + nod[ 2 ][ 0 ] ) / 2.0;
260 midpoint[ 1 ][ 1 ] = ( nod[ 1 ][ 1 ] + nod[ 2 ][ 1 ] ) / 2.0;
261 midpoint[ 2 ][ 0 ] = ( nod[ 2 ][ 0 ] + nod[ 0 ][ 0 ] ) / 2.0;
262 midpoint[ 2 ][ 1 ] = ( nod[ 2 ][ 1 ] + nod[ 0 ][ 1 ] ) / 2.0;
271 double beta[],
double gama[] )
274 nod[ 1 ][ 0 ], nod[ 1 ][ 1 ],
275 nod[ 2 ][ 0 ], nod[ 2 ][ 1 ],
278 nod[ 2 ][ 0 ], nod[ 2 ][ 1 ],
279 nod[ 0 ][ 0 ], nod[ 0 ][ 1 ],
280 alfa + 1, beta + 1, gama + 1 );
282 nod[ 0 ][ 0 ], nod[ 0 ][ 1 ],
283 nod[ 1 ][ 0 ], nod[ 1 ][ 1 ],
284 alfa + 2, beta + 2, gama + 2 );
290 double x1,
double y1,
291 double x2,
double y2,
292 double *alfa,
double *beta,
double *gama)
296 *gama = 1.0 / fabs( ( x0 - x2 ) * ( y1 - y0 ) + ( y0 - y2 ) * ( x0 - x1 ) );
302 arma::mat::fixed<2,2> a,
double poly[] )
304 poly[ 0 ] = a( 0,0 ) * al_i * al_j +
305 a( 0,1 ) * be_i * al_j +
306 a( 1,0 ) * al_i * be_j +
307 a( 1,1 ) * be_i * be_j;
309 poly[ 1 ] = ( a( 0,0 ) * al_i +
312 a( 1,0 ) * be_j ) * -1.0;
314 poly[ 2 ] = ( a( 1,1 ) * be_i +
317 a( 0,1) * al_j ) * -1.0;
318 poly[ 3 ] = a( 0,0 );
319 poly[ 4 ] = a( 0,1 ) + a( 1,0 );
320 poly[ 5 ] = a( 1,1 );
330 poly[ 1 ] * point[ 0 ] +
331 poly[ 2 ] * point[ 1 ] +
332 poly[ 3 ] * point[ 0 ] * point[ 0 ] +
333 poly[ 4 ] * point[ 0 ] * point[ 1 ] +
334 poly[ 5 ] * point[ 1 ] * point[ 1 ];
352 arma::mat resistance_tensor = (anisotropy.
value(ele->centre(), ele->element_accessor() )).i();
362 for( i = 0; i < 4; i++ )
363 for( j = i; j < 4; j++ ) {
365 alfa[ i ], beta[ i ], gama[ i ],
366 alfa[ j ], beta[ j ], gama[ j ],
367 resistance_tensor, poly );
369 loc[j][i] = loc[i][j];
371 for(i = 0; i < 4; i++) {
386 for( li = 0; li < 4; li++ ) {
387 alfa[ li ] = ele->node[ li ]->getX();
388 beta[ li ] = ele->node[ li ]->getY();
389 gama[ li ] = ele->node[ li ]->getZ();
390 pSid = ele->side( li );
391 delta[ li ] = 1.0 / ( pSid->
measure() *
395 pSid->
normal()[ 0 ] * alfa[ li ] -
396 pSid->
normal()[ 1 ] * beta[ li ] -
397 pSid->
normal()[ 2 ] * gama[ li ] ) );
404 double al_j,
double be_j,
double ga_j,
405 arma::mat::fixed<3,3> a,
double poly[] )
408 poly[ 0 ] = a( 0,0 ) * al_i * al_j +
409 a( 0,1 ) * be_i * al_j +
410 a( 0,2 ) * ga_i * al_j +
411 a( 1,0 ) * al_i * be_j +
412 a( 1,1 ) * be_i * be_j +
413 a( 1,2 ) * ga_i * be_j +
414 a( 2,0 ) * al_i * ga_j +
415 a( 2,1 ) * be_i * ga_j +
416 a( 2,2 ) * ga_i * ga_j;
418 poly[ 1 ] = ( a( 0,0 ) * al_i +
423 a( 2,0 ) * ga_j ) * -1.0;
425 poly[ 2 ] = ( a( 1,0 ) * al_i +
430 a( 2,1 ) * ga_j ) * -1.0;
432 poly[ 3 ] = ( a( 2,0 ) * al_i +
437 a( 2,2 ) * ga_j ) * -1.0;
439 poly[ 4 ] = a( 0,1 ) + a( 1,0 );
441 poly[ 5 ] = a( 0,2 ) + a( 2,0 );
443 poly[ 6 ] = a( 1,2 ) + a( 2,1 );
445 poly[ 7 ] = a( 0,0 );
447 poly[ 8 ] = a( 1,1 );
449 poly[ 9 ] = a( 2,2 );
462 t[ 0 ] = ele->centre()[ 0 ];
463 t[ 1 ] = ele->centre()[ 1 ];
464 t[ 2 ] = ele->centre()[ 2 ];
468 rc += poly[ 1 ] * v * t[ 0 ];
470 rc += poly[ 2 ] * v * t[ 1 ];
472 rc += poly[ 3 ] * v * t[ 2 ];
474 rc += poly[ 4 ] * v * ( t[ 0 ] * t[ 1 ] + 1.0 / 20.0 * (
475 ( ele->node[ 0 ]->getX() - t[ 0 ] ) * ( ele->node[ 0 ]->getY() - t[ 1 ] ) +
476 ( ele->node[ 1 ]->getX() - t[ 0 ] ) * ( ele->node[ 1 ]->getY() - t[ 1 ] ) +
477 ( ele->node[ 2 ]->getX() - t[ 0 ] ) * ( ele->node[ 2 ]->getY() - t[ 1 ] ) +
478 ( ele->node[ 3 ]->getX() - t[ 0 ] ) * ( ele->node[ 3 ]->getY() - t[ 1 ] )
481 rc += poly[ 5 ] * v * ( t[ 0 ] * t[ 2 ] + 1.0 / 20.0 * (
482 ( ele->node[ 0 ]->getX() - t[ 0 ] ) * ( ele->node[ 0 ]->getZ() - t[ 2 ] ) +
483 ( ele->node[ 1 ]->getX() - t[ 0 ] ) * ( ele->node[ 1 ]->getZ() - t[ 2 ] ) +
484 ( ele->node[ 2 ]->getX() - t[ 0 ] ) * ( ele->node[ 2 ]->getZ() - t[ 2 ] ) +
485 ( ele->node[ 3 ]->getX() - t[ 0 ] ) * ( ele->node[ 3 ]->getZ() - t[ 2 ] )
488 rc += poly[ 6 ] * v * ( t[ 1 ] * t[ 2 ] + 1.0 / 20.0 * (
489 ( ele->node[ 0 ]->getY() - t[ 1 ] ) * ( ele->node[ 0 ]->getZ() - t[ 2 ] ) +
490 ( ele->node[ 1 ]->getY() - t[ 1 ] ) * ( ele->node[ 1 ]->getZ() - t[ 2 ] ) +
491 ( ele->node[ 2 ]->getY() - t[ 1 ] ) * ( ele->node[ 2 ]->getZ() - t[ 2 ] ) +
492 ( ele->node[ 3 ]->getY() - t[ 1 ] ) * ( ele->node[ 3 ]->getZ() - t[ 2 ] )
495 rc += poly[ 7 ] * v * ( t[ 0 ] * t[ 0 ] + 1.0 / 20.0 * (
496 ( ele->node[ 0 ]->getX() - t[ 0 ] ) * ( ele->node[ 0 ]->getX() - t[ 0 ] ) +
497 ( ele->node[ 1 ]->getX() - t[ 0 ] ) * ( ele->node[ 1 ]->getX() - t[ 0 ] ) +
498 ( ele->node[ 2 ]->getX() - t[ 0 ] ) * ( ele->node[ 2 ]->getX() - t[ 0 ] ) +
499 ( ele->node[ 3 ]->getX() - t[ 0 ] ) * ( ele->node[ 3 ]->getX() - t[ 0 ] )
502 rc += poly[ 8 ] * v * ( t[ 1 ] * t[ 1 ] + 1.0 / 20.0 * (
503 ( ele->node[ 0 ]->getY() - t[ 1 ] ) * ( ele->node[ 0 ]->getY() - t[ 1 ] ) +
504 ( ele->node[ 1 ]->getY() - t[ 1 ] ) * ( ele->node[ 1 ]->getY() - t[ 1 ] ) +
505 ( ele->node[ 2 ]->getY() - t[ 1 ] ) * ( ele->node[ 2 ]->getY() - t[ 1 ] ) +
506 ( ele->node[ 3 ]->getY() - t[ 1 ] ) * ( ele->node[ 3 ]->getY() - t[ 1 ] )
509 rc += poly[ 9 ] * v * ( t[ 2 ] * t[ 2 ] + 1.0 / 20.0 * (
510 ( ele->node[ 0 ]->getZ() - t[ 2 ] ) * ( ele->node[ 0 ]->getZ() - t[ 2 ] ) +
511 ( ele->node[ 1 ]->getZ() - t[ 2 ] ) * ( ele->node[ 1 ]->getZ() - t[ 2 ] ) +
512 ( ele->node[ 2 ]->getZ() - t[ 2 ] ) * ( ele->node[ 2 ]->getZ() - t[ 2 ] ) +
513 ( ele->node[ 3 ]->getZ() - t[ 2 ] ) * ( ele->node[ 3 ]->getZ() - t[ 2 ] )
void calc_polynom_tetrahedron(double al_i, double be_i, double ga_i, double al_j, double be_j, double ga_j, arma::mat::fixed< 3, 3 > a, double poly[])
void vector_product(double u[], double v[], double x[])
void node_coordinates_triangle(ElementFullIter ele, double nod[3][2])
double polynom_value_triangle(double poly[], double point[])
void local_matrix_tetrahedron(ElementFullIter ele, FieldType &cond_anisothropy, double scale)
double polynom_integral_tetrahedron(ElementFullIter ele, double poly[])
void bas_func_0_triangle(double x0, double y0, double x1, double y1, double x2, double y2, double *alfa, double *beta, double *gama)
void basis_functions_triangle(double nod[3][2], double alfa[], double beta[], double gama[])
arma::vec3 centre() const
void local_matrix_line(ElementFullIter ele, FieldType &cond_anisothropy, double scale)
void basis_functions_tetrahedron(ElementFullIter ele, double alfa[], double beta[], double gama[], double delta[])
void normalize_vector(double u[])
int id()
Returns id of the iterator. See VectorId documentation.
void update(ElementFullIter ele, FieldType &cond_anisothropy, FieldType_Scalar &cross_section, FieldType_Scalar &conductivity)
double * inv_local_matrix()
double scalar_product(double u[], double v[])
void PrintSmallMatrix(double *mtx, int size)
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
void side_midpoint_triangle(double nod[3][2], double midpoint[3][2])
#define NUM_ZERO
Numerical helpers.
void calc_polynom_triangle(double al_i, double be_i, double al_j, double be_j, arma::mat::fixed< 2, 2 > a, double poly[])
double MatrixInverse(double *a, double *b, int size)
arma::vec3 RT0_value(ElementFullIter ele, arma::vec3 point, unsigned int face)
void local_matrix_triangle(ElementFullIter ele, FieldType &cond_anisothropy, double scale)
arma::vec3 normal() const