OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
dkt.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/Plates/dkt.h"
36 #include "../sm/Materials/structuralms.h"
37 #include "../sm/CrossSections/structuralcrosssection.h"
38 #include "fei2dtrlin.h"
39 #include "node.h"
40 #include "material.h"
41 #include "crosssection.h"
42 #include "gausspoint.h"
43 #include "gaussintegrationrule.h"
44 #include "floatmatrix.h"
45 #include "floatarray.h"
46 #include "intarray.h"
47 #include "load.h"
48 #include "mathfem.h"
49 #include "classfactory.h"
50 
51 #ifdef __OOFEG
52  #include "oofeggraphiccontext.h"
53 #endif
54 
55 namespace oofem {
56 REGISTER_Element(DKTPlate);
57 
58 FEI2dTrLin DKTPlate :: interp_lin(1, 2);
59 
60 DKTPlate :: DKTPlate(int n, Domain *aDomain) :
61  NLStructuralElement(n, aDomain),
64 {
65  numberOfDofMans = 3;
67  area = 0;
68 }
69 
70 
73 
74 
77 {
78  return & interp_lin;
79 }
80 
81 
82 void
84 // Sets up the array containing the four Gauss points of the receiver.
85 {
86  if ( integrationRulesArray.size() == 0 ) {
87  integrationRulesArray.resize( 1 );
88  integrationRulesArray [ 0 ].reset( new GaussIntegrationRule(1, this, 1, 5) );
90  }
91 }
92 
93 
94 void
96 // Computes numerically the load vector of the receiver due to the body loads, at tStep.
97 // load is assumed to be in global cs.
98 // load vector is then transformed to coordinate system in each node.
99 // (should be global coordinate system, but there may be defined
100 // different coordinate system in each node)
101 {
102  FloatArray force;
103  FloatMatrix T;
104 
105  if ( ( forLoad->giveBCGeoType() != BodyLoadBGT ) || ( forLoad->giveBCValType() != ForceLoadBVT ) ) {
106  OOFEM_ERROR("unknown load type");
107  }
108 
109  GaussIntegrationRule irule(1, this, 1, 5);
110  irule.SetUpPointsOnTriangle(1, _2dPlate);
111 
112  // note: force is assumed to be in global coordinate system.
113  forLoad->computeComponentArrayAt(force, tStep, mode);
114 
115  if ( force.giveSize() ) {
116  GaussPoint *gp = irule.getIntegrationPoint(0);
117  double dens = this->giveStructuralCrossSection()->give('d', gp);
118  double dV = this->computeVolumeAround(gp) * this->giveCrossSection()->give(CS_Thickness, gp);
119 
120  answer.resize(9);
121  answer.zero();
122 
123  double load = force.at(1) * dens * dV / 3.0;
124  answer.at(1) = load;
125  answer.at(4) = load;
126  answer.at(7) = load;
127 
128  // transform result from global cs to local element cs.
129  if ( this->computeGtoLRotationMatrix(T) ) {
130  answer.rotatedWith(T, 'n');
131  }
132  } else {
133  answer.clear(); // nil resultant
134  }
135 }
136 
137 
138 void
140 // Returns the [5x9] strain-displacement matrix {B} of the receiver,
141 // evaluated at gp.
142 // strain components xx, yy, zz, xz, yz
143 {
144  // get node coordinates
145  double x1, x2, x3, y1, y2, y3, z1, z2, z3;
146  this->giveNodeCoordinates(x1, x2, x3, y1, y2, y3, z1, z2, z3);
147 
148 
149  double ksi = gp->giveNaturalCoordinate(1);
150  double eta = gp->giveNaturalCoordinate(2);
151 
152  double N1dk = 4.0 * ksi - 1.0;
153  double N2dk = 0.0;
154  double N3dk = -3.0 + 4.0 * ksi + 4.0 * eta;
155  double N4dk = 4.0 * eta;
156  double N5dk = -4.0 * eta;
157  double N6dk = 4.0 * ( 1.0 - 2.0 * ksi - eta );
158 
159  double N1de = 0.0;
160  double N2de = 4.0 * eta - 1.0;
161  double N3de = -3.0 + 4.0 * eta + 4.0 * ksi;
162  double N4de = 4.0 * ksi;
163  double N5de = 4.0 * ( 1.0 - 2.0 * eta - ksi );
164  double N6de = -4.0 * ksi;
165 
166  double A = N1dk * x1 + N2dk * x2 + N3dk * x3 + N4dk * ( x1 + x2 ) / 2 + N5dk * ( x2 + x3 ) / 2 + N6dk * ( x1 + x3 ) / 2;
167  double B = N1dk * y1 + N2dk * y2 + N3dk * y3 + N4dk * ( y1 + y2 ) / 2 + N5dk * ( y2 + y3 ) / 2 + N6dk * ( y1 + y3 ) / 2;
168  double C = N1de * x1 + N2de * x2 + N3de * x3 + N4de * ( x1 + x2 ) / 2 + N5de * ( x2 + x3 ) / 2 + N6de * ( x1 + x3 ) / 2;
169  double D = N1de * y1 + N2de * y2 + N3de * y3 + N4de * ( y1 + y2 ) / 2 + N5de * ( y2 + y3 ) / 2 + N6de * ( y1 + y3 ) / 2;
170 
171  double dxdk = D / ( A * D - B * C );
172  double dydk = -C / ( A * D - B * C );
173  double dxde = -B / ( A * D - B * C );
174  double dyde = A / ( A * D - B * C );
175 
176  double dN102 = N1dk * dxdk + N1de * dxde;
177  double dN104 = N2dk * dxdk + N2de * dxde;
178  double dN106 = N3dk * dxdk + N3de * dxde;
179  double dN108 = N4dk * dxdk + N4de * dxde;
180  double dN110 = N5dk * dxdk + N5de * dxde;
181  double dN112 = N6dk * dxdk + N6de * dxde;
182 
183  double dN201 = -N1dk * dydk - N1de * dyde;
184  double dN203 = -N2dk * dydk - N2de * dyde;
185  double dN205 = -N3dk * dydk - N3de * dyde;
186  double dN207 = -N4dk * dydk - N4de * dyde;
187  double dN209 = -N5dk * dydk - N5de * dyde;
188  double dN211 = -N6dk * dydk - N6de * dyde;
189 
190  // normals on element sides
191  double dx4 = x2 - x1;
192  double dy4 = y2 - y1;
193  double l4 = sqrt(dx4 * dx4 + dy4 * dy4);
194 
195  double dx5 = x3 - x2;
196  double dy5 = y3 - y2;
197  double l5 = sqrt(dx5 * dx5 + dy5 * dy5);
198 
199  double dx6 = x1 - x3;
200  double dy6 = y1 - y3;
201  double l6 = sqrt(dx6 * dx6 + dy6 * dy6);
202 
203  double c4 = dy4 / l4;
204  double s4 = -dx4 / l4;
205 
206  double c5 = dy5 / l5;
207  double s5 = -dx5 / l5;
208 
209  double c6 = dy6 / l6;
210  double s6 = -dx6 / l6;
211 
212  // transformation matrix between element DOFs (w, fi_x, fi_y) and DOFs of element with qudratic rotations
213  double T11 = -1.5 / l4 * c4;
214  double T12 = -0.25 * c4 * c4 + 0.5 * s4 * s4;
215  double T13 = -0.25 * c4 * s4 - 0.5 * c4 * s4;
216  double T14 = 1.5 / l4 * c4;
217  double T15 = -0.25 * c4 * c4 + 0.5 * s4 * s4;
218  double T16 = -0.25 * c4 * s4 - 0.5 * c4 * s4;
219 
220  double T21 = -1.5 / l4 * s4;
221  double T22 = -0.25 * c4 * s4 - 0.5 * c4 * s4;
222  double T23 = -0.25 * s4 * s4 + 0.5 * c4 * c4;
223  double T24 = 1.5 / l4 * s4;
224  double T25 = -0.25 * c4 * s4 - 0.5 * c4 * s4;
225  double T26 = -0.25 * s4 * s4 + 0.5 * c4 * c4;
226 
227  double T34 = -1.5 / l5 * c5;
228  double T35 = -0.25 * c5 * c5 + 0.5 * s5 * s5;
229  double T36 = -0.25 * c5 * s5 - 0.5 * c5 * s5;
230  double T37 = 1.5 / l5 * c5;
231  double T38 = -0.25 * c5 * c5 + 0.5 * s5 * s5;
232  double T39 = -0.25 * c5 * s5 - 0.5 * c5 * s5;
233 
234  double T44 = -1.5 / l5 * s5;
235  double T45 = -0.25 * c5 * s5 - 0.5 * c5 * s5;
236  double T46 = -0.25 * s5 * s5 + 0.5 * c5 * c5;
237  double T47 = 1.5 / l5 * s5;
238  double T48 = -0.25 * c5 * s5 - 0.5 * c5 * s5;
239  double T49 = -0.25 * s5 * s5 + 0.5 * c5 * c5;
240 
241  double T51 = 1.5 / l6 * c6;
242  double T52 = -0.25 * c6 * c6 + 0.5 * s6 * s6;
243  double T53 = -0.25 * c6 * s6 - 0.5 * c6 * s6;
244  double T57 = -1.5 / l6 * c6;
245  double T58 = -0.25 * c6 * c6 + 0.5 * s6 * s6;
246  double T59 = -0.25 * c6 * s6 - 0.5 * c6 * s6;
247 
248  double T61 = 1.5 / l6 * s6;
249  double T62 = -0.25 * c6 * s6 - 0.5 * c6 * s6;
250  double T63 = -0.25 * s6 * s6 + 0.5 * c6 * c6;
251  double T67 = -1.5 / l6 * s6;
252  double T68 = -0.25 * c6 * s6 - 0.5 * c6 * s6;
253  double T69 = -0.25 * s6 * s6 + 0.5 * c6 * c6;
254 
255  answer.resize(5, 9);
256  answer.zero();
257 
258  answer.at(1, 1) = T21 * dN108 + T61 * dN112;
259  answer.at(1, 2) = T22 * dN108 + T62 * dN112;
260  answer.at(1, 3) = dN102 + T23 * dN108 + T63 * dN112;
261  answer.at(1, 4) = T24 * dN108 + T44 * dN110;
262  answer.at(1, 5) = T25 * dN108 + T45 * dN110;
263  answer.at(1, 6) = dN104 + T26 * dN108 + T46 * dN110;
264  answer.at(1, 7) = T47 * dN110 + T67 * dN112;
265  answer.at(1, 8) = T48 * dN110 + T68 * dN112;
266  answer.at(1, 9) = dN106 + T49 * dN110 + T69 * dN112;
267 
268  answer.at(2, 1) = T11 * dN207 + T51 * dN211;
269  answer.at(2, 2) = dN201 + T12 * dN207 + T52 * dN211;
270  answer.at(2, 3) = T13 * dN207 + T53 * dN211;
271  answer.at(2, 4) = T14 * dN207 + T34 * dN209;
272  answer.at(2, 5) = dN203 + T15 * dN207 + T35 * dN209;
273  answer.at(2, 6) = T16 * dN207 + T36 * dN209;
274  answer.at(2, 7) = T37 * dN209 + T57 * dN211;
275  answer.at(2, 8) = dN205 + T38 * dN209 + T58 * dN211;
276  answer.at(2, 9) = T39 * dN209 + T59 * dN211;
277 
278  answer.at(3, 1) = -T11 * dN108 - T51 * dN112 - T21 * dN207 - T61 * dN211;
279  answer.at(3, 2) = -dN102 - T12 * dN108 - T52 * dN112 - T22 * dN207 - T62 * dN211;
280  answer.at(3, 3) = -dN201 - T13 * dN108 - T53 * dN112 - T23 * dN207 - T63 * dN211;
281  answer.at(3, 4) = -T14 * dN108 - T34 * dN110 - T24 * dN207 - T44 * dN209;
282  answer.at(3, 5) = -dN104 - T15 * dN108 - T35 * dN110 - T25 * dN207 - T45 * dN209;
283  answer.at(3, 6) = -dN203 - T16 * dN108 - T36 * dN110 - T26 * dN207 - T46 * dN209;
284  answer.at(3, 7) = -T37 * dN110 - T57 * dN112 - T47 * dN209 - T67 * dN211;
285  answer.at(3, 8) = -dN106 - T38 * dN110 - T58 * dN112 - T48 * dN209 - T68 * dN211;
286  answer.at(3, 9) = -dN205 - T39 * dN110 - T59 * dN112 - T49 * dN209 - T69 * dN211;
287 
288  // Note: no shear strains, no shear forces => the 4th and 5th rows are zero
289 }
290 
291 
292 void
294 // Returns the [3x9] displacement interpolation matrix {N} of the receiver,
295 // evaluated at gp.
296 // Note: this interpolation is not available, as the deflection is cubic along the edges,
297 // but not define in the interior of the element
298 // Note: the interpolation of rotations is quadratic
299 // NOTE: linear interpolation returned instead
300 {
301  FloatArray N;
302 
303  answer.resize(3, 9);
304  answer.zero();
305  giveInterpolation()->evalN( N, iLocCoord, FEIElementGeometryWrapper(this) );
306 
307  answer.beNMatrixOf(N, 3);
308 }
309 
310 
311 void
313 {
314  this->giveStructuralCrossSection()->giveGeneralizedStress_Plate(answer, gp, strain, tStep);
315 }
316 
317 
318 void
320 {
321  this->giveStructuralCrossSection()->give2dPlateStiffMtrx(answer, rMode, gp, tStep);
322 }
323 
324 
325 void
326 DKTPlate :: giveNodeCoordinates(double &x1, double &x2, double &x3,
327  double &y1, double &y2, double &y3,
328  double &z1, double &z2, double &z3)
329 {
330  FloatArray *nc1, *nc2, *nc3;
331  nc1 = this->giveNode(1)->giveCoordinates();
332  nc2 = this->giveNode(2)->giveCoordinates();
333  nc3 = this->giveNode(3)->giveCoordinates();
334 
335  x1 = nc1->at(1);
336  x2 = nc2->at(1);
337  x3 = nc3->at(1);
338 
339  y1 = nc1->at(2);
340  y2 = nc2->at(2);
341  y3 = nc3->at(2);
342 
343  z1 = nc1->at(3);
344  z2 = nc2->at(3);
345  z3 = nc3->at(3);
346 
347 }
348 
349 
352 {
354 }
355 
356 
357 void
358 DKTPlate :: giveDofManDofIDMask(int inode, IntArray &answer) const
359 {
360  answer = {D_w, R_u, R_v};
361 }
362 
363 
364 void
366 // returns normal vector to midPlane in GaussPoinr gp of receiver
367 {
368  FloatArray u, v;
369  u.beDifferenceOf( * this->giveNode(2)->giveCoordinates(), * this->giveNode(1)->giveCoordinates() );
370  v.beDifferenceOf( * this->giveNode(3)->giveCoordinates(), * this->giveNode(1)->giveCoordinates() );
371 
372  answer.beVectorProductOf(u, v);
373  answer.normalize();
374 }
375 
376 
377 double
379 //
380 // returns receiver's characteristic length for crack band models
381 // for a crack formed in the plane with normal normalToCrackPlane.
382 //
383 {
384  return this->giveCharacteristicLengthForPlaneElements(normalToCrackPlane);
385 }
386 
387 
388 double
390 // Returns the portion of the receiver which is attached to gp.
391 {
392  double detJ, weight;
393  std :: vector< FloatArray > lc = {FloatArray(3), FloatArray(3), FloatArray(3)};
394  this->giveNodeCoordinates(lc[0].at(1), lc[1].at(1), lc[2].at(1),
395  lc[0].at(2), lc[1].at(2), lc[2].at(2),
396  lc[0].at(3), lc[1].at(3), lc[2].at(3));
397 
398  weight = gp->giveWeight();
400  return detJ * weight;
401 }
402 
403 
404 void
406 // Returns the lumped mass matrix of the receiver.
407 {
408  answer.resize(9, 9);
409  answer.zero();
410 
411  GaussPoint *gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
412 
413  double dV = this->computeVolumeAround(gp);
414  double density = this->giveStructuralCrossSection()->give('d', gp);
415  double mss1 = dV * this->giveCrossSection()->give(CS_Thickness, gp) * density / 3.;
416 
417  answer.at(1, 1) = mss1;
418  answer.at(4, 4) = mss1;
419  answer.at(7, 7) = mss1;
420 }
421 
422 
423 Interface *
425 {
426  if ( interface == LayeredCrossSectionInterfaceType ) {
427  return static_cast< LayeredCrossSectionInterface * >(this);
428  } else if ( interface == ZZNodalRecoveryModelInterfaceType ) {
429  return static_cast< ZZNodalRecoveryModelInterface * >(this);
430  } else if ( interface == NodalAveragingRecoveryModelInterfaceType ) {
431  return static_cast< NodalAveragingRecoveryModelInterface * >(this);
432  } else if ( interface == SPRNodalRecoveryModelInterfaceType ) {
433  return static_cast< SPRNodalRecoveryModelInterface * >(this);
434  } else if ( interface == ZZErrorEstimatorInterfaceType ) {
435  return static_cast< ZZErrorEstimatorInterface * >(this);
436  }
437 
438 
439  return NULL;
440 }
441 
442 
443 #define POINT_TOL 1.e-3
444 
445 bool
447 //converts global coordinates to local planar area coordinates,
448 //does not return a coordinate in the thickness direction, but
449 //does check that the point is in the element thickness
450 {
451  // get node coordinates
452  double x1, x2, x3, y1, y2, y3, z1, z2, z3;
453  this->giveNodeCoordinates(x1, x2, x3, y1, y2, y3, z1, z2, z3);
454 
455  // Fetch local coordinates.
456  bool ok = this->interp_lin.global2local( answer, coords, FEIElementGeometryWrapper(this) ) > 0;
457 
458  //check that the point is in the element and set flag
459  for ( int i = 1; i <= 3; i++ ) {
460  if ( answer.at(i) < ( 0. - POINT_TOL ) ) {
461  return false;
462  }
463 
464  if ( answer.at(i) > ( 1. + POINT_TOL ) ) {
465  return false;
466  }
467  }
468 
469  //get midplane location at this point
470  double midplZ;
471  midplZ = z1 * answer.at(1) + z2 * answer.at(2) + z3 * answer.at(3);
472 
473  //check that the z is within the element
475  double elthick = cs->give(CS_Thickness, answer, this);
476 
477  if ( elthick / 2.0 + midplZ - fabs( coords.at(3) ) < -POINT_TOL ) {
478  answer.zero();
479  return false;
480  }
481 
482 
483  return ok;
484 }
485 
486 
487 int
489 {
490  FloatArray help;
491  answer.resize(6);
492  if ( type == IST_ShellForceTensor || type == IST_ShellStrainTensor ) {
493  if ( type == IST_ShellForceTensor ) {
494  help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
495  } else {
496  help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
497  }
498  answer.at(1) = 0.0; // nx
499  answer.at(2) = 0.0; // ny
500  answer.at(3) = 0.0; // nz
501  answer.at(4) = help.at(5); // vyz in answer
502  answer.at(5) = help.at(4); // vxz in answer
503  answer.at(6) = 0.0; // vxy
504  return 1;
505  } else if ( type == IST_ShellMomentTensor || type == IST_CurvatureTensor ) {
506  if ( type == IST_ShellMomentTensor ) {
507  help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
508  } else {
509  help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
510  }
511  answer.at(1) = help.at(1); // mx
512  answer.at(2) = help.at(2); // my
513  answer.at(3) = 0.0; // mz
514  answer.at(4) = 0.0; // myz
515  answer.at(5) = 0.0; // mxz
516  answer.at(6) = help.at(3); // mxy
517  return 1;
518  } else {
519  return NLStructuralElement :: giveIPValue(answer, gp, type, tStep);
520  }
521 }
522 
523 
524 //
525 // The element interface required by NodalAveragingRecoveryModel
526 //
527 void
529  InternalStateType type, TimeStep *tStep)
530 {
531  GaussPoint *gp;
532  if ( ( type == IST_ShellForceTensor ) || ( type == IST_ShellMomentTensor ) ||
533  ( type == IST_ShellStrainTensor ) || ( type == IST_CurvatureTensor ) ) {
534  gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
535  this->giveIPValue(answer, gp, type, tStep);
536  } else {
537  answer.clear();
538  }
539 }
540 
541 
542 //
543 // The element interface required by SPRNodalRecoveryModelInterface
544 //
545 void
547 {
548  pap.resize(3);
549  pap.at(1) = this->giveNode(1)->giveNumber();
550  pap.at(2) = this->giveNode(2)->giveNumber();
551  pap.at(3) = this->giveNode(3)->giveNumber();
552 }
553 
554 
555 void
557 {
558  answer.resize(1);
559  if ( ( pap == this->giveNode(1)->giveNumber() ) ||
560  ( pap == this->giveNode(2)->giveNumber() ) ||
561  ( pap == this->giveNode(3)->giveNumber() ) ) {
562  answer.at(1) = pap;
563  } else {
564  OOFEM_ERROR("node unknown");
565  }
566 }
567 
568 
571 {
572  return SPRPatchType_2dxy;
573 }
574 
575 
576 void
577 DKTPlate::computeEdgeNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray& lcoords)
578 {
579  FloatArray n;
580 
581  this->interp_lin.edgeEvalN( n, boundaryID, lcoords, FEIElementGeometryWrapper(this) );
582 
583  answer.resize(3, 6);
584  answer.at(1, 1) = n.at(1);
585  answer.at(1, 4) = n.at(2);
586  answer.at(2, 2) = answer.at(3, 3) = n.at(1);
587  answer.at(2, 5) = answer.at(3, 6) = n.at(2);
588 }
589 
590 
591 
592 //
593 // layered cross section support functions
594 //
595 void
597  GaussPoint *masterGp, GaussPoint *slaveGp, TimeStep *tStep)
598 // returns full 3d strain vector of given layer (whose z-coordinate from center-line is
599 // stored in slaveGp) for given tStep
600 {
601  double layerZeta, layerZCoord, top, bottom;
602 
603  top = this->giveCrossSection()->give(CS_TopZCoord, masterGp);
604  bottom = this->giveCrossSection()->give(CS_BottomZCoord, masterGp);
605  layerZeta = slaveGp->giveNaturalCoordinate(3);
606  layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
607 
608  answer.resize(5); // {Exx,Eyy,GMyz,GMzx,GMxy}
609 
610  answer.at(1) = masterGpStrain.at(1) * layerZCoord;
611  answer.at(2) = masterGpStrain.at(2) * layerZCoord;
612  answer.at(5) = masterGpStrain.at(3) * layerZCoord;
613  answer.at(3) = masterGpStrain.at(5);
614  answer.at(4) = masterGpStrain.at(4);
615 }
616 
617 void
618 DKTPlate :: giveEdgeDofMapping(IntArray &answer, int iEdge) const
619 {
620  /*
621  * provides dof mapping of local edge dofs (only nonzero are taken into account)
622  * to global element dofs
623  */
624 
625  answer.resize(6);
626  if ( iEdge == 1 ) { // edge between nodes 1,2
627  answer.at(1) = 1;
628  answer.at(2) = 2;
629  answer.at(3) = 3;
630  answer.at(4) = 4;
631  answer.at(5) = 5;
632  answer.at(6) = 6;
633  } else if ( iEdge == 2 ) { // edge between nodes 2 3
634  answer.at(1) = 4;
635  answer.at(2) = 5;
636  answer.at(3) = 6;
637  answer.at(4) = 7;
638  answer.at(5) = 8;
639  answer.at(6) = 9;
640  } else if ( iEdge == 3 ) { // edge between nodes 3 1
641  answer.at(1) = 7;
642  answer.at(2) = 8;
643  answer.at(3) = 9;
644  answer.at(4) = 1;
645  answer.at(5) = 2;
646  answer.at(6) = 3;
647  } else {
648  OOFEM_ERROR("wrong edge number");
649  }
650 }
651 
652 double
654 {
656  return detJ *gp->giveWeight();
657 }
658 
659 
660 int
662 {
663  // returns transformation matrix from
664  // edge local coordinate system
665  // to element local c.s
666  // (same as global c.s in this case)
667  //
668  // i.e. f(element local) = T * f(edge local)
669  //
670  double dx, dy, length;
671  IntArray edgeNodes;
672  Node *nodeA, *nodeB;
673 
674  answer.resize(3, 3);
675  answer.zero();
676 
677  this->interp_lin.computeLocalEdgeMapping(edgeNodes, iEdge);
678 
679  nodeA = this->giveNode( edgeNodes.at(1) );
680  nodeB = this->giveNode( edgeNodes.at(2) );
681 
682  dx = nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1);
683  dy = nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2);
684  length = sqrt(dx * dx + dy * dy);
685 
686  answer.at(1, 1) = 1.0;
687  answer.at(2, 2) = dx / length;
688  answer.at(2, 3) = -dy / length;
689  answer.at(3, 2) = dy / length;
690  answer.at(3, 3) = dx / length;
691 
692  return 1;
693 }
694 
695 
696 
697 void
699 {
700  this->computeNmatrixAt(sgp->giveNaturalCoordinates(), answer);
701 }
702 
703 void
705 {
706  answer.resize(9);
707  answer.zero();
708  if ( iSurf == 1 ) {
709  for ( int i = 1; i <= 9; i++ ) {
710  answer.at(i) = i;
711  }
712  } else {
713  OOFEM_ERROR("wrong surface number");
714  }
715 }
716 
719 {
720  IntegrationRule *iRule = new GaussIntegrationRule(1, this, 1, 1);
721  int npoints = iRule->getRequiredNumberOfIntegrationPoints(_Triangle, approxOrder);
722  iRule->SetUpPointsOnTriangle(npoints, _Unknown);
723  return iRule;
724 }
725 
726 double
728 {
729  return this->computeVolumeAround(gp);
730 }
731 
732 
733 int
735 {
736  return 0;
737 }
738 
739 void
741 {
742 #ifdef DKT_EnableVertexMomentsCache
743  if ( stateCounter == tStep->giveSolutionStateCounter() ) {
744  answer = vertexMoments;
745  return;
746  }
747 #endif
748 
749  // the results should be cached somehow, as computing on the fly is highly inefficient
750  // due to multiple requests
751  answer.resize(5, 3);
752 
753  FloatArray eps, m;
754  FloatArray coords [ 3 ]; // vertex local coordinates
755  coords [ 0 ] = {
756  1.0, 0.0
757  };
758  coords [ 1 ] = {
759  0.0, 1.0
760  };
761  coords [ 2 ] = {
762  0.0, 0.0
763  };
764 
765  GaussIntegrationRule iRule = GaussIntegrationRule(1, this, 1, 1); // dummy rule used to evaluate B at vertices
766  iRule.SetUpPointsOnTriangle(1, _Unknown);
767  GaussPoint *vgp = iRule.getIntegrationPoint(0);
768 
769  for ( int i = 1; i <= this->numberOfDofMans; i++ ) {
770  vgp->setNaturalCoordinates(coords [ i - 1 ]);
771  this->computeStrainVector(eps, vgp, tStep);
772  this->giveStructuralCrossSection()->giveGeneralizedStress_Plate(m, vgp, eps, tStep);
773  answer.setColumn(m, i);
774  }
775 
776 #ifdef DKT_EnableVertexMomentsCache
777  this->vertexMoments = answer;
778  this->stateCounter = tStep->giveSolutionStateCounter();
779 #endif
780 }
781 
782 void
784 {
785  // as shear strains are enforced to be zero (art least on element edges) the shear forces are computed from equlibrium
786  FloatMatrix m, dndx;
787  answer.resize(5);
788 
789  this->computeVertexBendingMoments(m, tStep);
791  for ( int i = 1; i <= this->numberOfDofMans; i++ ) {
792  answer.at(4) += m.at(1, i) * dndx.at(i, 1) + m.at(3, i) * dndx.at(i, 2); //dMxdx + dMxydy
793  answer.at(5) += m.at(2, i) * dndx.at(i, 2) + m.at(3, i) * dndx.at(i, 1); //dMydy + dMxydx
794  }
795 }
796 
797 
798 //
799 // io routines
800 //
801 #ifdef __OOFEG
802 void
804 {
805  WCRec p [ 3 ];
806  GraphicObj *go;
807 
808  if ( !gc.testElementGraphicActivity(this) ) {
809  return;
810  }
811 
812  if ( this->giveMaterial()->isActivated(tStep) ) {
813  EASValsSetLineWidth(OOFEG_RAW_GEOMETRY_WIDTH);
814  EASValsSetColor( gc.getElementColor() );
815  EASValsSetEdgeColor( gc.getElementEdgeColor() );
816  EASValsSetEdgeFlag(true);
817  EASValsSetFillStyle(FILL_SOLID);
818  EASValsSetLayer(OOFEG_RAW_GEOMETRY_LAYER);
819  p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveCoordinate(1);
820  p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveCoordinate(2);
821  p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveCoordinate(3);
822  p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveCoordinate(1);
823  p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveCoordinate(2);
824  p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveCoordinate(3);
825  p [ 2 ].x = ( FPNum ) this->giveNode(3)->giveCoordinate(1);
826  p [ 2 ].y = ( FPNum ) this->giveNode(3)->giveCoordinate(2);
827  p [ 2 ].z = ( FPNum ) this->giveNode(3)->giveCoordinate(3);
828 
829  go = CreateTriangle3D(p);
830  EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
831  EGAttachObject(go, ( EObjectP ) this);
832  EMAddGraphicsToModel(ESIModel(), go);
833  }
834 }
835 
836 
837 void
839 {
840  WCRec p [ 3 ];
841  GraphicObj *go;
842  double defScale = gc.getDefScale();
843 
844  if ( !gc.testElementGraphicActivity(this) ) {
845  return;
846  }
847 
848  if ( this->giveMaterial()->isActivated(tStep) ) {
849  EASValsSetLineWidth(OOFEG_DEFORMED_GEOMETRY_WIDTH);
850  EASValsSetColor( gc.getDeformedElementColor() );
851  EASValsSetEdgeColor( gc.getElementEdgeColor() );
852  EASValsSetEdgeFlag(true);
853  EASValsSetFillStyle(FILL_SOLID);
854  EASValsSetLayer(OOFEG_DEFORMED_GEOMETRY_LAYER);
855  p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(1, tStep, defScale);
856  p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(2, tStep, defScale);
857  p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(3, tStep, defScale);
858  p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(1, tStep, defScale);
859  p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(2, tStep, defScale);
860  p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(3, tStep, defScale);
861  p [ 2 ].x = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(1, tStep, defScale);
862  p [ 2 ].y = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(2, tStep, defScale);
863  p [ 2 ].z = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(3, tStep, defScale);
864 
865  go = CreateTriangle3D(p);
866  EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
867  EMAddGraphicsToModel(ESIModel(), go);
868  }
869 }
870 
871 
872 void
874 {
875  int i, indx, result = 0;
876  WCRec p [ 3 ];
877  GraphicObj *tr;
878  FloatArray v1, v2, v3;
879  double s [ 3 ], defScale;
880 
881  if ( !gc.testElementGraphicActivity(this) ) {
882  return;
883  }
884 
885  if ( !this->giveMaterial()->isActivated(tStep) ) {
886  return;
887  }
888 
889  if ( gc.giveIntVarMode() == ISM_recovered ) {
890  result += this->giveInternalStateAtNode(v1, gc.giveIntVarType(), gc.giveIntVarMode(), 1, tStep);
891  result += this->giveInternalStateAtNode(v2, gc.giveIntVarType(), gc.giveIntVarMode(), 2, tStep);
892  result += this->giveInternalStateAtNode(v3, gc.giveIntVarType(), gc.giveIntVarMode(), 3, tStep);
893  } else if ( gc.giveIntVarMode() == ISM_local ) {
894  GaussPoint *gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
895  result += giveIPValue(v1, gp, gc.giveIntVarType(), tStep);
896  v2 = v1;
897  v3 = v1;
898  result *= 3;
899  }
900 
901  if ( result != 3 ) {
902  return;
903  }
904 
905  indx = gc.giveIntVarIndx();
906 
907  s [ 0 ] = v1.at(indx);
908  s [ 1 ] = v2.at(indx);
909  s [ 2 ] = v3.at(indx);
910 
911  EASValsSetLayer(OOFEG_VARPLOT_PATTERN_LAYER);
912 
913  if ( gc.getScalarAlgo() == SA_ISO_SURF ) {
914  for ( i = 0; i < 3; i++ ) {
915  if ( gc.getInternalVarsDefGeoFlag() ) {
916  // use deformed geometry
917  defScale = gc.getDefScale();
918  p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(1, tStep, defScale);
919  p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(2, tStep, defScale);
920  p [ i ].z = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(3, tStep, defScale);
921  } else {
922  p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(1);
923  p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(2);
924  p [ i ].z = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(3);
925  }
926  }
927 
928  //EASValsSetColor(gc.getYieldPlotColor(ratio));
929  gc.updateFringeTableMinMax(s, 3);
930  tr = CreateTriangleWD3D(p, s [ 0 ], s [ 1 ], s [ 2 ]);
931  EGWithMaskChangeAttributes(LAYER_MASK, tr);
932  EMAddGraphicsToModel(ESIModel(), tr);
933  }
934 }
935 
936 #endif
937 } // end namespace oofem
virtual SPRPatchType SPRNodalRecoveryMI_givePatchType()
Definition: dkt.C:570
CrossSection * giveCrossSection()
Definition: element.C:495
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: fei2dtrlin.C:184
int testElementGraphicActivity(Element *)
Test if particular element passed fulfills various filtering criteria for its graphics output...
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
The element interface required by NodalAvergagingRecoveryModel.
virtual void drawRawGeometry(oofegGraphicContext &gc, TimeStep *tStep)
Definition: dkt.C:803
The element interface required by ZZNodalRecoveryModel.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the array of interpolation functions (shape functions) at given point.
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: fei2dtrlin.C:53
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
Class and object Domain.
Definition: domain.h:115
ScalarAlgorithmType getScalarAlgo()
Bottom z coordinate.
Definition: crosssection.h:72
virtual void computeBodyLoadVectorAt(FloatArray &answer, Load *load, TimeStep *tStep, ValueModeType mode)
Computes the load vector due to body load acting on receiver, at given time step. ...
Definition: dkt.C:95
Wrapper around cell with vertex coordinates stored in FloatArray**.
Definition: feinterpol.h:115
virtual void computeLocalEdgeMapping(IntArray &edgeNodes, int iedge)
Definition: fei2dtrlin.C:230
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
Definition: dkt.C:139
The element interface required by ZZNodalRecoveryModel.
Abstract base class for "structural" finite elements with geometrical nonlinearities.
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
Definition: dkt.C:389
void zero()
Sets all component to zero.
Definition: intarray.C:52
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
virtual int giveInternalStateAtNode(FloatArray &answer, InternalStateType type, InternalStateMode mode, int node, TimeStep *tStep)
Returns internal state variable (like stress,strain) at node of element in Reduced form...
virtual void computeLumpedMassMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes lumped mass matrix of receiver.
Definition: dkt.C:405
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
Definition: valuemodetype.h:78
#define OOFEG_RAW_GEOMETRY_LAYER
This class implements a structural material status information.
Definition: structuralms.h:65
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
virtual double giveCharacteristicLength(const FloatArray &normalToCrackPlane)
Returns the size of element in the given direction, in some cases adjusted (e.g.
Definition: dkt.C:378
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
virtual double edgeGiveTransformationJacobian(int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the edge Jacobian of transformation between local and global coordinates.
Definition: feinterpol2d.C:175
virtual double computeSurfaceVolumeAround(GaussPoint *gp, int iSurf)
Computes volume related to integration point on local surface.
Definition: dkt.C:727
Top z coordinate.
Definition: crosssection.h:71
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes boundary condition value - its components values at given time.
Definition: load.C:82
DKTPlate(int n, Domain *d)
Definition: dkt.C:60
virtual double giveCoordinate(int i)
Definition: node.C:82
virtual void computeEdgeNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray &lcoords)
computes edge interpolation matrix
Definition: dkt.C:577
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.
#define OOFEG_DEFORMED_GEOMETRY_LAYER
void rotatedWith(FloatMatrix &r, char mode)
Returns the receiver a rotated according the change-of-base matrix r.
Definition: floatarray.C:799
Abstract base class representing integration rule.
Distributed body load.
Definition: bcgeomtype.h:43
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: dkt.C:312
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
virtual void give2dPlateStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Method for computing 2d plate stiffness matrix.
virtual void drawScalar(oofegGraphicContext &gc, TimeStep *tStep)
Definition: dkt.C:873
Class representing a general abstraction for finite element interpolation class.
Definition: feinterpol.h:132
InternalStateType giveIntVarType()
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
Definition: gausspoint.h:136
FloatMatrix vertexMoments
Definition: dkt.h:77
The element interface corresponding to ZZErrorEstimator.
virtual void computeMidPlaneNormal(FloatArray &answer, const GaussPoint *gp)
Computes mid-plane normal of receiver at integration point.
Definition: dkt.C:365
StateCounterType giveSolutionStateCounter()
Returns current solution state counter.
Definition: timestep.h:188
#define OOFEM_ERROR(...)
Definition: error.h:61
REGISTER_Element(LSpace)
DofIDItem
Type representing particular dof type.
Definition: dofiditem.h:86
#define OOFEG_RAW_GEOMETRY_WIDTH
StateCounterType stateCounter
Definition: dkt.h:78
virtual double giveWeight()
Returns integration weight of receiver.
Definition: gausspoint.h:181
UnknownType
Type representing particular unknown (its physical meaning).
Definition: unknowntype.h:55
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
virtual int computeLoadLSToLRotationMatrix(FloatMatrix &answer, int iSurf, GaussPoint *gp)
Returns transformation matrix from local surface c.s to element local coordinate system of load vecto...
Definition: dkt.C:734
virtual FEInterpolation * giveInterpolation() const
Definition: dkt.C:72
virtual void giveGeneralizedStress_Plate(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)=0
Wrapper around element definition to provide FEICellGeometry interface.
Definition: feinterpol.h:95
virtual double giveUpdatedCoordinate(int ic, TimeStep *tStep, double scale=1.)
Returns updated ic-th coordinate of receiver.
Definition: node.C:245
virtual void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Compute strain vector of receiver evaluated at given integration point at given time step from elemen...
#define N(p, q)
Definition: mdm.C:367
virtual int global2local(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Default implementation using Newton&#39;s method to find the local coordinates.
Definition: fei2dtrlin.C:103
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 drawDeformedGeometry(oofegGraphicContext &gc, TimeStep *tStep, UnknownType type)
Definition: dkt.C:838
virtual void computeStrainVectorInLayer(FloatArray &answer, const FloatArray &masterGpStrain, GaussPoint *masterGp, GaussPoint *slaveGp, TimeStep *tStep)
Computes full 3D strain vector in element layer.
Definition: dkt.C:596
virtual void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &answer)
Computes interpolation matrix for element unknowns.
Definition: dkt.C:293
virtual void giveSurfaceDofMapping(IntArray &answer, int iSurf) const
Assembles surface dof mapping mask, which provides mapping between surface local DOFs and "global" el...
Definition: dkt.C:704
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
InternalStateMode giveIntVarMode()
void beNMatrixOf(const FloatArray &n, int nsd)
Assigns the receiver to be a repeated diagonal matrix.
Definition: floatmatrix.C:505
double area
Definition: dkt.h:75
Class representing vector of real numbers.
Definition: floatarray.h:82
#define POINT_TOL
Definition: dkt.C:443
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
virtual void NodalAveragingRecoveryMI_computeNodalValue(FloatArray &answer, int node, InternalStateType type, TimeStep *tStep)
Computes the element value in given node.
Definition: dkt.C:528
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.
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the determinant of the transformation.
Definition: fei2dtrlin.C:147
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
Definition: dkt.C:319
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 IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: dkt.C:351
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
Definition: gausspoint.h:205
void computeVertexBendingMoments(FloatMatrix &answer, TimeStep *tStep)
Definition: dkt.C:740
void setNaturalCoordinates(const FloatArray &c)
Definition: gausspoint.h:139
void resize(int rows, int cols)
Checks size of receiver towards requested bounds.
Definition: floatmatrix.C:1358
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
Computes the element local coordinates from given global coordinates.
Definition: dkt.C:446
Class representing the general Input Record.
Definition: inputrecord.h:101
virtual int getRequiredNumberOfIntegrationPoints(integrationDomain dType, int approxOrder)
Abstract service.
Class Interface.
Definition: interface.h:82
static FEI2dTrLin interp_lin
Element geometry approximation.
Definition: dkt.h:74
void zero()
Zeroes all coefficients of receiver.
Definition: floatarray.C:658
virtual bcGeomType giveBCGeoType() const
Returns geometry character of boundary condition.
#define OOFEG_DEFORMED_GEOMETRY_WIDTH
void setColumn(const FloatArray &src, int c)
Sets the values of the matrix in specified column.
Definition: floatmatrix.C:648
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 int SetUpPointsOnTriangle(int, MaterialMode mode)
Sets up receiver&#39;s integration points on triangular (area coords) integration domain.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void giveDofManDofIDMask(int inode, IntArray &) const
Returns dofmanager dof mask for node.
Definition: dkt.C:358
virtual bool isActivated(TimeStep *tStep)
Definition: material.h:161
virtual FloatArray * giveCoordinates()
Definition: node.h:114
void zero()
Zeroes all coefficient of receiver.
Definition: floatmatrix.C:1326
InterfaceType
Enumerative type, used to identify interface type.
Definition: interfacetype.h:43
void updateFringeTableMinMax(double *s, int size)
Load is base abstract class for all loads.
Definition: load.h:61
The element interface required by LayeredCrossSection.
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.
virtual void giveNodeCoordinates(double &x1, double &x2, double &x3, double &y1, double &y2, double &y3, double &z1, double &z2, double &z3)
Definition: dkt.C:326
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
Definition: dkt.C:488
the oofem namespace is to define a context or scope in which all oofem names are defined.
virtual void SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(IntArray &answer, int pap)
Definition: dkt.C:556
virtual bcValType giveBCValType() const
Returns receiver load type.
Class implementing node in finite element mesh.
Definition: node.h:87
virtual IntegrationRule * GetSurfaceIntegrationRule(int iSurf)
Definition: dkt.C:718
virtual void computeSurfaceNMatrixAt(FloatMatrix &answer, int iSurf, GaussPoint *gp)
Definition: dkt.C:698
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...
Definition: dkt.C:661
int giveNumber() const
Definition: femcmpnn.h:107
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 SPRNodalRecoveryMI_giveSPRAssemblyPoints(IntArray &pap)
Definition: dkt.C:546
#define OOFEG_VARPLOT_PATTERN_LAYER
virtual void giveEdgeDofMapping(IntArray &answer, int iEdge) const
Assembles edge dof mapping mask, which provides mapping between edge local DOFs and "global" element ...
Definition: dkt.C:618
Class representing integration point in finite element program.
Definition: gausspoint.h:93
virtual double computeEdgeVolumeAround(GaussPoint *gp, int iEdge)
Computes volume related to integration point on local edge.
Definition: dkt.C:653
Class representing solution step.
Definition: timestep.h:80
int numberOfDofMans
Number of dofmanagers.
Definition: element.h:149
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.
virtual Material * giveMaterial()
Definition: element.C:484
Class representing Gaussian-quadrature integration rule.
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
Definition: dkt.C:424
void computeShearForces(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Definition: dkt.C:783
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
Definition: dkt.C:83

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