OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
trplanrot.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 "../sm/Elements/PlaneStress/trplanrot.h"
36 #include "../sm/CrossSections/structuralcrosssection.h"
37 #include "../sm/Materials/structuralms.h"
38 #include "node.h"
39 #include "material.h"
40 #include "gausspoint.h"
41 #include "gaussintegrationrule.h"
42 #include "floatmatrix.h"
43 #include "floatarray.h"
44 #include "intarray.h"
45 #include "domain.h"
46 #include "verbose.h"
47 #include "load.h"
48 #include "mathfem.h"
49 #include "classfactory.h"
50 
51 namespace oofem {
52 REGISTER_Element(TrPlaneStrRot);
53 
55  TrPlaneStress2d(n, aDomain)
56 {
57  numberOfDofMans = 3;
60 }
61 
62 
63 void
65 // Sets up the array containing the four Gauss points of the receiver.
66 {
67  if ( integrationRulesArray.size() == 0 ) {
68  integrationRulesArray.resize(1);
69  integrationRulesArray [ 0 ].reset( new GaussIntegrationRule(1, this, 1, 3) );
71  }
72 }
73 
74 
75 void
77 // Returns part of strain-displacement matrix {B} of the receiver,
78 // (epsilon_x,epsilon_y,gamma_xy) = B . r
79 // type of this part is [3,9] r=(u1,w1,fi1,u2,w2,fi2,u3,w3,fi3)
80 // evaluated at gp.
81 {
82 #if 1
83  // New version (13-09-2014 /JB)
84  // Computes the B-matrix, directly taking into account the reduced
85  // integration of the fourth strain component.
86 
87  // get node coordinates
88  FloatArray x(3), y(3);
89  this->giveNodeCoordinates(x, y);
90 
91  FloatArray b(3), c(3);
92 
93  for ( int i = 1; i <= 3; i++ ) {
94  int j = i + 1 - i / 3 * 3;
95  int k = j + 1 - j / 3 * 3;
96  b.at(i) = y.at(j) - y.at(k);
97  c.at(i) = x.at(k) - x.at(j);
98  }
99 
100  // Derivatives of the shape functions (for this special interpolation)
103 
104  FloatArray center = {0.33333333, 0.33333333};
105  FloatArray nxRed = this->GiveDerivativeVX( center );
106  FloatArray nyRed = this->GiveDerivativeUY( center );
107 
108  // These are the regular shape functions of a linear triangle evaluated at the center
109  FloatArray shapeFunct = { center.at(1), center.at(2), 1.0 - center.at(1) - center.at(2) }; // = {0, 0, 1}
110 
111  double area = this->giveArea();
112  double detJ = 1.0 / ( 2.0 * area );
113  answer.resize(4, 9);
114  for ( int i = 1; i <= 3; i++ ) {
115  answer.at(1, 3 * i - 2) = b.at(i) * detJ;
116  answer.at(1, 3 * i - 0) = nx.at(i) * detJ;
117 
118  answer.at(2, 3 * i - 1) = c.at(i) * detJ;
119  answer.at(2, 3 * i - 0) = ny.at(i) * detJ;
120 
123  answer.at(3, 3 * i - 2) = c.at(i) * detJ;
124  answer.at(3, 3 * i - 1) = b.at(i) * detJ;
125  answer.at(3, 3 * i - 0) = ( nxRed.at(i) + nyRed.at(i) ) * detJ;
126 
127  // Reduced integration of the fourth strain component
128  answer.at(4, 3 * i - 2) = -1. * c.at(i) * 1.0 / 4.0 / area;
129  answer.at(4, 3 * i - 1) = b.at(i) * 1.0 / 4.0 / area;
130  answer.at(4, 3 * i - 0) = ( -4. * area * shapeFunct.at(i) + nxRed.at(i) - nyRed.at(i) ) * 1.0 / 4.0 / area;
131 
132  }
133 
134 #else
135  // OLD version - commented out 13-09-2014 // JB
136 
137  // get node coordinates
138  FloatArray x(3), y(3);
139  this->giveNodeCoordinates(x, y);
140 
141  //
142  FloatArray b(3), c(3);
143 
144  for ( int i = 1; i <= 3; i++ ) {
145  int j = i + 1 - i / 3 * 3;
146  int k = j + 1 - j / 3 * 3;
147  b.at(i) = y.at(j) - y.at(k);
148  c.at(i) = x.at(k) - x.at(j);
149  }
150 
151  //
152  double area;
153  area = this->giveArea();
154 
155  //
156  int size;
157  if ( ui == ALL_STRAINS ) {
158  size = 4;
159  ui = 4;
160  } else {
161  size = ui - li + 1;
162  }
163 
164  if ( ( size < 0 ) || ( size > 4 ) ) {
165  OOFEM_ERROR("ComputeBmatrixAt size mismatch");
166  }
167 
168  //
169  int ind = 1;
170 
171  answer.resize(size, 9);
172 
173  if ( ( li <= 2 ) ) {
176 
177  if ( ( li <= 1 ) && ( ui >= 1 ) ) {
178  for ( int i = 1; i <= 3; i++ ) {
179  answer.at(1, 3 * i - 2) = b.at(i) * 1. / ( 2. * area );
180  answer.at(1, 3 * i - 0) = nx.at(i) * 1. / ( 2. * area );
181  }
182 
183  ind++;
184  }
185 
186  if ( ( li <= 2 ) && ( ui >= 2 ) ) {
187  for ( int i = 1; i <= 3; i++ ) {
188  answer.at(2, 3 * i - 1) = c.at(i) * 1. / ( 2. * area );
189  answer.at(2, 3 * i - 0) = ny.at(i) * 1. / ( 2. * area );
190  }
191 
192  ind++;
193  }
194  }
195 
196  if ( ( li <= 3 ) && ( ui >= 3 ) ) {
197  GaussIntegrationRule ir(1, this, 1, 3);
198  ir.SetUpPointsOnTriangle(1, _PlaneStress);
199 
202 
203  for ( int i = 1; i <= 3; i++ ) {
204  answer.at(3, 3 * i - 2) = c.at(i) * 1. / ( 2. * area );
205  answer.at(3, 3 * i - 1) = b.at(i) * 1. / ( 2. * area );
206  answer.at(3, 3 * i - 0) = ( nx.at(i) + ny.at(i) ) * 1. / ( 2. * area );
207  }
208 
209  ind++;
210  }
211 
212  if ( ( li <= 4 ) && ( ui >= 4 ) ) {
213  if ( numberOfRotGaussPoints == 1 ) {
214  //reduced integration, evaluate at coordinate (0,0)
215  FloatArray center = {0.0, 0.0};
216  FloatArray shapeFunct(3);
217 
218  FloatArray nx = this->GiveDerivativeVX( center );
219  FloatArray ny = this->GiveDerivativeUY( center );
220 
221  shapeFunct.at(1) = center.at(1);
222  shapeFunct.at(2) = center.at(2);
223  shapeFunct.at(3) = 1.0 - shapeFunct.at(1) - shapeFunct.at(2);
224 
225  for ( int i = 1; i <= 3; i++ ) {
226  answer.at(ind, 3 * i - 2) = -1. * c.at(i) * 1.0 / 4.0 / area;
227  answer.at(ind, 3 * i - 1) = b.at(i) * 1.0 / 4.0 / area;
228  answer.at(ind, 3 * i - 0) = ( -4. * area * shapeFunct.at(i) + nx.at(i) - ny.at(i) ) * 1.0 / 4.0 / area;
229  }
230  }
231  }
232 
233 
234 #endif
235 
236 
237 }
238 
239 
240 void
242 // Returns the displacement interpolation matrix {N} of the receiver
243 // evaluated at gp.
244 {
245  // get node coordinates
246  FloatArray x(3), y(3);
247  this->giveNodeCoordinates(x, y);
248 
249  //
250  FloatArray b(3), c(3), d(3);
251 
252  for ( int i = 1; i <= 3; i++ ) {
253  int j = i + 1 - i / 3 * 3;
254  int k = j + 1 - j / 3 * 3;
255  b.at(i) = y.at(j) - y.at(k);
256  c.at(i) = x.at(k) - x.at(j);
257  d.at(i) = sqrt( b.at(i) * b.at(i) + c.at(i) * c.at(i) );
258  }
259 
260  //
261  FloatArray angles = this->GivePitch();
262 
263  //
264  double l1, l2, l3, f11, f12, f13, f21, f22, f23;
265 
266  l1 = iLocCoord.at(1);
267  l2 = iLocCoord.at(2);
268  l3 = 1. - l1 - l2;
269 
270  f11 = d.at(2) / 2. *l1 *l3 *sin( angles.at(2) ) - d.at(3) / 2. *l2 *l1 *sin( angles.at(3) );
271  f12 = d.at(3) / 2. *l2 *l1 *sin( angles.at(3) ) - d.at(1) / 2. *l3 *l2 *sin( angles.at(1) );
272  f13 = d.at(1) / 2. *l3 *l2 *sin( angles.at(1) ) - d.at(2) / 2. *l1 *l3 *sin( angles.at(2) );
273 
274  f21 = d.at(3) / 2. *l2 *l1 *cos( angles.at(3) ) - d.at(2) / 2. *l1 *l3 *cos( angles.at(2) );
275  f22 = d.at(1) / 2. *l3 *l2 *cos( angles.at(1) ) - d.at(3) / 2. *l2 *l1 *cos( angles.at(3) );
276  f23 = d.at(2) / 2. *l1 *l3 *cos( angles.at(2) ) - d.at(1) / 2. *l3 *l2 *cos( angles.at(1) );
277 
278  //
279  answer.resize(3, 9);
280  answer.zero();
281 
282  answer.at(1, 1) = l1;
283  answer.at(1, 3) = f11;
284  answer.at(1, 4) = l2;
285  answer.at(1, 6) = f12;
286  answer.at(1, 7) = l3;
287  answer.at(1, 9) = f13;
288 
289  answer.at(2, 2) = l1;
290  answer.at(2, 3) = f21;
291  answer.at(2, 5) = l2;
292  answer.at(2, 6) = f22;
293  answer.at(2, 8) = l3;
294  answer.at(2, 9) = f23;
295 
296  answer.at(3, 3) = l1;
297  answer.at(3, 6) = l2;
298  answer.at(3, 9) = l3;
299 }
300 
301 
302 double
304 // returns the area occupied by the receiver
305 {
307  if ( area > 0 ) { // check if previously computed
308  return area;
309  }
310 
311  // get node coordinates
312  FloatArray x(3), y(3);
313  this->giveNodeCoordinates(x, y);
314 
315  //
316  double x1, x2, x3, y1, y2, y3;
317  x1 = x.at(1);
318  x2 = x.at(2);
319  x3 = x.at(3);
320 
321  y1 = y.at(1);
322  y2 = y.at(2);
323  y3 = y.at(3);
324 
325  return ( area = fabs( 0.5 * ( x2 * y3 + x1 * y2 + y1 * x3 - x2 * y1 - x3 * y2 - x1 * y3 ) ) );
326  // return ( area = 0.5 * ( x2 * y3 + x1 * y2 + y1 * x3 - x2 * y1 - x3 * y2 - x1 * y3 ) );
327 }
328 
329 
330 void
332 {
333  FloatArray *nc1, *nc2, *nc3;
334  nc1 = this->giveNode(1)->giveCoordinates();
335  nc2 = this->giveNode(2)->giveCoordinates();
336  nc3 = this->giveNode(3)->giveCoordinates();
337 
338  x.at(1) = nc1->at(1);
339  x.at(2) = nc2->at(1);
340  x.at(3) = nc3->at(1);
341 
342  y.at(1) = nc1->at(2);
343  y.at(2) = nc2->at(2);
344  y.at(3) = nc3->at(2);
345 
346  //if (z) {
347  // z[0] = nc1->at(3);
348  // z[1] = nc2->at(3);
349  // z[2] = nc3->at(3);
350  //}
351 }
352 
353 
356 // Returns angles between each side and global x-axis
357 {
358  // get node coordinates
359  FloatArray x(3), y(3);
360  this->giveNodeCoordinates(x, y);
361 
362  //
363  FloatArray angles(3);
364 
365  for ( int i = 0; i < 3; i++ ) {
366  int j = i + 1 - i / 2 * 3;
367  int k = j + 1 - j / 2 * 3;
368  if ( x(k) == x(j) ) {
369  if ( y(k) > y(j) ) {
370  angles.at(i + 1) = M_PI / 2.;
371  } else {
372  angles.at(i + 1) = M_PI * 3. / 2.;
373  }
374  }
375 
376  if ( x(k) > x(j) ) {
377  if ( y(k) >= y(j) ) {
378  angles.at(i + 1) = atan( ( y(k) - y(j) ) / ( x(k) - x(j) ) );
379  } else {
380  angles.at(i + 1) = 2. * M_PI - atan( ( y(j) - y(k) ) / ( x(k) - x(j) ) );
381  }
382  }
383 
384  if ( x(k) < x(j) ) {
385  if ( y(k) >= y(j) ) {
386  angles.at(i + 1) = M_PI - atan( ( y(k) - y(j) ) / ( x(j) - x(k) ) );
387  } else {
388  angles.at(i + 1) = M_PI + atan( ( y(j) - y(k) ) / ( x(j) - x(k) ) );
389  }
390  }
391  }
392 
393  return angles;
394 }
395 
396 
399 {
400  // get node coordinates
401  FloatArray x(3), y(3);
402  this->giveNodeCoordinates(x, y);
403 
404  //
405  FloatArray b(3), c(3), d(3);
406 
407  for ( int i = 1; i <= 3; i++ ) {
408  int j = i + 1 - i / 3 * 3;
409  int k = j + 1 - j / 3 * 3;
410  b.at(i) = y.at(j) - y.at(k);
411  c.at(i) = x.at(k) - x.at(j);
412  d.at(i) = sqrt( b.at(i) * b.at(i) + c.at(i) * c.at(i) );
413  }
414 
415  //
416  FloatArray angles = this->GivePitch();
417 
418  //
419  FloatArray shapeFunct(3);
420  shapeFunct.at(1) = lCoords.at(1);
421  shapeFunct.at(2) = lCoords.at(2);
422  shapeFunct.at(3) = 1.0 - shapeFunct.at(1) - shapeFunct.at(2);
423 
424  //
425  FloatArray nx(3);
426 
427  for ( int i = 1; i <= 3; i++ ) {
428  int j = i + 1 - i / 3 * 3;
429  int k = j + 1 - j / 3 * 3;
430  nx.at(i) = ( d.at(j) / 2. * ( b.at(k) * shapeFunct.at(i) + shapeFunct.at(k) * b.at(i) ) * sin( angles.at(j) ) -
431  d.at(k) / 2. * ( b.at(i) * shapeFunct.at(j) + shapeFunct.at(i) * b.at(j) ) * sin( angles.at(k) ) );
432  }
433 
434  return nx;
435 }
436 
437 
440 {
441  // get node coordinates
442  FloatArray x(3), y(3);
443  this->giveNodeCoordinates(x, y);
444 
445  //
446  FloatArray b(3), c(3), d(3);
447 
448  for ( int i = 1; i <= 3; i++ ) {
449  int j = i + 1 - i / 3 * 3;
450  int k = j + 1 - j / 3 * 3;
451  b.at(i) = y.at(j) - y.at(k);
452  c.at(i) = x.at(k) - x.at(j);
453  d.at(i) = sqrt( b.at(i) * b.at(i) + c.at(i) * c.at(i) );
454  }
455 
456  //
457  FloatArray angles = this->GivePitch();
458 
459  //
460  FloatArray shapeFunct(3);
461  shapeFunct.at(1) = lCoords.at(1);
462  shapeFunct.at(2) = lCoords.at(2);
463  shapeFunct.at(3) = 1.0 - shapeFunct.at(1) - shapeFunct.at(2);
464 
465  //
466  FloatArray nx(3);
467 
468  for ( int i = 1; i <= 3; i++ ) {
469  int j = i + 1 - i / 3 * 3;
470  int k = j + 1 - j / 3 * 3;
471  nx.at(i) = ( d.at(j) / 2. * ( b.at(k) * shapeFunct.at(i) + shapeFunct.at(k) * b.at(i) ) * cos( angles.at(j) ) -
472  d.at(k) / 2. * ( b.at(i) * shapeFunct.at(j) + shapeFunct.at(i) * b.at(j) ) * cos( angles.at(k) ) ) * ( -1.0 );
473  }
474 
475  return nx;
476 }
477 
478 
481 {
482  // get node coordinates
483  FloatArray x(3), y(3);
484  this->giveNodeCoordinates(x, y);
485 
486  //
487  FloatArray b(3), c(3), d(3);
488 
489  for ( int i = 1; i <= 3; i++ ) {
490  int j = i + 1 - i / 3 * 3;
491  int k = j + 1 - j / 3 * 3;
492  b.at(i) = y.at(j) - y.at(k);
493  c.at(i) = x.at(k) - x.at(j);
494  d.at(i) = sqrt( b.at(i) * b.at(i) + c.at(i) * c.at(i) );
495  }
496 
497  //
498  FloatArray angles = this->GivePitch();
499 
500  //
501  FloatArray shapeFunct(3);
502  shapeFunct.at(1) = lCoords.at(1);
503  shapeFunct.at(2) = lCoords.at(2);
504  shapeFunct.at(3) = 1.0 - shapeFunct.at(1) - shapeFunct.at(2);
505 
506  //
507  FloatArray ny(3);
508 
509  for ( int i = 1; i <= 3; i++ ) {
510  int j = i + 1 - i / 3 * 3;
511  int k = j + 1 - j / 3 * 3;
512  ny.at(i) = ( d.at(j) / 2. * ( c.at(k) * shapeFunct.at(i) + shapeFunct.at(k) * c.at(i) ) * sin( angles.at(j) ) -
513  d.at(k) / 2. * ( c.at(i) * shapeFunct.at(j) + shapeFunct.at(i) * c.at(j) ) * sin( angles.at(k) ) );
514  }
515 
516  return ny;
517 }
518 
519 
522 {
523  // get node coordinates
524  FloatArray x(3), y(3);
525  this->giveNodeCoordinates(x, y);
526 
527  //
528  FloatArray b(3), c(3), d(3);
529 
530  for ( int i = 1; i <= 3; i++ ) {
531  int j = i + 1 - i / 3 * 3;
532  int k = j + 1 - j / 3 * 3;
533  b.at(i) = y.at(j) - y.at(k);
534  c.at(i) = x.at(k) - x.at(j);
535  d.at(i) = sqrt( b.at(i) * b.at(i) + c.at(i) * c.at(i) );
536  }
537 
538  //
539  FloatArray angles = this->GivePitch();
540 
541  //
542  FloatArray shapeFunct(3);
543  shapeFunct.at(1) = lCoords.at(1);
544  shapeFunct.at(2) = lCoords.at(2);
545  shapeFunct.at(3) = 1.0 - shapeFunct.at(1) - shapeFunct.at(2);
546 
547  //
548  FloatArray ny(3);
549 
550  for ( int i = 1; i <= 3; i++ ) {
551  int j = i + 1 - i / 3 * 3;
552  int k = j + 1 - j / 3 * 3;
553  ny.at(i) = ( d.at(j) / 2. * ( c.at(k) * shapeFunct.at(i) + shapeFunct.at(k) * c.at(i) ) * cos( angles.at(j) ) -
554  d.at(k) / 2. * ( c.at(i) * shapeFunct.at(j) + shapeFunct.at(i) * c.at(j) ) * cos( angles.at(k) ) ) * ( -1.0 );
555  }
556 
557  return ny;
558 }
559 
560 
563 {
564  IRResultType result; // Required by IR_GIVE_FIELD macro
565 
568  if ( result != IRRT_OK ) {
569  return result;
570  }
571 
574 
575  if ( !( ( numberOfGaussPoints == 1 ) ||
576  ( numberOfGaussPoints == 4 ) ||
577  ( numberOfGaussPoints == 7 ) ) ) {
579  }
580 
581  // According to the implementation of the B-matrix only one gp is supported,
582  // so it shouldn't be an optional parameter //JB
583  if ( numberOfRotGaussPoints != 1 ) {
584  OOFEM_ERROR("numberOfRotGaussPoints size mismatch - must be equal to one");
585  }
586 
587  return IRRT_OK;
588 }
589 
590 
591 void
593 {
595  cs->giveMembraneRotStiffMtrx(answer, rMode, gp, tStep);
596 }
597 
598 
599 void
601 {
603  cs->giveGeneralizedStress_MembraneRot(answer, gp, strain, tStep);
604 }
605 
606 
607 void
609 {
610  answer = {D_u, D_v, R_w};
611 }
612 
613 
614 void
616 // Computes numerically the load vector of the receiver due to the body loads, at tStep.
617 // load is assumed to be in global cs.
618 // load vector is then transformed to coordinate system in each node.
619 // (should be global coordinate system, but there may be defined
620 // different coordinate system in each node)
621 {
622  double dens, dV, load;
623  FloatArray force;
624  FloatMatrix T;
625 
626  if ( ( forLoad->giveBCGeoType() != BodyLoadBGT ) || ( forLoad->giveBCValType() != ForceLoadBVT ) ) {
627  OOFEM_ERROR("unknown load type");
628  }
629 
630  // note: force is assumed to be in global coordinate system.
631  forLoad->computeComponentArrayAt(force, tStep, mode);
632 
633  if ( force.giveSize() ) {
634  GaussPoint *gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
635 
636  dens = this->giveStructuralCrossSection()->give('d', gp);
637  dV = this->computeVolumeAround(gp) * this->giveCrossSection()->give(CS_Thickness, gp);
638 
639  answer.resize(9);
640  answer.zero();
641 
642  load = force.at(1) * dens * dV / 3.0;
643  answer.at(1) = load;
644  answer.at(4) = load;
645  answer.at(7) = load;
646 
647  load = force.at(2) * dens * dV / 3.0;
648  answer.at(2) = load;
649  answer.at(5) = load;
650  answer.at(8) = load;
651 
652  // transform result from global cs to local element cs.
653  if ( this->computeGtoLRotationMatrix(T) ) {
654  answer.rotatedWith(T, 'n');
655  }
656  } else {
657  answer.clear(); // nil resultant
658  }
659 }
660 
661 
662 double
664 //
665 // returns receiver's characteristic length for crack band models
666 // for a crack formed in the plane with normal normalToCrackPlane.
667 //
668 {
669  return this->giveCharacteristicLengthForPlaneElements(normalToCrackPlane);
670 }
671 
672 
673 int
675 {
676  if ( type == IST_StressTensor ) {
677  const FloatArray &help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
678  answer = {help.at(1), help.at(2), 0., 0., 0., help.at(3)};
679  return 1;
680  } else if ( type == IST_StrainTensor ) {
681  const FloatArray &help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
682  answer = {help.at(1), help.at(2), 0., 0., 0., help.at(3)};
683  return 1;
684  } else {
685  return TrPlaneStress2d :: giveIPValue(answer, gp, type, tStep);
686  }
687 }
688 
689 } // end namespace oofem
CrossSection * giveCrossSection()
Definition: element.C:495
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
virtual void giveGeneralizedStress_MembraneRot(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)=0
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
Class and object Domain.
Definition: domain.h:115
virtual void giveDofManDofIDMask(int inode, IntArray &) const
Returns dofmanager dof mask for node.
Definition: trplanrot.C:608
virtual double giveArea()
Definition: trplanrot.C:303
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
Definition: valuemodetype.h:78
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
Definition: trplanrot.C:76
This class implements a structural material status information.
Definition: structuralms.h:65
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
FloatArray GiveDerivativeUX(const FloatArray &lCoords)
Definition: trplanrot.C:398
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
Definition: trplanrot.C:592
virtual void computeBodyLoadVectorAt(FloatArray &answer, Load *forLoad, TimeStep *tStep, ValueModeType mode)
Computes the load vector due to body load acting on receiver, at given time step. ...
Definition: trplanrot.C:615
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes boundary condition value - its components values at given time.
Definition: load.C:82
virtual void giveNodeCoordinates(FloatArray &x, FloatArray &y)
Definition: trplanrot.C:331
Class implementing an array of integers.
Definition: intarray.h:61
MatResponseMode
Describes the character of characteristic material matrix.
void rotatedWith(FloatMatrix &r, char mode)
Returns the receiver a rotated according the change-of-base matrix r.
Definition: floatarray.C:799
Distributed body load.
Definition: bcgeomtype.h:43
virtual void giveMembraneRotStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Method for computing membrane stiffness matrix with added drilling stiffness.
FloatArray GiveDerivativeVY(const FloatArray &lCoords)
Definition: trplanrot.C:521
FloatArray GiveDerivativeVX(const FloatArray &lCoords)
Definition: trplanrot.C:439
#define M_PI
Definition: mathfem.h:52
#define OOFEM_ERROR(...)
Definition: error.h:61
REGISTER_Element(LSpace)
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: trplanrot.C:562
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
FloatArray GivePitch()
Definition: trplanrot.C:355
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.
Definition: trplanrot.C:600
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
#define ALL_STRAINS
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
Initializes the variable VERBOSE, in order to get a few intermediate messages on screen: beginning an...
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
GaussPoint * getIntegrationPoint(int n)
Access particular integration point of receiver.
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
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
Definition: gausspoint.h:205
virtual void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &answer)
Computes interpolation matrix for element unknowns.
Definition: trplanrot.C:241
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
Class representing the general Input Record.
Definition: inputrecord.h:101
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
Definition: trplanrot.C:64
This class implements an triangular three-node plane-stress elasticity finite element.
Definition: trplanstrss.h:60
void zero()
Zeroes all coefficients of receiver.
Definition: floatarray.C:658
virtual bcGeomType giveBCGeoType() const
Returns geometry character of boundary condition.
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 double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
virtual FloatArray * giveCoordinates()
Definition: node.h:114
void zero()
Zeroes all coefficient of receiver.
Definition: floatmatrix.C:1326
#define _IFT_TrPlaneStrRot_niprot
Definition: trplanrot.h:43
Load is base abstract class for all loads.
Definition: load.h:61
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
virtual bool computeGtoLRotationMatrix(FloatMatrix &answer)
Returns transformation matrix from global c.s.
Definition: element.C:1537
int giveSize() const
Returns the size of receiver.
Definition: floatarray.h:218
Abstract base class for all structural cross section models.
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual bcValType giveBCValType() const
Returns receiver load type.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Node * giveNode(int i) const
Returns reference to the i-th node of element.
Definition: element.h:610
TrPlaneStrRot(int, Domain *)
Definition: trplanrot.C:54
FloatArray GiveDerivativeUY(const FloatArray &lCoords)
Definition: trplanrot.C:480
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
Definition: trplanrot.C:663
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 int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
Definition: trplanrot.C:674
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
Definition: gausspoint.h:138
virtual int SetUpPointsOnTriangle(int nPoints, MaterialMode mode)
Sets up receiver&#39;s integration points on triangular (area coords) integration domain.
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:32 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011