OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
fei3dtetlin.C
Go to the documentation of this file.
1 /*
2  *
3  * ##### ##### ###### ###### ### ###
4  * ## ## ## ## ## ## ## ### ##
5  * ## ## ## ## #### #### ## # ##
6  * ## ## ## ## ## ## ## ##
7  * ## ## ## ## ## ## ## ##
8  * ##### ##### ## ###### ## ##
9  *
10  *
11  * OOFEM : Object Oriented Finite Element Code
12  *
13  * Copyright (C) 1993 - 2013 Borek Patzak
14  *
15  *
16  *
17  * Czech Technical University, Faculty of Civil Engineering,
18  * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19  *
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2.1 of the License, or (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28  * Lesser General Public License for more details.
29  *
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the Free Software
32  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33  */
34 
35 #include "fei3dtetlin.h"
36 #include "mathfem.h"
37 #include "floatmatrix.h"
38 #include "floatarray.h"
39 #include "gaussintegrationrule.h"
40 
41 namespace oofem {
42 void
43 FEI3dTetLin :: evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
44 {
45  answer.resize(4);
46 
47  answer.at(1) = lcoords.at(1);
48  answer.at(2) = lcoords.at(2);
49  answer.at(3) = lcoords.at(3);
50  answer.at(4) = 1. - lcoords.at(1) - lcoords.at(2) - lcoords.at(3);
51 }
52 
53 double
54 FEI3dTetLin :: evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
55 {
56  double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, detJ;
57  answer.resize(4, 3);
58 
59  x1 = cellgeo.giveVertexCoordinates(1)->at(1);
60  x2 = cellgeo.giveVertexCoordinates(2)->at(1);
61  x3 = cellgeo.giveVertexCoordinates(3)->at(1);
62  x4 = cellgeo.giveVertexCoordinates(4)->at(1);
63 
64  y1 = cellgeo.giveVertexCoordinates(1)->at(2);
65  y2 = cellgeo.giveVertexCoordinates(2)->at(2);
66  y3 = cellgeo.giveVertexCoordinates(3)->at(2);
67  y4 = cellgeo.giveVertexCoordinates(4)->at(2);
68 
69  z1 = cellgeo.giveVertexCoordinates(1)->at(3);
70  z2 = cellgeo.giveVertexCoordinates(2)->at(3);
71  z3 = cellgeo.giveVertexCoordinates(3)->at(3);
72  z4 = cellgeo.giveVertexCoordinates(4)->at(3);
73 
74  detJ = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
75  ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
76  ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) );
77 
78  if ( detJ <= 0.0 ) {
79  OOFEM_ERROR("negative volume");
80  }
81 
82  answer.at(1, 1) = -( ( y3 - y2 ) * ( z4 - z2 ) - ( y4 - y2 ) * ( z3 - z2 ) );
83  answer.at(2, 1) = ( y4 - y3 ) * ( z1 - z3 ) - ( y1 - y3 ) * ( z4 - z3 );
84  answer.at(3, 1) = -( ( y1 - y4 ) * ( z2 - z4 ) - ( y2 - y4 ) * ( z1 - z4 ) );
85  answer.at(4, 1) = ( y2 - y1 ) * ( z3 - z1 ) - ( y3 - y1 ) * ( z2 - z1 );
86 
87  answer.at(1, 2) = -( ( x4 - x2 ) * ( z3 - z2 ) - ( x3 - x2 ) * ( z4 - z2 ) );
88  answer.at(2, 2) = ( x1 - x3 ) * ( z4 - z3 ) - ( x4 - x3 ) * ( z1 - z3 );
89  answer.at(3, 2) = -( ( x2 - x4 ) * ( z1 - z4 ) - ( x1 - x4 ) * ( z2 - z4 ) );
90  answer.at(4, 2) = ( x3 - x1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( z3 - z1 );
91 
92  answer.at(1, 3) = -( ( x3 - x2 ) * ( y4 - y2 ) - ( x4 - x2 ) * ( y3 - y2 ) );
93  answer.at(2, 3) = ( x4 - x3 ) * ( y1 - y3 ) - ( x1 - x3 ) * ( y4 - y3 );
94  answer.at(3, 3) = -( ( x1 - x4 ) * ( y2 - y4 ) - ( x2 - x4 ) * ( y1 - y4 ) );
95  answer.at(4, 3) = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 );
96 
97  answer.times(1. / detJ);
98 
99  return detJ;
100 }
101 
102 void
103 FEI3dTetLin :: local2global(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
104 {
105  FloatArray n;
106  this->evalN(n, lcoords, cellgeo);
107 
108  answer.clear();
109  for ( int i = 1; i <= 4; i++ ) {
110  answer.add( n.at(i), * cellgeo.giveVertexCoordinates(i) );
111  }
112 }
113 
114 #define POINT_TOL 1.e-3
115 
116 int
117 FEI3dTetLin :: global2local(FloatArray &answer, const FloatArray &coords, const FEICellGeometry &cellgeo)
118 {
119  double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, xp, yp, zp, volume;
120  answer.resize(4);
121 
122  x1 = cellgeo.giveVertexCoordinates(1)->at(1);
123  x2 = cellgeo.giveVertexCoordinates(2)->at(1);
124  x3 = cellgeo.giveVertexCoordinates(3)->at(1);
125  x4 = cellgeo.giveVertexCoordinates(4)->at(1);
126 
127  y1 = cellgeo.giveVertexCoordinates(1)->at(2);
128  y2 = cellgeo.giveVertexCoordinates(2)->at(2);
129  y3 = cellgeo.giveVertexCoordinates(3)->at(2);
130  y4 = cellgeo.giveVertexCoordinates(4)->at(2);
131 
132  z1 = cellgeo.giveVertexCoordinates(1)->at(3);
133  z2 = cellgeo.giveVertexCoordinates(2)->at(3);
134  z3 = cellgeo.giveVertexCoordinates(3)->at(3);
135  z4 = cellgeo.giveVertexCoordinates(4)->at(3);
136 
137  xp = coords.at(1);
138  yp = coords.at(2);
139  zp = coords.at(3);
140 
141  volume = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
142  ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
143  ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) ) / 6.;
144 
145  answer.resize(4);
146 
147  answer.at(1) = ( ( x3 - x2 ) * ( yp - y2 ) * ( z4 - z2 ) - ( xp - x2 ) * ( y3 - y2 ) * ( z4 - z2 ) +
148  ( x4 - x2 ) * ( y3 - y2 ) * ( zp - z2 ) - ( x4 - x2 ) * ( yp - y2 ) * ( z3 - z2 ) +
149  ( xp - x2 ) * ( y4 - y2 ) * ( z3 - z2 ) - ( x3 - x2 ) * ( y4 - y2 ) * ( zp - z2 ) ) / 6. / volume;
150 
151  answer.at(2) = ( ( x4 - x1 ) * ( yp - y1 ) * ( z3 - z1 ) - ( xp - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
152  ( x3 - x1 ) * ( y4 - y1 ) * ( zp - z1 ) - ( x3 - x1 ) * ( yp - y1 ) * ( z4 - z1 ) +
153  ( xp - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( zp - z1 ) ) / 6. / volume;
154 
155  answer.at(3) = ( ( x2 - x1 ) * ( yp - y1 ) * ( z4 - z1 ) - ( xp - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) +
156  ( x4 - x1 ) * ( y2 - y1 ) * ( zp - z1 ) - ( x4 - x1 ) * ( yp - y1 ) * ( z2 - z1 ) +
157  ( xp - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( zp - z1 ) ) / 6. / volume;
158 
159  // test if inside + clamping
160  bool inside = true;
161  for ( int i = 1; i <= 3; i++ ) {
162  if ( answer.at(i) < ( 0. - POINT_TOL ) ) {
163  answer.at(i) = 0.;
164  inside = false;
165  } else if ( answer.at(i) > ( 1. + POINT_TOL ) ) {
166  answer.at(i) = 1.;
167  inside = false;
168  }
169  }
170 
171  answer.at(4) = 1.0 - answer.at(1) - answer.at(2) - answer.at(3);
172 
173  return inside;
174 }
175 
176 
177 double
179 {
180  double detJ, x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;
181 
182  x1 = cellgeo.giveVertexCoordinates(1)->at(1);
183  x2 = cellgeo.giveVertexCoordinates(2)->at(1);
184  x3 = cellgeo.giveVertexCoordinates(3)->at(1);
185  x4 = cellgeo.giveVertexCoordinates(4)->at(1);
186 
187  y1 = cellgeo.giveVertexCoordinates(1)->at(2);
188  y2 = cellgeo.giveVertexCoordinates(2)->at(2);
189  y3 = cellgeo.giveVertexCoordinates(3)->at(2);
190  y4 = cellgeo.giveVertexCoordinates(4)->at(2);
191 
192  z1 = cellgeo.giveVertexCoordinates(1)->at(3);
193  z2 = cellgeo.giveVertexCoordinates(2)->at(3);
194  z3 = cellgeo.giveVertexCoordinates(3)->at(3);
195  z4 = cellgeo.giveVertexCoordinates(4)->at(3);
196 
197  detJ = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
198  ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
199  ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) );
200 
201  return detJ;
202 }
203 
204 
205 void
206 FEI3dTetLin :: edgeEvalN(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
207 {
208  double ksi = lcoords.at(1);
209  answer.resize(2);
210 
211  answer.at(1) = ( 1. - ksi ) * 0.5;
212  answer.at(2) = ( 1. + ksi ) * 0.5;
213 }
214 
215 void
217  const FloatArray &lcoords, const FEICellGeometry &cellgeo)
218 {
219  double coeff, l, x1, x2, y1, y2, z1, z2;
220  IntArray edgeNodes;
221  this->computeLocalEdgeMapping(edgeNodes, iedge);
222  l = this->edgeComputeLength(edgeNodes, cellgeo);
223  coeff = 1.0 / l / l;
224 
225  x1 = cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(1);
226  y1 = cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(2);
227  z1 = cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(3);
228  x2 = cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(1);
229  y2 = cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(2);
230  z2 = cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(3);
231 
232  answer.resize(2, 3);
233  answer.at(1, 1) = ( x1 - x2 ) * coeff;
234  answer.at(1, 2) = ( y1 - y2 ) * coeff;
235  answer.at(1, 3) = ( z1 - z2 ) * coeff;
236 
237  answer.at(2, 1) = ( x2 - x1 ) * coeff;
238  answer.at(2, 2) = ( y2 - y1 ) * coeff;
239  answer.at(2, 3) = ( z2 - z1 ) * coeff;
240 }
241 
242 void
244  const FloatArray &lcoords, const FEICellGeometry &cellgeo)
245 {
246  IntArray edgeNodes;
247  FloatArray n;
248  this->computeLocalEdgeMapping(edgeNodes, iedge);
249  this->edgeEvalN(n, iedge, lcoords, cellgeo);
250 
251  answer.resize(3);
252  answer.at(1) = ( n.at(1) * cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(1) +
253  n.at(2) * cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(1) );
254  answer.at(2) = ( n.at(1) * cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(2) +
255  n.at(2) * cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(2) );
256  answer.at(3) = ( n.at(1) * cellgeo.giveVertexCoordinates( edgeNodes.at(1) )->at(3) +
257  n.at(2) * cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->at(3) );
258 }
259 
260 
261 double
263 {
264  IntArray edgeNodes;
265  this->computeLocalEdgeMapping(edgeNodes, iedge);
266  return 0.5 * this->edgeComputeLength(edgeNodes, cellgeo);
267 }
268 
269 
270 void
272 {
273  int aNode = 0, bNode = 0;
274  edgeNodes.resize(2);
275 
276  if ( iedge == 1 ) { // edge between nodes 1 2
277  aNode = 1;
278  bNode = 2;
279  } else if ( iedge == 2 ) { // edge between nodes 2 3
280  aNode = 2;
281  bNode = 3;
282  } else if ( iedge == 3 ) { // edge between nodes 3 1
283  aNode = 3;
284  bNode = 1;
285  } else if ( iedge == 4 ) { // edge between nodes 1 4
286  aNode = 1;
287  bNode = 4;
288  } else if ( iedge == 5 ) { // edge between nodes 2 4
289  aNode = 2;
290  bNode = 4;
291  } else if ( iedge == 6 ) { // edge between nodes 3 4
292  aNode = 3;
293  bNode = 4;
294  } else {
295  OOFEM_ERROR("wrong egde number (%d)", iedge);
296  }
297 
298  edgeNodes.at(1) = ( aNode );
299  edgeNodes.at(2) = ( bNode );
300 }
301 
302 double
304 {
305  return cellgeo.giveVertexCoordinates( edgeNodes.at(2) )->distance( cellgeo.giveVertexCoordinates( edgeNodes.at(1) ) );
306 }
307 
308 void
309 FEI3dTetLin :: surfaceEvalN(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
310 {
311  answer.resize(3);
312 
313  answer.at(1) = lcoords.at(1);
314  answer.at(2) = lcoords.at(2);
315  answer.at(3) = 1. - lcoords.at(1) - lcoords.at(2);
316 }
317 
318 void
320  const FloatArray &lcoords, const FEICellGeometry &cellgeo)
321 {
322  double l1, l2, l3;
323  answer.resize(3);
324  IntArray nodes(3);
325 
326  computeLocalSurfaceMapping(nodes, iedge);
327 
328  l1 = lcoords.at(1);
329  l2 = lcoords.at(2);
330  l3 = 1.0 - l1 - l2;
331 
332  answer.at(1) = ( l1 * cellgeo.giveVertexCoordinates( nodes.at(1) )->at(1) +
333  l2 * cellgeo.giveVertexCoordinates( nodes.at(2) )->at(1) +
334  l3 * cellgeo.giveVertexCoordinates( nodes.at(3) )->at(1) );
335  answer.at(2) = ( l1 * cellgeo.giveVertexCoordinates( nodes.at(1) )->at(2) +
336  l2 * cellgeo.giveVertexCoordinates( nodes.at(2) )->at(2) +
337  l3 * cellgeo.giveVertexCoordinates( nodes.at(3) )->at(2) );
338  answer.at(3) = ( l1 * cellgeo.giveVertexCoordinates( nodes.at(1) )->at(3) +
339  l2 * cellgeo.giveVertexCoordinates( nodes.at(2) )->at(3) +
340  l3 * cellgeo.giveVertexCoordinates( nodes.at(3) )->at(3) );
341 }
342 
343 void
344 FEI3dTetLin :: surfaceEvaldNdx(FloatMatrix &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
345 {
346  // Note, this must be in correct order, not just the correct nodes, therefore we must use snodes;
347  IntArray snodes;
348  this->computeLocalSurfaceMapping(snodes, isurf);
349 
350  FloatArray lcoords_tet(4);
351  lcoords_tet.at(snodes.at(1)) = lcoords.at(1);
352  lcoords_tet.at(snodes.at(2)) = lcoords.at(2);
353  lcoords_tet.at(snodes.at(3)) = 1. - lcoords.at(1) - lcoords.at(2);
354 
355  FloatMatrix fullB;
356  this->evaldNdx(fullB, lcoords_tet, cellgeo);
357  answer.resize(snodes.giveSize(), 3);
358  for ( int i = 1; i <= snodes.giveSize(); ++i ) {
359  for ( int j = 1; j <= 3; ++j ) {
360  answer.at(i, j) = fullB.at(snodes.at(i), j);
361  }
362  }
363 }
364 
365 double
366 FEI3dTetLin :: surfaceEvalNormal(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
367 {
368  FloatArray a, b;
369  IntArray snodes(3);
370  this->computeLocalSurfaceMapping(snodes, isurf);
371 
372  a.beDifferenceOf( * cellgeo.giveVertexCoordinates( snodes.at(2) ), * cellgeo.giveVertexCoordinates( snodes.at(1) ) );
373  b.beDifferenceOf( * cellgeo.giveVertexCoordinates( snodes.at(3) ), * cellgeo.giveVertexCoordinates( snodes.at(1) ) );
374  answer.beVectorProductOf(a, b);
375 
376  return answer.normalize();
377 }
378 
379 double
381  const FEICellGeometry &cellgeo)
382 {
383  FloatArray c;
384  return this->surfaceEvalNormal(c, isurf, lcoords, cellgeo);
385 }
386 
387 void
389 {
390  int aNode = 0, bNode = 0, cNode = 0;
391  surfNodes.resize(3);
392 
393  if ( isurf == 1 ) { // surface 1 - nodes 1 3 2
394  aNode = 1;
395  bNode = 3;
396  cNode = 2;
397  } else if ( isurf == 2 ) { // surface 2 - nodes 1 2 4
398  aNode = 1;
399  bNode = 2;
400  cNode = 4;
401  } else if ( isurf == 3 ) { // surface 3 - nodes 2 3 4
402  aNode = 2;
403  bNode = 3;
404  cNode = 4;
405  } else if ( isurf == 4 ) { // surface 4 - nodes 1 4 3
406  aNode = 1;
407  bNode = 4;
408  cNode = 3;
409  } else {
410  OOFEM_ERROR("wrong surface number (%d)", isurf);
411  }
412 
413  surfNodes.at(1) = ( aNode );
414  surfNodes.at(2) = ( bNode );
415  surfNodes.at(3) = ( cNode );
416 }
417 
418 double
420 {
421  IntArray fNodes;
422  this->computeLocalSurfaceMapping(fNodes, iEdge);
423 
424  const FloatArray &c1 = * cellgeo.giveVertexCoordinates( fNodes.at(1) );
425  const FloatArray &c2 = * cellgeo.giveVertexCoordinates( fNodes.at(2) );
426  const FloatArray &c3 = * cellgeo.giveVertexCoordinates( fNodes.at(3) );
427 
428  return ( ( c2.at(1) * c3.at(2) - c3.at(1) * c2.at(2) ) * c1.at(3) +
429  ( c3.at(1) * c1.at(2) - c1.at(1) * c3.at(2) ) * c2.at(3) +
430  ( c1.at(1) * c2.at(2) - c2.at(1) * c1.at(2) ) * c3.at(3) ) * 0.5;
431 }
432 
435 {
436  IntegrationRule *iRule = new GaussIntegrationRule(1, NULL);
437  int points = iRule->getRequiredNumberOfIntegrationPoints(_Tetrahedra, order + 0);
438  iRule->SetUpPointsOnTetrahedra(points, _Unknown);
439  return iRule;
440 }
441 
444 {
445  IntegrationRule *iRule = new GaussIntegrationRule(1, NULL);
446  int points = iRule->getRequiredNumberOfIntegrationPoints(_Triangle, order + 0);
447  iRule->SetUpPointsOnTriangle(points, _Unknown);
448  return iRule;
449 }
450 } // end namespace oofem
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
Computes vector product (or cross product) of vectors given as parameters, , and stores the result in...
Definition: floatarray.C:415
double edgeComputeLength(IntArray &edgeNodes, const FEICellGeometry &cellgeo)
Definition: fei3dtetlin.C:303
virtual int global2local(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates local coordinates from given global ones.
Definition: fei3dtetlin.C:117
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
virtual const FloatArray * giveVertexCoordinates(int i) const =0
Class representing a general abstraction for cell geometry.
Definition: feinterpol.h:62
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
virtual int SetUpPointsOnTetrahedra(int, MaterialMode mode)
Sets up receiver&#39;s integration points on tetrahedra (volume coords) integration domain.
virtual IntegrationRule * giveBoundaryIntegrationRule(int order, int boundary)
Sets up a suitable integration rule for integrating over the requested boundary.
Definition: fei3dtetlin.C:443
virtual void surfaceLocal2global(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates edge global coordinates from given local ones.
Definition: fei3dtetlin.C:319
virtual void surfaceEvaldNdx(FloatMatrix &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of edge interpolation functions (shape functions) at given point...
Definition: fei3dtetlin.C:344
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the array of interpolation functions (shape functions) at given point.
Definition: fei3dtetlin.C:43
Class implementing an array of integers.
Definition: intarray.h:61
int & at(int i)
Coefficient access function.
Definition: intarray.h:103
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the determinant of the transformation.
Definition: fei3dtetlin.C:178
Abstract base class representing integration rule.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
virtual double evalNXIntegral(int iEdge, const FEICellGeometry &cellgeo)
Computes the integral .
Definition: fei3dtetlin.C:419
virtual double surfaceEvalNormal(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the normal out of the surface at given point.
Definition: fei3dtetlin.C:366
#define OOFEM_ERROR(...)
Definition: error.h:61
virtual void computeLocalEdgeMapping(IntArray &edgeNodes, int iedge)
Definition: fei3dtetlin.C:271
#define POINT_TOL
Definition: fei3dtetlin.C:114
void times(double f)
Multiplies receiver by factor f.
Definition: floatmatrix.C:1594
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of interpolation functions (shape functions) at given point...
Definition: fei3dtetlin.C:54
virtual double surfaceGiveTransformationJacobian(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the edge jacobian of transformation between local and global coordinates.
Definition: fei3dtetlin.C:380
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
void resize(int n)
Checks size of receiver towards requested bounds.
Definition: intarray.C:124
virtual void edgeEvalN(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the array of edge interpolation functions (shape functions) at given point.
Definition: fei3dtetlin.C:206
Class representing vector of real numbers.
Definition: floatarray.h:82
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
virtual void local2global(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates global coordinates from given local ones.
Definition: fei3dtetlin.C:103
virtual void surfaceEvalN(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the array of edge interpolation functions (shape functions) at given point.
Definition: fei3dtetlin.C:309
virtual void edgeEvaldNdx(FloatMatrix &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the matrix of derivatives of edge interpolation functions (shape functions) at given point...
Definition: fei3dtetlin.C:216
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
virtual int getRequiredNumberOfIntegrationPoints(integrationDomain dType, int approxOrder)
Abstract service.
virtual void edgeLocal2global(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates edge global coordinates from given local ones.
Definition: fei3dtetlin.C:243
virtual int SetUpPointsOnTriangle(int, MaterialMode mode)
Sets up receiver&#39;s integration points on triangular (area coords) integration domain.
virtual IntegrationRule * giveIntegrationRule(int order)
Sets up a suitable integration rule for numerical integrating over volume.
Definition: fei3dtetlin.C:434
int giveSize() const
Definition: intarray.h:203
the oofem namespace is to define a context or scope in which all oofem names are defined.
double normalize()
Normalizes receiver.
Definition: floatarray.C:828
virtual void computeLocalSurfaceMapping(IntArray &edgeNodes, int iedge)
Definition: fei3dtetlin.C:388
virtual double edgeGiveTransformationJacobian(int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the edge jacobian of transformation between local and global coordinates.
Definition: fei3dtetlin.C:262
void add(const FloatArray &src)
Adds array src to receiver.
Definition: floatarray.C:156
Class representing Gaussian-quadrature integration rule.
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:28 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011