Flow123d  jenkins-Flow123d-windows32-release-multijob-28
mh_fe_values.cc
Go to the documentation of this file.
1 /*
2  * mh_fe_values.cc
3  *
4  * Created on: Jul 2, 2012
5  * Author: jb
6  */
7 
8 
9 #include "system/system.hh"
10 #include "system/math_fce.h"
11 #include "mesh/mesh.h"
12 
13 #include "mh_fe_values.hh"
14 
15 
17  // allocate temp. arrays
18  loc_matrix_ = new double [4*4 + 4*4 + 4*4];
20  bas_alfa = inv_loc_matrix_ + 4*4;
21  bas_beta = bas_alfa + 4;
22  bas_gama = bas_beta +4;
23  bas_delta = bas_gama +4;
24 }
25 
26 
27 
29  delete [] loc_matrix_;
30 }
31 
32 
33 
34 void MHFEValues::update(ElementFullIter ele, FieldType &anisotropy, FieldType_Scalar &cross_section, FieldType_Scalar &conductivity) {
35 
36  ASSERT(!( ele == NULL ),"NULL as argument of function local_matrix()\n");
37 
38  double scale = 1/ conductivity.value( ele->centre(), ele->element_accessor() ) / cross_section.value( ele->centre(), ele->element_accessor() );
39  //DBGMSG("scale: %g\n", scale);
40  switch( ele->dim() ) {
41  case 1:
42  local_matrix_line( ele, anisotropy , scale);
43  break;
44  case 2:
45  local_matrix_triangle( ele, anisotropy, scale);
46  break;
47  case 3:
48  local_matrix_tetrahedron( ele, anisotropy, scale );
49  break;
50  }
51 
52  // matrix inverse
53 
54  double det = MatrixInverse(loc_matrix_, inv_loc_matrix_, ele->n_sides() );
55  if (fabs(det) < NUM_ZERO) {
56  xprintf(Warn,"Singular local matrix of the element %d\n",ele.id());
57  PrintSmallMatrix(loc_matrix_, ele->n_sides());
58  xprintf(Err,"det: %30.18e \n",det);
59  }
60 }
61 
62 
63 
65  return loc_matrix_;
66 }
67 
68 
69 
71  return inv_loc_matrix_;
72 }
73 
74 
75 
77  switch( ele->dim() ) {
78  case 1:
79  {
80 
81  arma::vec3 line_vec = ele->node[1]->point() - ele->node[0]->point();
82  if (face == 0) {
83  return - arma::norm( point - ele->node[1]->point(), 2) * line_vec / arma::dot( line_vec, line_vec) ;
84  } else {
85  return arma::norm( point - ele->node[0]->point(), 2) * line_vec / arma::dot( line_vec, line_vec) ;
86  }
87  }
88  case 2:
89  {
90  // make rotated coordinate system with triangle in plane XY, origin in A and axes X == AB
91  arma::vec3 ex(ele->node[1]->point() - ele->node[0]->point());
92  ex /= norm(ex,2);
93 
94  arma::vec3 ac(ele->node[2]->point() - ele->node[0]->point());
95  arma::vec3 ez = cross(ex, ac);
96  ez /= norm(ez,2);
97 
98  arma::vec3 ey = cross(ez,ex);
99  ey /= norm(ey, 2);
100 
101  // compute point in new coordinate system
102  arma::vec3 u = point - ele->node[0]->point();
103 
104  // compute vector value from the base function
105  return bas_gama[ face ] * (
106  (dot(u, ex) - bas_alfa[ face ] ) * ex
107  +(dot(u, ey) - bas_beta[ face ] ) * ey
108  );
109  }
110  case 3:
111  {
112  arma::vec3 RT0_Y;
113  RT0_Y[0] = bas_alfa[ face ];
114  RT0_Y[1] = bas_beta[ face ];
115  RT0_Y[2] = bas_gama[ face ];
116 
117  return bas_delta[ face ]*(point - RT0_Y);
118  }
119  }
120 
121  return arma::vec3("0 0 0");
122 }
123 
124 
125 
126 
127 
128 //=============================================================================
129 // CALCULATE LOCAL MARIX FOR LINEAR ELEMENT
130 //=============================================================================
131 void MHFEValues::local_matrix_line(ElementFullIter ele, FieldType &anisotropy, double scale )
132 {
133  double val;
135 
136  //getting vector on the line and normalizing it
137  //it is the transformation matrix from 3D to 1D line of the 1D element
138  arma::vec3 line_vec = ele->node[1]->point() - ele->node[0]->point();
139  line_vec /= arma::norm(line_vec,2);
140 
141  //transforming the conductivity in 3D to resistivity in 1D
142  //computing v_transpose * K_inverse * v
143  val = scale * arma::dot(line_vec,
144  (anisotropy.value(ele->centre(), ele->element_accessor() )).i() * line_vec
145  ) * ele->measure() / 3.0;
146 
147  loc[0][0] = val;
148  loc[1][1] = val;
149  loc[0][1] = - val / 2.0;
150  loc[1][0] = - val / 2.0;
151 
152  bas_alfa[0] = bas_alfa[1] = -1.0 / ele->measure();
153  bas_beta[0] = 1.0;
154  bas_beta[1] = 0.0;
155 }
156 
157 
158 //=============================================================================
159 // CALCULATE LOCAL MATRIX FOR TRIANGULAR ELEMENT
160 //=============================================================================
161 void MHFEValues::local_matrix_triangle( ElementFullIter ele, FieldType &anisotropy, double scale )
162 {
163  double midpoint[ 3 ][ 2 ]; // Midpoints of element's sides
164  double alfa[ 3 ]; //
165  double beta[ 3 ]; // |- Parametrs of basis functions
166  double gama[ 3 ]; // /
167  double poly[ 6 ]; // Koeficients of polynomial
168  double p[ 3 ]; // Polynomial's values in midpoints
169  int i, j; // Loops' counters
170  double nod_coor[ 3 ][ 2 ]; // Coordinates of nodes;
172 
173  // make rotated coordinate system with triangle in plane XY, origin in A and axes X == AB
174  arma::vec3 ex(ele->node[1]->point() - ele->node[0]->point());
175  ex /= arma::norm(ex,2);
176 
177  arma::vec3 ac(ele->node[2]->point() - ele->node[0]->point());
178  arma::vec3 ez = arma::cross(ex, ac);
179  ez /= norm(ez,2);
180 
181  arma::vec3 ey = arma::cross(ez,ex);
182  ey /= arma::norm(ey, 2);
183 
184  //transformation matrix from 3D to 2D plane of the 2D element
185  arma::mat r(3,2);
186  r.col(0) = ex;
187  r.col(1) = ey;
188 
189  //transforming 3D conductivity tensor to 2D resistance tensor
190  arma::mat resistance_tensor = r.t() * ((anisotropy.value(ele->centre(), ele->element_accessor() )).i() * r);
191 
192  node_coordinates_triangle( ele, nod_coor );
193  side_midpoint_triangle( nod_coor, midpoint );
194  basis_functions_triangle( nod_coor, alfa, beta, gama );
195  for( i = 0; i < 3; i++ )
196  for( j = i; j < 3; j++ ) {
197  calc_polynom_triangle( alfa[ i ], beta[ i ],
198  alfa[ j ], beta[ j ],
199  resistance_tensor, poly );
200  p[ 0 ] = polynom_value_triangle( poly, midpoint[ 0 ] );
201  p[ 1 ] = polynom_value_triangle( poly, midpoint[ 1 ] );
202  p[ 2 ] = polynom_value_triangle( poly, midpoint[ 2 ] );
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];
206  }
207  for(i = 0; i < 3; i++) {
208  bas_alfa[ i ] = alfa[ i ];
209  bas_beta[ i ] = beta[ i ];
210  bas_gama[ i ] = gama[ i ];
211  }
212  //check_local( ele );
213 }
214 
215 
216 /*
217  * Computes coordinates of vertices of the triangle in the local orthogonal system
218  * that has normalized vector V0 to V1 as the first vector of the basis.
219  */
221 {
222  double u[ 3 ], v[ 3 ]; // vectors of sides 0 and 2
223  double t[ 3 ]; // u normalized (tangenta)
224  double n[ 3 ]; // normal
225  double b[ 3 ]; // binormal
226 
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();
233 
234  vector_product( u, v, n );
235  t[ 0 ] = u[ 0 ];
236  t[ 1 ] = u[ 1 ];
237  t[ 2 ] = u[ 2 ];
238  normalize_vector( t );
239  normalize_vector( n );
240  vector_product( n, u, b );
241  normalize_vector( b );
242 
243  nod[ 0 ][ 0 ] = 0.0;
244  nod[ 0 ][ 1 ] = 0.0;
245  nod[ 1 ][ 0 ] = scalar_product( t, u );
246  nod[ 1 ][ 1 ] = scalar_product( b, u );
247  nod[ 2 ][ 0 ] = scalar_product( t, v );
248  nod[ 2 ][ 1 ] = scalar_product( b, v );
249 }
250 
251 
252 /**
253  * Computes coordinates of the side midpoints in the local orthogonal coordinate system.
254  */
255 void MHFEValues::side_midpoint_triangle( double nod[ 3 ][ 2 ], double midpoint[ 3 ][ 2 ] )
256 {
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;
263 }
264 
265 
266 
267 /*
268  * Computes coefficients of the RT basis functions.
269  */
270 void MHFEValues::basis_functions_triangle( double nod[ 3 ][ 2 ], double alfa[],
271  double beta[], double gama[] )
272 {
273  bas_func_0_triangle( nod[ 0 ][ 0 ], nod[ 0 ][ 1 ],
274  nod[ 1 ][ 0 ], nod[ 1 ][ 1 ],
275  nod[ 2 ][ 0 ], nod[ 2 ][ 1 ],
276  alfa, beta, gama );
277  bas_func_0_triangle( nod[ 1 ][ 0 ], nod[ 1 ][ 1 ],
278  nod[ 2 ][ 0 ], nod[ 2 ][ 1 ],
279  nod[ 0 ][ 0 ], nod[ 0 ][ 1 ],
280  alfa + 1, beta + 1, gama + 1 );
281  bas_func_0_triangle( nod[ 2 ][ 0 ], nod[ 2 ][ 1 ],
282  nod[ 0 ][ 0 ], nod[ 0 ][ 1 ],
283  nod[ 1 ][ 0 ], nod[ 1 ][ 1 ],
284  alfa + 2, beta + 2, gama + 2 );
285 }
286 //=============================================================================
287 // GENERATE BASIS FUNCTION FOR SIDE 0
288 //=============================================================================
289 void MHFEValues::bas_func_0_triangle( double x0, double y0,
290  double x1, double y1,
291  double x2, double y2,
292  double *alfa, double *beta, double *gama)
293 {
294  *alfa = x2;
295  *beta = y2;
296  *gama = 1.0 / fabs( ( x0 - x2 ) * ( y1 - y0 ) + ( y0 - y2 ) * ( x0 - x1 ) );
297 }
298 //=============================================================================
299 // CALCULATE POLYNOM OF SCALAR PRODUCT
300 //=============================================================================
301 void MHFEValues::calc_polynom_triangle( double al_i, double be_i, double al_j, double be_j,
302  arma::mat::fixed<2,2> a, double poly[] )
303 {
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;
308 
309  poly[ 1 ] = ( a( 0,0 ) * al_i +
310  a( 0,0 ) * al_j +
311  a( 0,1 ) * be_i +
312  a( 1,0 ) * be_j ) * -1.0;
313 
314  poly[ 2 ] = ( a( 1,1 ) * be_i +
315  a( 1,1 ) * be_j +
316  a( 1,0 ) * al_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 );
321 }
322 //=============================================================================
323 // CALCULATE VALUE OF POLYNOM IN GIVEN POINT
324 //=============================================================================
325 double MHFEValues::polynom_value_triangle( double poly[], double point[] )
326 {
327  double rc;
328 
329  rc = poly[ 0 ] +
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 ];
335  return rc;
336 }
337 
338 //=============================================================================
339 // CALCULATE LOCAL MARIX FOR SIMPLEX ELEMENT
340 //=============================================================================
341 void MHFEValues::local_matrix_tetrahedron( ElementFullIter ele, FieldType &anisotropy, double scale )
342 {
343  double alfa[ 4 ];
344  double beta[ 4 ]; // | Parametrs of basis functions
345  double gama[ 4 ]; // |
346  double delta[ 4 ]; // /
347  double poly[ 10 ]; // Koeficients of polynomial
348  int i, j; // Loops' counters
350 
351  //transforming 3D conductivity tensor to 3D resistance tensor
352  arma::mat resistance_tensor = (anisotropy.value(ele->centre(), ele->element_accessor() )).i();
353 
354  //OBSOLETE
355  //SmallMtx3 resistance_tensor = (SmallMtx3)(ele->material->hydrodynamic_resistence);
356  //compares old and new resistance tensor
357  //DBGMSG("my: %f %f %f %f\t orig: %f %f %f %f\n",
358  // my_resistance_tensor(0,0), my_resistance_tensor(0,1), my_resistance_tensor(1,0), my_resistance_tensor(1,1),
359  // resistance_tensor[0][0], resistance_tensor[0][1], resistance_tensor[1][0], resistance_tensor[1][1] );
360 
361  basis_functions_tetrahedron( ele, alfa, beta, gama, delta);
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 );
368  loc[i][j] = scale * delta[i] * delta[j] * polynom_integral_tetrahedron( ele, poly );
369  loc[j][i] = loc[i][j];
370  }
371  for(i = 0; i < 4; i++) {
372  bas_alfa[ i ] = alfa[ i ];
373  bas_beta[ i ] = beta[ i ];
374  bas_gama[ i ] = gama[ i ];
375  bas_delta[ i ] = delta[ i ];
376  }
377 }
378 //=============================================================================
379 //
380 //=============================================================================
381 void MHFEValues::basis_functions_tetrahedron( ElementFullIter ele, double alfa[], double beta[],double gama[], double delta[])
382 {
383  int li;
384  SideIter pSid;
385 
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() *
392  ( pSid->normal()[ 0 ] * pSid->centre()[ 0 ] +
393  pSid->normal()[ 1 ] * pSid->centre()[ 1 ] +
394  pSid->normal()[ 2 ] * pSid->centre()[ 2 ] -
395  pSid->normal()[ 0 ] * alfa[ li ] -
396  pSid->normal()[ 1 ] * beta[ li ] -
397  pSid->normal()[ 2 ] * gama[ li ] ) );
398  }
399 }
400 //=============================================================================
401 // CALCULATE POLYNOM OF SCALAR PRODUCT
402 //=============================================================================
403 void MHFEValues::calc_polynom_tetrahedron( double al_i, double be_i, double ga_i,
404  double al_j, double be_j, double ga_j,
405  arma::mat::fixed<3,3> a, double poly[] )
406 {
407  // Constant term
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;
417  // Term with x
418  poly[ 1 ] = ( a( 0,0 ) * al_i +
419  a( 0,1 ) * be_i +
420  a( 0,2 ) * ga_i +
421  a( 0,0 ) * al_j +
422  a( 1,0 ) * be_j +
423  a( 2,0 ) * ga_j ) * -1.0;
424  // Term with y
425  poly[ 2 ] = ( a( 1,0 ) * al_i +
426  a( 1,1 ) * be_i +
427  a( 1,2 ) * ga_i +
428  a( 0,1 ) * al_j +
429  a( 1,1 ) * be_j +
430  a( 2,1 ) * ga_j ) * -1.0;
431  // Term with z
432  poly[ 3 ] = ( a( 2,0 ) * al_i +
433  a( 2,1 ) * be_i +
434  a( 2,2 ) * ga_i +
435  a( 0,2 ) * al_j +
436  a( 1,2 ) * be_j +
437  a( 2,2 ) * ga_j ) * -1.0;
438  // Term with xy
439  poly[ 4 ] = a( 0,1 ) + a( 1,0 );
440  // Term with xz
441  poly[ 5 ] = a( 0,2 ) + a( 2,0 );
442  // Term with yz
443  poly[ 6 ] = a( 1,2 ) + a( 2,1 );
444  // Term with x^2
445  poly[ 7 ] = a( 0,0 );
446  // Term with y^2
447  poly[ 8 ] = a( 1,1 );
448  // Term with z^2
449  poly[ 9 ] = a( 2,2 );
450 }
451 //=============================================================================
452 // CALCULATE INTEGRAL OF QUADRATICAL POLYNOM OVER TETRAHEDRON
453 //=============================================================================
455 {
456  double rc;
457  double v;
458  double t[ 3 ];
459 
460  rc = 0.0;
461  v = ele->measure();
462  t[ 0 ] = ele->centre()[ 0 ];
463  t[ 1 ] = ele->centre()[ 1 ];
464  t[ 2 ] = ele->centre()[ 2 ];
465  // Constant
466  rc += poly[ 0 ] * v;
467  // Term with x
468  rc += poly[ 1 ] * v * t[ 0 ];
469  // Term with y
470  rc += poly[ 2 ] * v * t[ 1 ];
471  // Term with z
472  rc += poly[ 3 ] * v * t[ 2 ];
473  // Term with xy
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 ] )
479  ) );
480  // Term with xz
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 ] )
486  ) );
487  // Term with yz
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 ] )
493  ) );
494  // Term with x^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 ] )
500  ) );
501  // Term with y^2
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 ] )
507  ) );
508  // Term with z^2
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 ] )
514  ) );
515  return rc;
516 }
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[])
Definition: math_fce.cc:81
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 * bas_gama
Definition: mh_fe_values.hh:68
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[])
SmallVec3_t * SmallMtx3
Definition: math_fce.h:41
arma::vec3 centre() const
Definition: sides.cc:139
???
void local_matrix_line(ElementFullIter ele, FieldType &cond_anisothropy, double scale)
SmallVec4_t * SmallMtx4
Definition: math_fce.h:42
void basis_functions_tetrahedron(ElementFullIter ele, double alfa[], double beta[], double gama[], double delta[])
double * bas_delta
Definition: mh_fe_values.hh:69
void normalize_vector(double u[])
Definition: math_fce.cc:61
int id()
Returns id of the iterator. See VectorId documentation.
Definition: sys_vector.hh:189
#define ASSERT(...)
Definition: global_defs.h:120
Definition: system.hh:75
double * inv_loc_matrix_
Definition: mh_fe_values.hh:62
void update(ElementFullIter ele, FieldType &cond_anisothropy, FieldType_Scalar &cross_section, FieldType_Scalar &conductivity)
Definition: mh_fe_values.cc:34
double * inv_local_matrix()
Definition: mh_fe_values.cc:70
double scalar_product(double u[], double v[])
Definition: math_fce.cc:54
void PrintSmallMatrix(double *mtx, int size)
Definition: math_fce.cc:234
#define xprintf(...)
Definition: system.hh:104
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
Definition: field.hh:399
void side_midpoint_triangle(double nod[3][2], double midpoint[3][2])
double * bas_beta
Definition: mh_fe_values.hh:67
double measure() const
Definition: sides.cc:42
#define NUM_ZERO
Numerical helpers.
Definition: math_fce.h:51
double * local_matrix()
Definition: mh_fe_values.cc:64
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)
Definition: math_fce.cc:124
arma::vec3 RT0_value(ElementFullIter ele, arma::vec3 point, unsigned int face)
Definition: mh_fe_values.cc:76
void local_matrix_triangle(ElementFullIter ele, FieldType &cond_anisothropy, double scale)
arma::vec3 normal() const
Definition: sides.cc:65
SmallVec2_t * SmallMtx2
Definition: mh_fe_values.hh:22
double * bas_alfa
Definition: mh_fe_values.hh:66
double * loc_matrix_
Definition: mh_fe_values.hh:61
Definition: system.hh:75