OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
structural2delement.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 
36 #include "feinterpol2d.h"
37 #include "gausspoint.h"
39 #include "gaussintegrationrule.h"
40 #include "mathfem.h"
41 
42 namespace oofem {
44  NLStructuralElement(n, aDomain),
45  matRotation(false)
46 {
47  cellGeometryWrapper = NULL;
48 }
49 
51 {
52  if ( cellGeometryWrapper ) {
53  delete cellGeometryWrapper;
54  }
55 }
56 
57 
60 {
62  if ( result != IRRT_OK ) {
63  return result;
64  }
65 
66  matRotation = ir->hasField(_IFT_Structural2DElement_materialCoordinateSystem); //|| this->elemLocalCS.isNotEmpty();
67  return IRRT_OK;
68 }
69 
70 
71 void
73 {
74  // Element must be created before giveNumberOfNodes can be called
76  this->numberOfDofMans = this->giveNumberOfNodes();
77 }
78 
79 
80 int
82 {
83  return this->giveInterpolation()->giveNumberOfNodes();
84 }
85 
86 
89 {
90  if ( !cellGeometryWrapper ) {
92  }
93 
94  return cellGeometryWrapper;
95 }
96 
97 
98 int
100 {
102  IntArray dofIdMask;
103  this->giveDofManDofIDMask(-1, dofIdMask); // ok for standard elements
104  return this->giveInterpolation()->giveNumberOfNodes() * dofIdMask.giveSize();
105 }
106 
107 
108 void
110 {
111  answer = {
112  D_u, D_v
113  };
114 }
115 
116 
117 double
119 {
120  // Computes the volume element dV associated with the given gp.
121 
122  double weight = gp->giveWeight();
123  const FloatArray &lCoords = gp->giveNaturalCoordinates(); // local/natural coords of the gp (parent domain)
124  double detJ = fabs( this->giveInterpolation()->giveTransformationJacobian( lCoords, * this->giveCellGeometryWrapper() ) );
125  double thickness = this->giveCrossSection()->give(CS_Thickness, gp); // the cross section keeps track of the thickness
126 
127  return detJ * thickness * weight; // dV
128 }
129 
130 
131 void
133 {
134  // Sets up the integration rule array which contains all the Gauss points
135  // Default: create one integration rule
136  if ( integrationRulesArray.size() == 0 ) {
137  integrationRulesArray.resize(1);
138  integrationRulesArray [ 0 ].reset( new GaussIntegrationRule(1, this, 1, 3) );
140  }
141 }
142 
143 
144 void
146 {
147  if ( this->elemLocalCS.isNotEmpty() ) { // User specified orientation
148  x = {
149  elemLocalCS.at(1, 1), elemLocalCS.at(2, 1)
150  };
151  y = {
152  -x(1), x(0)
153  };
154  } else {
155  FloatMatrix jac;
156  this->giveInterpolation()->giveJacobianMatrixAt( jac, lcoords, * this->giveCellGeometryWrapper() );
157  x.beColumnOf(jac, 1); // This is {dx/dxi, dy/dxi, dz/dxi}
158  x.normalize();
159  y = {
160  -x(1), x(0)
161  };
162  }
163 }
164 
165 
166 double
168 {
169  return this->giveCharacteristicLengthForPlaneElements(normalToCrackPlane);
170 }
171 
172 
173 
174 
175 // Edge support
176 
177 void
179 {
180  /*
181  * provides dof mapping of local edge dofs (only nonzero are taken into account)
182  * to global element dofs
183  */
184  IntArray eNodes;
185  static_cast< FEInterpolation2d * >( this->giveInterpolation() )->computeLocalEdgeMapping(eNodes, iEdge);
186 
187  answer.resize(eNodes.giveSize() * 2);
188  for ( int i = 1; i <= eNodes.giveSize(); i++ ) {
189  answer.at(i * 2 - 1) = eNodes.at(i) * 2 - 1;
190  answer.at(i * 2) = eNodes.at(i) * 2;
191  }
192 }
193 
194 
195 double
197 {
198  /* Returns the line element ds associated with the given gp on the specific edge.
199  * Note: The name is misleading since there is no volume to speak of in this case.
200  * The returned value is used for integration of a line integral (external forces).
201  */
202  double detJ = static_cast< FEInterpolation2d * >( this->giveInterpolation() )->
203  edgeGiveTransformationJacobian( iEdge, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
204  return detJ * gp->giveWeight();
205 }
206 
207 
208 int
210 {
211  // returns transformation matrix from
212  // edge local coordinate system
213  // to element local c.s
214  // (same as global c.s in this case)
215  //
216  // i.e. f(element local) = T * f(edge local)
217  //
218  FloatArray normal(2);
219 
220  static_cast< FEInterpolation2d * >( this->giveInterpolation() )->
221  edgeEvalNormal( normal, iEdge, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
222 
223  answer.resize(2, 2);
224  answer.zero();
225  answer.at(1, 1) = normal.at(2);
226  answer.at(1, 2) = normal.at(1);
227  answer.at(2, 1) = -normal.at(1);
228  answer.at(2, 2) = normal.at(2);
229 
230  return 1;
231 }
232 
233 
234 
235 
236 
237 // Plane stress
238 
240  Structural2DElement(n, aDomain)
241  // Constructor. Creates an element with number n, belonging to aDomain.
242 {}
243 
244 
245 void
246 PlaneStressElement :: computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx, int upperIndx)
247 {
248  FEInterpolation *interp = this->giveInterpolation();
249  FloatMatrix dNdx;
250  interp->evaldNdx( dNdx, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
251 
252  answer.resize(3, dNdx.giveNumberOfRows() * 2);
253  answer.zero();
254 
255  for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
256  answer.at(1, i * 2 - 1) = dNdx.at(i, 1);
257  answer.at(2, i * 2 - 0) = dNdx.at(i, 2);
258 
259  answer.at(3, 2 * i - 1) = dNdx.at(i, 2);
260  answer.at(3, 2 * i - 0) = dNdx.at(i, 1);
261  }
262 }
263 
264 
265 void
267 {
268  // Returns the [ 4 x (nno*2) ] displacement gradient matrix {BH} of the receiver,
269  // evaluated at gp.
271 
272  FloatMatrix dNdx;
274 
275  answer.resize(4, dNdx.giveNumberOfRows() * 2);
276  answer.zero();
277 
278  for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
279  answer.at(1, 2 * i - 1) = dNdx.at(i, 1); // du/dx -1
280  answer.at(2, 2 * i - 0) = dNdx.at(i, 2); // dv/dy -2
281  answer.at(3, 2 * i - 1) = dNdx.at(i, 2); // du/dy -6
282  answer.at(4, 2 * i - 0) = dNdx.at(i, 1); // dv/dx -9
283  }
284 }
285 
286 
287 void
289 {
290  if ( this->matRotation ) {
292  FloatArray x, y;
293  FloatArray rotStrain, s;
294 
296  // Transform to material c.s.
297  rotStrain = {
298  e(0) * x(0) * x(0) + e(2) * x(0) * x(1) + e(1) * x(1) * x(1),
299  e(0) * y(0) * y(0) + e(2) * y(0) * y(1) + e(1) * y(1) * y(1),
300  2 * e(0) * x(0) * y(0) + 2 * e(1) * x(1) * y(1) + e(2) * ( x(1) * y(0) + x(0) * y(1) )
301  };
302 
303  this->giveStructuralCrossSection()->giveRealStress_PlaneStress(s, gp, rotStrain, tStep);
304 
305  answer = {
306  s(0) * x(0) * x(0) + 2 * s(2) * x(0) * y(0) + s(1) * y(0) * y(0),
307  s(0) * x(1) * x(1) + 2 * s(2) * x(1) * y(1) + s(1) * y(1) * y(1),
308  s(1) * y(0) * y(1) + s(0) * x(0) * x(1) + s(2) * ( x(1) * y(0) + x(0) * y(1) )
309  };
310  } else {
311  this->giveStructuralCrossSection()->giveRealStress_PlaneStress(answer, gp, e, tStep);
312  }
313 }
314 
315 
316 void
318 {
319  this->giveStructuralCrossSection()->giveStiffnessMatrix_PlaneStress(answer, rMode, gp, tStep);
320  if ( this->matRotation ) {
321  FloatArray x, y;
322  FloatMatrix Q;
323 
325 
326  Q = {
327  { x(0) * x(0), x(1) * x(1), x(0) * x(1) },
328  { y(0) * y(0), y(1) * y(1), y(0) * y(1) },
329  { 2 * x(0) * y(0), 2 * x(1) * y(1), x(1) * y(0) + x(0) * y(1) }
330  };
331  answer.rotatedWith(Q, 't');
332  }
333 }
334 
335 
336 
337 
338 
339 // Plane strain
340 
341 
343  Structural2DElement(n, aDomain)
344  // Constructor. Creates an element with number n, belonging to aDomain.
345 {}
346 
347 
348 void
349 PlaneStrainElement :: computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx, int upperIndx)
350 // Returns the [ 4 x (nno*2) ] strain-displacement matrix {B} of the receiver,
351 // evaluated at gp.
352 {
353  FEInterpolation *interp = this->giveInterpolation();
354  FloatMatrix dNdx;
355  interp->evaldNdx( dNdx, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
356 
357 
358  answer.resize(4, dNdx.giveNumberOfRows() * 2);
359  answer.zero();
360 
361  for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
362  answer.at(1, i * 2 - 1) = dNdx.at(i, 1);
363  answer.at(2, i * 2 - 0) = dNdx.at(i, 2);
364 
365  answer.at(4, 2 * i - 1) = dNdx.at(i, 2);
366  answer.at(4, 2 * i - 0) = dNdx.at(i, 1);
367  }
368 }
369 
370 
371 void
373 {
374  // Returns the [ 5 x (nno*2) ] displacement gradient matrix {BH} of the receiver,
375  // evaluated at gp.
377 
378  FloatMatrix dNdx;
380 
381  answer.resize(4, dNdx.giveNumberOfRows() * 2);
382  answer.zero();
383 
384  for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
385  answer.at(1, 2 * i - 1) = dNdx.at(i, 1); // du/dx -1
386  answer.at(2, 2 * i - 0) = dNdx.at(i, 2); // dv/dy -2
387  answer.at(4, 2 * i - 1) = dNdx.at(i, 2); // du/dy -6
388  answer.at(5, 2 * i - 0) = dNdx.at(i, 1); // dv/dx -9
389  }
390 }
391 
392 
393 void
395 {
396  if ( this->matRotation ) {
398  FloatArray x, y;
399  FloatArray rotStrain, s;
400 
402  // Transform to material c.s.
403  rotStrain = {
404  e(0) * x(0) * x(0) + e(3) * x(0) * x(1) + e(1) * x(1) * x(1),
405  e(0) * y(0) * y(0) + e(3) * y(0) * y(1) + e(1) * y(1) * y(1),
406  e(2),
407  2 * e(0) * x(0) * y(0) + 2 * e(1) * x(1) * y(1) + e(3) * ( x(1) * y(0) + x(0) * y(1) )
408  };
409  this->giveStructuralCrossSection()->giveRealStress_PlaneStrain(s, gp, rotStrain, tStep);
410  answer = {
411  s(0) * x(0) * x(0) + 2 * s(3) * x(0) * y(0) + s(1) * y(0) * y(0),
412  s(0) * x(1) * x(1) + 2 * s(3) * x(1) * y(1) + s(1) * y(1) * y(1),
413  s(2),
414  y(1) * ( s(3) * x(0) + s(1) * y(0) ) + x(1) * ( s(0) * x(0) + s(3) * y(0) )
415  };
416  } else {
417  this->giveStructuralCrossSection()->giveRealStress_PlaneStrain(answer, gp, e, tStep);
418  }
419 }
420 
421 
422 void
424 {
425  this->giveStructuralCrossSection()->giveStiffnessMatrix_PlaneStrain(answer, rMode, gp, tStep);
426  if ( this->matRotation ) {
427  FloatArray x, y;
428  FloatMatrix Q;
429 
431  Q = {
432  { x(0) * x(0), x(1) * x(1), 0, x(0) * x(1) },
433  { y(0) * y(0), y(1) * y(1), 0, y(0) * y(1) },
434  { 0, 0, 1, 0 },
435  { 2 * x(0) * y(0), 2 * x(1) * y(1), 0, x(1) * y(0) + x(0) * y(1) }
436  };
437 
438  answer.rotatedWith(Q, 't');
439  }
440 }
441 
442 
443 
444 // Axisymmetry
445 
447  Structural2DElement(n, aDomain)
448  // Constructor. Creates an element with number n, belonging to aDomain.
449 {
450  //nlGeometry = 0; // Geometrical nonlinearities disabled as default
451 }
452 
453 
454 double
456 //
457 // returns receiver's characteristic length for crack band models
458 // for a crack formed in the plane with normal normalToCrackPlane.
459 //
460 {
461  return this->giveCharacteristicLengthForAxisymmElements(normalToCrackPlane);
462 }
463 
464 
465 double
467 // Returns the portion of the receiver which is attached to gp.
468 {
469  // note: radius is accounted by interpolation (of Fei2d*Axi type)
470  double determinant = fabs( static_cast< FEInterpolation2d * >( this->giveInterpolation() )->
471  giveTransformationJacobian( gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() ) );
472 
473  double weight = gp->giveWeight();
474  return determinant * weight;
475 
476 }
477 
478 
479 void
481 //
482 // Returns the [ 6 x (nno*2) ] strain-displacement matrix {B} of the receiver,
483 // evaluated at gp.
484 // (epsilon_x,epsilon_y,...,Gamma_xy) = B . r
485 // r = ( u1,v1,u2,v2,u3,v3,u4,v4)
486 {
487  FEInterpolation *interp = this->giveInterpolation();
488 
489  FloatArray N;
490  interp->evalN( N, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
491  double r = 0.0;
492  for ( int i = 1; i <= this->giveNumberOfDofManagers(); i++ ) {
493  double x = this->giveNode(i)->giveCoordinate(1);
494  r += x * N.at(i);
495  }
496 
497  FloatMatrix dNdx;
498  interp->evaldNdx( dNdx, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
499  answer.resize(6, dNdx.giveNumberOfRows() * 2);
500  answer.zero();
501 
502  for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
503  answer.at(1, i * 2 - 1) = dNdx.at(i, 1);
504  answer.at(2, i * 2 - 0) = dNdx.at(i, 2);
505  answer.at(3, i * 2 - 1) = N.at(i) / r;
506  answer.at(6, 2 * i - 1) = dNdx.at(i, 2);
507  answer.at(6, 2 * i - 0) = dNdx.at(i, 1);
508  }
509 }
510 
511 
512 void
514 // Returns the [ 9 x (nno*2) ] displacement gradient matrix {BH} of the receiver,
515 // evaluated at gp.
516 // BH matrix - 9 rows : du/dx, dv/dy, dw/dz = u/r, 0, 0, du/dy, 0, 0, dv/dx
518 {
519  FloatArray n;
520  FloatMatrix dnx;
521  FEInterpolation2d *interp = static_cast< FEInterpolation2d * >( this->giveInterpolation() );
522 
523  interp->evalN( n, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
524  interp->evaldNdx( dnx, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
525 
526 
527  int nRows = dnx.giveNumberOfRows();
528  answer.resize(9, nRows * 2);
529  answer.zero();
530 
531  double r = 0., x;
532  for ( int i = 1; i <= this->giveNumberOfDofManagers(); i++ ) {
533  x = this->giveNode(i)->giveCoordinate(1);
534  r += x * n.at(i);
535  }
536 
537 
538  // mode is _3dMat !!!!!! answer.at(4,*), answer.at(5,*), answer.at(7,*), and answer.at(8,*) is zero
539  for ( int i = 1; i <= nRows * 2; i++ ) {
540  answer.at(1, 2 * i - 2) = dnx.at(i, 1); // du/dx
541  answer.at(2, 2 * i - 1) = dnx.at(i, 2); // dv/dy
542  answer.at(6, 2 * i - 2) = dnx.at(i, 2); // du/dy
543  answer.at(9, 2 * i - 1) = dnx.at(i, 1); // dv/dx
544  }
545 
546  for ( int i = 0; i < this->giveNumberOfDofManagers(); i++ ) {
547  answer.at(3, 2 * i + 1) = n.at(i + 1) / r;
548  }
549 }
550 
551 
552 double
554 {
555  FloatArray c(2);
556  double result = static_cast< FEInterpolation2d * >( this->giveInterpolation() )->
557  edgeGiveTransformationJacobian( iEdge, gp->giveNaturalCoordinates(), * this->giveCellGeometryWrapper() );
558 
559 
560  return result * gp->giveWeight();
561  // note: radius taken into account by Fei*Axi interpolation
562 }
563 
564 
565 void
567 {
568  // Sets up the integration rule array which contains all the Gauss points
569  if ( integrationRulesArray.size() == 0 ) {
570  integrationRulesArray.resize(1);
571  integrationRulesArray [ 0 ].reset( new GaussIntegrationRule(1, this, 1, 6) );
573  }
574 }
575 
576 void
578 {
579  if ( this->matRotation ) {
581  FloatArray x, y;
582  FloatArray rotStrain, s;
583 
585  // Transform to material c.s.
586  rotStrain = {
587  e(0) * x(0) * x(0) + e(5) * x(0) * x(1) + e(1) * x(1) * x(1),
588  e(0) * y(0) * y(0) + e(5) * y(0) * y(1) + e(1) * y(1) * y(1),
589  e(2),
590  e(4) * y(0) + e(3) * y(1),
591  e(4) * x(0) + e(3) * x(1),
592  2 * e(0) * x(0) * y(0) + 2 * e(1) * x(1) * y(1) + e(5) * ( x(1) * y(0) + x(0) * y(1) )
593  };
594  this->giveStructuralCrossSection()->giveRealStress_3d(s, gp, rotStrain, tStep);
595  answer = {
596  s(0) * x(0) * x(0) + 2 * s(5) * x(0) * y(0) + s(1) * y(0) * y(0),
597  s(0) * x(1) * x(1) + 2 * s(5) * x(1) * y(1) + s(1) * y(1) * y(1),
598  s(2),
599  s(4) * x(1) + s(3) * y(1),
600  s(4) * x(0) + s(3) * y(0),
601  y(1) * ( s(5) * x(0) + s(1) * y(0) ) + x(1) * ( s(0) * x(0) + s(5) * y(0) )
602  };
603  } else {
604  this->giveStructuralCrossSection()->giveRealStress_3d(answer, gp, e, tStep);
605  }
606 }
607 
608 void
610  MatResponseMode rMode, GaussPoint *gp,
611  TimeStep *tStep)
612 {
613  this->giveStructuralCrossSection()->giveStiffnessMatrix_3d(answer, rMode, gp, tStep);
614  if ( this->matRotation ) {
615  FloatArray x, y;
616  FloatMatrix Q;
617 
619  Q = {
620  { x(0) * x(0), x(1) * x(1), 0, 0, 0, x(0) * x(1) },
621  { y(0) * y(0), y(1) * y(1), 0, 0, 0, y(0) * y(1) },
622  { 0, 0, 1, 0, 0, 0 },
623  { 0, 0, 0, y(1), y(0), 0 },
624  { 0, 0, 0, x(1), x(0), 0 },
625  { 2 * x(0) * y(0), 2 * x(1) * y(1), 0, 0, 0, x(1) * y(0) + x(0) * y(1) }
626  };
627 
628  answer.rotatedWith(Q, 't');
629  }
630 }
631 } // end namespace oofem
virtual FEICellGeometry * giveCellGeometryWrapper()
Returns the Cell Geometry Wrapper.
CrossSection * giveCrossSection()
Definition: element.C:495
virtual void giveStiffnessMatrix_PlaneStrain(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
virtual void postInitialize()
Performs post initialization steps.
Definition: element.C:752
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the array of interpolation functions (shape functions) at given point.
virtual void giveRealStress_PlaneStress(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)=0
Class and object Domain.
Definition: domain.h:115
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
virtual double computeEdgeVolumeAround(GaussPoint *gp, int iEdge)
Computes volume related to integration point on local edge.
virtual double giveCharacteristicLength(const FloatArray &crackToNormalPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
Abstract base class for "structural" finite elements with geometrical nonlinearities.
virtual int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp)
Returns transformation matrix from local edge c.s to element local coordinate system of load vector c...
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
Class representing a general abstraction for surface finite element interpolation class...
Definition: feinterpol2d.h:45
Class representing a general abstraction for cell geometry.
Definition: feinterpol.h:62
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
AxisymElement(int n, Domain *d)
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
Computes a matrix which, multiplied by the column matrix of nodal displacements, gives the displaceme...
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
virtual double giveCoordinate(int i)
Definition: node.C:82
void giveMaterialOrientationAt(FloatArray &x, FloatArray &y, const FloatArray &lcoords)
Class implementing an array of integers.
Definition: intarray.h:61
int & at(int i)
Coefficient access function.
Definition: intarray.h:103
MatResponseMode
Describes the character of characteristic material matrix.
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
virtual int giveNumberOfNodes() const
Returns number of nodes of receiver.
virtual int giveNumberOfNodes() const
Returns the number of geometric nodes of the receiver.
Definition: feinterpol.h:486
virtual int giveNumberOfDofManagers() const
Definition: element.h:656
virtual FEInterpolation * giveInterpolation() const
Definition: element.h:629
void beColumnOf(const FloatMatrix &mat, int col)
Reciever will be set to a given column in a matrix.
Definition: floatarray.C:1114
virtual double computeEdgeVolumeAround(GaussPoint *gp, int iEdge)
Computes volume related to integration point on local edge.
Class representing a general abstraction for finite element interpolation class.
Definition: feinterpol.h:132
bool isNotEmpty() const
Tests for empty matrix.
Definition: floatmatrix.h:162
FloatMatrix elemLocalCS
Transformation material matrix, used in orthotropic and anisotropic materials, global->local transfor...
Definition: element.h:173
PlaneStrainElement(int n, Domain *d)
virtual double giveWeight()
Returns integration weight of receiver.
Definition: gausspoint.h:181
virtual void giveRealStress_PlaneStrain(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)=0
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
#define _IFT_Structural2DElement_materialCoordinateSystem
[optional] Support for material directions based on element orientation.
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
void rotatedWith(const FloatMatrix &r, char mode= 'n')
Returns the receiver &#39;a&#39; transformed using give transformation matrix r.
Definition: floatmatrix.C:1557
PlaneStressElement(int n, Domain *d)
Wrapper around element definition to provide FEICellGeometry interface.
Definition: feinterpol.h:95
virtual void giveStiffnessMatrix_PlaneStress(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
#define N(p, q)
Definition: mdm.C:367
double giveCharacteristicLengthForAxisymmElements(const FloatArray &normalToCrackPlane)
Returns the size of an axisymmetric element in the given direction if the direction is in the XY plan...
Definition: element.C:1186
virtual ~Structural2DElement()
Destructor.
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
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 double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
Sets up integration rule for the given element.
Definition: crosssection.C:54
int numberOfGaussPoints
Number of integration points as specified by nip.
Definition: element.h:188
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the stress vector of receiver at given integration point, at time step tStep.
virtual void giveRealStress_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)=0
Class representing vector of real numbers.
Definition: floatarray.h:82
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
virtual double give(CrossSectionProperty a, GaussPoint *gp)
Returns the value of cross section property at given point.
Definition: crosssection.C:151
Structural2DElement(int n, Domain *d)
Constructor.
double giveCharacteristicLengthForPlaneElements(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction if the direction is in the XY plane, otherwise gives the mean size defined as the square root of the element area.
Definition: element.C:1170
virtual void giveJacobianMatrixAt(FloatMatrix &jacobianMatrix, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Gives the jacobian matrix at the local coordinates.
Definition: feinterpol.h:232
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
virtual void postInitialize()
Performs post initialization steps.
Class representing the general Input Record.
Definition: inputrecord.h:101
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the stress vector of receiver at given integration point, at time step tStep.
Base class for planar 2D elements.
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)
Computes the stress vector of receiver at given integration point, at time step tStep.
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
std::vector< std::unique_ptr< IntegrationRule > > integrationRulesArray
List of integration rules of receiver (each integration rule contains associated integration points a...
Definition: element.h:170
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
void zero()
Zeroes all coefficient of receiver.
Definition: floatmatrix.C:1326
virtual void giveEdgeDofMapping(IntArray &answer, int iEdge) const
Assembles edge dof mapping mask, which provides mapping between edge local DOFs and "global" element ...
virtual int computeNumberOfDofs()
Computes or simply returns total number of element&#39;s local DOFs.
int giveSize() const
Definition: intarray.h:203
FEICellGeometry * cellGeometryWrapper
To facilitate the transformation of 2d elements into 3d, the complexity of transformation from 3d to ...
virtual void giveStiffnessMatrix_3d(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Method for computing the stiffness matrix.
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveDofManDofIDMask(int inode, IntArray &answer) const
Returns dofmanager dof mask for node.
double normalize()
Normalizes receiver.
Definition: floatarray.C:828
Node * giveNode(int i) const
Returns reference to the i-th node of element.
Definition: element.h:610
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
int giveNumberOfRows() const
Returns number of rows of receiver.
Definition: floatmatrix.h:156
Class representing integration point in finite element program.
Definition: gausspoint.h:93
Class representing solution step.
Definition: timestep.h:80
int numberOfDofMans
Number of dofmanagers.
Definition: element.h:149
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the matrix of derivatives of interpolation functions (shape functions) at given point...
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
Computes a matrix which, multiplied by the column matrix of nodal displacements, gives the displaceme...
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
Definition: gausspoint.h:138
Class representing Gaussian-quadrature integration rule.

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:31 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011