OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
beam3d.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/Beams/beam3d.h"
36 #include "../sm/Materials/structuralms.h"
37 #include "node.h"
38 #include "material.h"
39 #include "crosssection.h"
40 #include "gausspoint.h"
41 #include "gaussintegrationrule.h"
42 #include "floatmatrix.h"
43 #include "intarray.h"
44 #include "floatarray.h"
45 #include "engngm.h"
46 #include "boundaryload.h"
47 #include "mathfem.h"
48 #include "fei3dlinelin.h"
49 #include "classfactory.h"
50 #include "elementinternaldofman.h"
51 #include "masterdof.h"
52 #include "bctracker.h"
53 
54 #include "bodyload.h"
55 #include "boundaryload.h"
56 
57 #ifdef __OOFEG
58  #include "oofeggraphiccontext.h"
59 #endif
60 
61 namespace oofem {
62 REGISTER_Element(Beam3d);
63 
64 FEI3dLineLin Beam3d :: interp;
65 
66 Beam3d :: Beam3d(int n, Domain *aDomain) : BeamBaseElement(n, aDomain)
67 {
68  numberOfDofMans = 2;
69  referenceNode = 0;
70 
72  length = 0.;
73  kappay = kappaz = -1.0;
74 
75  ghostNodes [ 0 ] = ghostNodes [ 1 ] = NULL;
77 }
78 
80 {
81  delete ghostNodes [ 0 ];
82  delete ghostNodes [ 1 ];
83 }
84 
86 
87 void
88 Beam3d :: computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int li, int ui)
89 // eeps = {\eps_x, \gamma_xz, \gamma_xy, \der{phi_x}{x}, \kappa_y, \kappa_z}^T
90 {
91  double l, ksi, kappay, kappaz, c1y, c1z;
92  TimeStep *tStep = this->domain->giveEngngModel()->giveCurrentStep();
93 
94  l = this->computeLength();
95  ksi = 0.5 + 0.5 * gp->giveNaturalCoordinate(1);
96  kappay = this->giveKappayCoeff(tStep);
97  kappaz = this->giveKappazCoeff(tStep);
98  c1y = 1. + 2. * kappay;
99  c1z = 1. + 2. * kappaz;
100 
101  answer.resize(6, 12);
102  answer.zero();
103 
104  answer.at(1, 1) = -1. / l;
105  answer.at(1, 7) = 1. / l;
106 
107  answer.at(2, 3) = ( -2. * kappay ) / ( l * c1y );
108  answer.at(2, 5) = kappay / (c1y );
109  answer.at(2, 9) = 2. * kappay / ( l * c1y );
110  answer.at(2, 11) = kappay / (c1y );
111 
112  answer.at(3, 2) = ( -2. * kappaz ) / ( l * c1z );
113  answer.at(3, 6) = -kappaz / (c1z );
114  answer.at(3, 8) = 2. * kappaz / ( l * c1z );
115  answer.at(3, 12) = -kappaz / (c1z );
116 
117 
118  answer.at(4, 4) = -1. / l;
119  answer.at(4, 10) = 1. / l;
120 
121  answer.at(5, 3) = ( 6. - 12. * ksi ) / ( l * l * c1y );
122  answer.at(5, 5) = ( -2. * ( 2. + kappay ) + 6. * ksi ) / ( l * c1y );
123  answer.at(5, 9) = ( -6. + 12. * ksi ) / ( l * l * c1y );
124  answer.at(5, 11) = ( -2. * ( 1. - kappay ) + 6. * ksi ) / ( l * c1y );
125 
126  answer.at(6, 2) = -1.0*( 6. - 12. * ksi ) / ( l * l * c1z );
127  answer.at(6, 6) = ( -2. * ( 2. + kappaz ) + 6. * ksi ) / ( l * c1z );
128  answer.at(6, 8) = -1.0*( -6. + 12. * ksi ) / ( l * l * c1z );
129  answer.at(6, 12) = ( -2. * ( 1. - kappaz ) + 6. * ksi ) / ( l * c1z );
130 }
131 
132 
134 {
135  if ( integrationRulesArray.size() == 0 ) {
136  // the gauss point is used only when methods from crosssection and/or material
137  // classes are requested
138  integrationRulesArray.resize( 1 );
139  integrationRulesArray [ 0 ].reset( new GaussIntegrationRule(1, this, 1, 2) );
141  }
142 }
143 
144 
145 void
147 // Returns the displacement interpolation matrix {N} of the receiver, eva-
148 // luated at gp. Used for numerical calculation of consistent mass
149 // matrix. Must contain only interpolation for displacement terms,
150 // not for any rotations. (Inertia forces do not work on rotations).
151 // r = {u1,v1,w1,fi_x1,fi_y1,fi_z1,u2,v2,w2,fi_x2,fi_y2,fi_21}^T
152 {
153  double l, ksi, ksi2, ksi3, kappay, kappaz, c1y, c1z;
154  TimeStep *tStep = this->domain->giveEngngModel()->giveCurrentStep();
155 
156  l = this->computeLength();
157  ksi = 0.5 + 0.5 * iLocCoord.at(1);
158  kappay = this->giveKappayCoeff(tStep);
159  kappaz = this->giveKappazCoeff(tStep);
160  c1y = 1. + 2. * kappay;
161  c1z = 1. + 2. * kappaz;
162  ksi2 = ksi * ksi;
163  ksi3 = ksi2 * ksi;
164 
165  answer.resize(6, 12);
166  answer.zero();
167 
168  answer.at(1, 1) = 1. - ksi;
169  answer.at(1, 7) = ksi;
170  answer.at(2, 2) = ( c1z - 2. * kappaz * ksi - 3. * ksi2 + 2. * ksi3 ) / c1z;
171  answer.at(2, 6) = -l * ( -( 1. + kappaz ) * ksi + ( 2. + kappaz ) * ksi2 - ksi3 ) / c1z;
172  answer.at(2, 8) = ( 2. * kappaz * ksi + 3. * ksi2 - 2. * ksi3 ) / c1z;
173  answer.at(2, 12) = -l * ( kappaz * ksi + ( 1. - kappaz ) * ksi2 - ksi3 ) / c1z;
174  answer.at(3, 3) = ( c1y - 2. * kappay * ksi - 3. * ksi2 + 2. * ksi3 ) / c1y;
175  answer.at(3, 5) = l * ( -( 1. + kappay ) * ksi + ( 2. + kappay ) * ksi2 - ksi3 ) / c1y;
176  answer.at(3, 9) = ( 2. * kappay * ksi + 3. * ksi2 - 2. * ksi3 ) / c1y;
177  answer.at(3, 11) = l * ( kappay * ksi + ( 1. - kappay ) * ksi2 - ksi3 ) / c1y;
178 
179  // rotations excluded
180  answer.at(4, 4) = 1. - ksi;
181  answer.at(4, 10) = ksi;
182  answer.at(5, 3) = ( 6. * ksi - 6. * ksi2 ) / ( l * c1y );
183  answer.at(5, 5) = ( c1y - 2. * ( 2. + kappay ) * ksi + 3. * ksi2 ) / c1y;
184  answer.at(5, 9) = -( 6. * ksi - 6. * ksi2 ) / ( l * c1y );
185  answer.at(5, 11) = ( -2. * ( 1. - kappay ) * ksi + 3. * ksi2 ) / c1y;
186  answer.at(6, 2) = -( 6. * ksi - 6. * ksi2 ) / ( l * c1z );
187  answer.at(6, 6) = ( c1z - 2. * ( 2. + kappaz ) * ksi + 3. * ksi2 ) / c1z;
188  answer.at(6, 8) = ( 6. * ksi - 6. * ksi2 ) / ( l * c1z );
189  answer.at(6, 12) = ( -2. * ( 1. - kappaz ) * ksi + 3. * ksi2 ) / c1z;
190 }
191 
192 
193 void
195 {
196  double l = this->computeLength();
197  FloatMatrix B, DB, d;
198  answer.clear();
199  for ( auto &gp: *this->giveDefaultIntegrationRulePtr() ) {
200  this->computeBmatrixAt(gp, B);
201  this->computeConstitutiveMatrixAt(d, rMode, gp, tStep);
202  double dV = gp->giveWeight() * 0.5 * l;
203  DB.beProductOf(d, B);
204  answer.plusProductSymmUpper(B, DB, dV);
205  }
206  answer.symmetrized();
207 
208  if (subsoilMat) {
209  FloatMatrix k;
210  this->computeSubSoilStiffnessMatrix(k, rMode, tStep);
211  answer.add(k);
212  }
213 }
214 
215 
216 void
218 {
219  answer.clear();
220 
221  if ( edge != 1 ) {
222  OOFEM_ERROR("Beam3D only has 1 edge (the midline) that supports loads. Attempted to apply load to edge %d", edge);
223  }
224 
225  if ( type != ExternalForcesVector ) {
226  return;
227  }
228 
229  double l = this->computeLength();
230  FloatArray coords, t;
231  FloatMatrix N, T;
232 
233  for ( GaussPoint *gp: *this->giveDefaultIntegrationRulePtr() ) {
234  const FloatArray &lcoords = gp->giveNaturalCoordinates();
235  this->computeNmatrixAt(lcoords, N);
236  if ( load ) {
237  this->computeGlobalCoordinates(coords, lcoords);
238  load->computeValues(t, tStep, coords, {D_u, D_v, D_w, R_u, R_v, R_w}, mode);
239  } else {
240  load->computeValues(t, tStep, lcoords, {D_u, D_v, D_w, R_u, R_v, R_w}, mode);
241  }
242 
243  if ( load->giveCoordSystMode() == Load :: CST_Global ) {
244  if ( this->computeLoadGToLRotationMtrx(T) ) {
245  t.rotatedWith(T, 'n');
246  }
247  }
248 
249  double dl = gp->giveWeight() * 0.5 * l;
250  answer.plusProduct(N, t, dl);
251  }
252 
253  if (global) {
254  // Loads from sets expects global c.s.
255  this->computeGtoLRotationMatrix(T);
256  answer.rotatedWith(T, 't');
257  }
258 }
259 
260 
261 int
263 {
264  FloatMatrix lcs;
265 
266  answer.resize(6, 6);
267  answer.zero();
268 
269  this->giveLocalCoordinateSystem(lcs);
270  for ( int i = 1; i <= 3; i++ ) {
271  for ( int j = 1; j <= 3; j++ ) {
272  answer.at(i, j) = lcs.at(i, j);
273  answer.at(3 + i, 3 + j) = lcs.at(i, j);
274  }
275  }
276  return 1;
277 }
278 
279 
280 bool
282 {
283  FloatMatrix lcs;
284  int ndofs = computeNumberOfGlobalDofs();
285  answer.resize(ndofs, ndofs);
286  answer.zero();
287 
288  this->giveLocalCoordinateSystem(lcs);
289  for ( int i = 1; i <= 3; i++ ) {
290  for ( int j = 1; j <= 3; j++ ) {
291  answer.at(i, j) = lcs.at(i, j);
292  answer.at(i + 3, j + 3) = lcs.at(i, j);
293  answer.at(i + 6, j + 6) = lcs.at(i, j);
294  answer.at(i + 9, j + 9) = lcs.at(i, j);
295  }
296  }
297 
298  for ( int i = 13; i <= ndofs; i++ ) {
299  answer.at(i, i) = 1.0;
300  }
301 
302  if ( this->hasDofs2Condense() ) {
303  int condensedDofCounter = 0;
304  DofIDItem dofids[] = {
305  D_u, D_v, D_w, R_u, R_v, R_w
306  };
307  FloatMatrix l2p(12, ndofs); // local -> primary
308  l2p.zero();
309  // loop over nodes
310  for ( int inode = 0; inode < 2; inode++ ) {
311  // loop over DOFs
312  for ( int idof = 0; idof < 6; idof++ ) {
313  int eq = inode * 6 + idof + 1;
314  if ( ghostNodes [ inode ] ) {
315  if ( ghostNodes [ inode ]->hasDofID(dofids [ idof ]) ) {
316  condensedDofCounter++;
317  l2p.at(eq, 12 + condensedDofCounter) = 1.0;
318  continue;
319  }
320  }
321  l2p.at(eq, eq) = 1.0;
322  }
323  }
324 
325  FloatMatrix g2l(answer);
326  answer.beProductOf(l2p, g2l);
327  }
328 
329  return true;
330 }
331 
332 
333 
334 void
336 // Returns the rotation matrix for element unknowns
337 {
338  FloatMatrix lcs;
339 
340  answer.resize(6, 6);
341  answer.zero();
342 
343  this->giveLocalCoordinateSystem(lcs);
344  for ( int i = 1; i <= 3; i++ ) {
345  for ( int j = 1; j <= 3; j++ ) {
346  answer.at(i, j) = lcs.at(i, j);
347  answer.at(i + 3, j + 3) = lcs.at(i, j);
348  }
349  }
350 
351 }
352 
353 double
355 {
356  return gp->giveWeight() * 0.5 * this->computeLength();
357 }
358 
359 
360 int
362 {
363  if ( type == IST_BeamForceMomentTensor ) {
364  answer = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
365  return 1;
366  } else if ( type == IST_BeamStrainCurvatureTensor ) {
367  answer = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
368  return 1;
369  } else if ( type == IST_ShellForceTensor || type == IST_ShellStrainTensor ) {
370  // Order in generalized strain is:
371  // {\eps_x, \gamma_xz, \gamma_xy, \der{phi_x}{x}, \kappa_y, \kappa_z}
372  const FloatArray &help = type == IST_ShellForceTensor ?
373  static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector() :
374  static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
375 
376  answer.resize(6);
377  answer.at(1) = help.at(1); // nx
378  answer.at(2) = 0.0; // ny
379  answer.at(3) = 0.0; // nz
380  answer.at(4) = 0.0; // vyz
381  answer.at(5) = help.at(2); // vxz
382  answer.at(6) = help.at(3); // vxy
383  return 1;
384  } else if ( type == IST_ShellMomentTensor || type == IST_CurvatureTensor ) {
385  const FloatArray &help = type == IST_ShellMomentTensor ?
386  static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector() :
387  static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
388  answer.resize(6);
389  answer.at(1) = help.at(4); // mx
390  answer.at(2) = 0.0; // my
391  answer.at(3) = 0.0; // mz
392  answer.at(4) = 0.0; // myz
393  answer.at(5) = help.at(6); // mxz
394  answer.at(6) = help.at(5); // mxy
395  return 1;
396  } else {
397  return BeamBaseElement :: giveIPValue(answer, gp, type, tStep);
398  }
399 }
400 
401 
402 void
403 Beam3d :: giveDofManDofIDMask(int inode, IntArray &answer) const
404 {
405  answer = {
406  D_u, D_v, D_w, R_u, R_v, R_w
407  };
408 }
409 
410 
411 double
413 {
414  double dx, dy, dz;
415  Node *nodeA, *nodeB;
416 
417  if ( length == 0. ) {
418  nodeA = this->giveNode(1);
419  nodeB = this->giveNode(2);
420  dx = nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1);
421  dy = nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2);
422  dz = nodeB->giveCoordinate(3) - nodeA->giveCoordinate(3);
423  length = sqrt(dx * dx + dy * dy + dz * dz);
424  }
425 
426  return length;
427 }
428 
429 
430 void
432 {
433  // kappa_y = (6*E*Iy)/(k*G*A*l^2)
434 
435  FloatMatrix d;
436  double l = this->computeLength();
437 
438  this->computeConstitutiveMatrixAt(d, ElasticStiffness, integrationRulesArray [ 0 ]->getIntegrationPoint(0), tStep);
439 
440  // kappay = 6. * d.at(5, 5) / ( d.at(3, 3) * l * l );
441  // kappaz = 6. * d.at(6, 6) / ( d.at(2, 2) * l * l );
442  if ( d.at(3, 3) != 0. ) {
443  kappay = 6. * d.at(5, 5) / ( d.at(3, 3) * l * l );
444  } else {
445  kappay = 0.;
446  }
447  if ( d.at(2, 2) != 0. ) {
448  kappaz = 6. * d.at(6, 6) / ( d.at(2, 2) * l * l );
449  } else {
450  kappaz = 0.;
451  }
452 }
453 
454 
455 double
457 {
458  if ( kappay < 0.0 ) {
459  this->computeKappaCoeffs(tStep);
460  }
461 
462  return kappay;
463 }
464 
465 
466 double
468 {
469  if ( kappaz < 0.0 ) {
470  this->computeKappaCoeffs(tStep);
471  }
472 
473  return kappaz;
474 }
475 
476 
477 int
479 //
480 // returns a unit vectors of local coordinate system at element
481 // stored rowwise (mainly used by some materials with ortho and anisotrophy)
482 //
483 {
484  FloatArray lx, ly, lz, help(3);
485  Node *nodeA, *nodeB;
486  nodeA = this->giveNode(1);
487  nodeB = this->giveNode(2);
488 
489  lx.beDifferenceOf(*nodeB->giveCoordinates(), *nodeA->giveCoordinates());
490  lx.normalize();
491 
492  if ( this->referenceNode ) {
493  Node *refNode = this->giveDomain()->giveNode(this->referenceNode);
494  help.beDifferenceOf(*refNode->giveCoordinates(), *nodeA->giveCoordinates());
495 
496  lz.beVectorProductOf(lx, help);
497  lz.normalize();
498  } else if ( this->zaxis.giveSize() > 0 ) {
499  lz = this->zaxis;
500  lz.add(lz.dotProduct(lx), lx);
501  lz.normalize();
502  } else {
503  FloatMatrix rot(3, 3);
504  double theta = referenceAngle * M_PI / 180.0;
505 
506  rot.at(1, 1) = cos(theta) + pow(lx.at(1), 2) * ( 1 - cos(theta) );
507  rot.at(1, 2) = lx.at(1) * lx.at(2) * ( 1 - cos(theta) ) - lx.at(3) * sin(theta);
508  rot.at(1, 3) = lx.at(1) * lx.at(3) * ( 1 - cos(theta) ) + lx.at(2) * sin(theta);
509 
510  rot.at(2, 1) = lx.at(2) * lx.at(1) * ( 1 - cos(theta) ) + lx.at(3) * sin(theta);
511  rot.at(2, 2) = cos(theta) + pow(lx.at(2), 2) * ( 1 - cos(theta) );
512  rot.at(2, 3) = lx.at(2) * lx.at(3) * ( 1 - cos(theta) ) - lx.at(1) * sin(theta);
513 
514  rot.at(3, 1) = lx.at(3) * lx.at(1) * ( 1 - cos(theta) ) - lx.at(2) * sin(theta);
515  rot.at(3, 2) = lx.at(3) * lx.at(2) * ( 1 - cos(theta) ) + lx.at(1) * sin(theta);
516  rot.at(3, 3) = cos(theta) + pow(lx.at(3), 2) * ( 1 - cos(theta) );
517 
518  help.at(3) = 1.0; // up-vector
519  // here is ly is used as a temp var
520  if ( fabs(lx.dotProduct(help)) > 0.999 ) { // Check if it is vertical
521  ly = {0., 1., 0.};
522  } else {
523  ly.beVectorProductOf(lx, help);
524  }
525  lz.beProductOf(rot, ly);
526  lz.normalize();
527  }
528 
529  ly.beVectorProductOf(lz, lx);
530  ly.normalize();
531 
532  answer.resize(3, 3);
533  answer.zero();
534  for ( int i = 1; i <= 3; i++ ) {
535  answer.at(1, i) = lx.at(i);
536  answer.at(2, i) = ly.at(i);
537  answer.at(3, i) = lz.at(i);
538  }
539 
540  return 1;
541 }
542 
543 
546 {
547  IRResultType result; // Required by IR_GIVE_FIELD macro
548 
549  referenceNode = 0;
550  referenceAngle = 0;
551  this->zaxis.clear();
552  if ( ir->hasField(_IFT_Beam3d_zaxis) ) {
554  } else if ( ir->hasField(_IFT_Beam3d_refnode) ) {
556  if ( referenceNode == 0 ) {
557  OOFEM_WARNING("wrong reference node specified. Using default orientation.");
558  }
559  } else if ( ir->hasField(_IFT_Beam3d_refangle) ) {
561  } else {
562  OOFEM_WARNING("y-axis, reference node or angle not set");
563  return IRRT_NOTFOUND;
564  }
565 
567  IntArray val;
569  if ( val.giveSize() >= 12 ) {
570  OOFEM_WARNING("wrong input data for condensed dofs");
571  return IRRT_BAD_FORMAT;
572  }
573 
574  //dofsToCondense = new IntArray(val);
575  DofIDItem mask[] = {
576  D_u, D_v, D_w, R_u, R_v, R_w
577  };
578  this->numberOfCondensedDofs = val.giveSize();
579  for ( int i = 1; i <= val.giveSize(); i++ ) {
580  if ( val.at(i) <= 6 ) {
581  if ( ghostNodes [ 0 ] == NULL ) {
582  ghostNodes [ 0 ] = new ElementDofManager(1, giveDomain(), this);
583  }
584  ghostNodes [ 0 ]->appendDof( new MasterDof(ghostNodes [ 0 ], mask [ val.at(i) - 1 ]) );
585  } else {
586  if ( ghostNodes [ 1 ] == NULL ) {
587  ghostNodes [ 1 ] = new ElementDofManager(1, giveDomain(), this);
588  }
589  ghostNodes [ 1 ]->appendDof( new MasterDof(ghostNodes [ 1 ], mask [ val.at(i) - 7 ]) );
590  }
591  }
592 
593  } else {
594  //dofsToCondense = NULL;
595  }
596 
597  this->subsoilMat = 0;
599 
601 }
602 
603 
604 void
605 Beam3d :: giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
606 {
607 #if 0
608  FloatMatrix stiffness;
609  FloatArray u;
610 
611  this->computeStiffnessMatrix(stiffness, SecantStiffness, tStep);
612  this->computeVectorOf(VM_Total, tStep, u);
613  answer.beProductOf(stiffness, u);
614 #else
615  BeamBaseElement :: giveInternalForcesVector(answer, tStep, useUpdatedGpRecord);
616  if (subsoilMat) {
617  // add internal forces due to subsoil interaction
618  // @todo: linear subsoil assumed here; more general approach should integrate internal forces
619  FloatMatrix k;
620  FloatArray u, F;
621  this->computeSubSoilStiffnessMatrix(k, TangentStiffness, tStep);
622  this->computeVectorOf(VM_Total, tStep, u);
623  F.beProductOf(k, u);
624  answer.add(F);
625  }
626 #endif
627 }
628 
629 
630 void
632 {
633  this->giveStructuralCrossSection()->give3dBeamStiffMtrx(answer, rMode, gp, tStep);
634 }
635 
636 
637 void
639 {
640  this->giveStructuralCrossSection()->giveGeneralizedStress_Beam3d(answer, gp, strain, tStep);
641 }
642 
643 
644 void
646 {
647  // computes exact global end-forces vector
648  FloatArray loadEndForces;
649 
650  this->giveInternalForcesVector(answer, tStep);
651 
652  // add exact end forces due to nonnodal loading
653  this->computeLocalForceLoadVector(loadEndForces, tStep, VM_Total); // will compute only contribution of loads applied directly on receiver (not using sets)
654  if ( loadEndForces.giveSize() ) {
655  answer.subtract(loadEndForces);
656  }
657  /*
658  if (subsoilMat) {
659  // @todo: linear subsoil assumed here; more general approach should integrate internal forces
660  FloatMatrix k;
661  FloatArray u, F;
662  this->computeSubSoilStiffnessMatrix(k, TangentStiffness, tStep);
663  this->computeVectorOf(VM_Total, tStep, u);
664  F.beProductOf(k, u);
665  answer.add(F);
666  }
667  */
668 }
669 
670 
671 void
673 {
674  FloatArray rl, Fl;
675 
676  fprintf(File, "beam element %d (%8d) :\n", this->giveLabel(), this->giveNumber() );
677 
678  // ask for global element displacement vector
679  this->computeVectorOf(VM_Total, tStep, rl);
680  // ask for global element end forces vector
681  this->giveEndForcesVector(Fl, tStep);
682 
683  fprintf(File, " local displacements ");
684  for ( auto &val : rl ) {
685  fprintf( File, " %.4e", val );
686  }
687 
688  fprintf(File, "\n local end forces ");
689  for ( auto &val : Fl ) {
690  fprintf( File, " %.4e", val );
691  }
692 
693  fprintf(File, "\n");
694 
695  for ( auto &iRule: integrationRulesArray ) {
696  iRule->printOutputAt(File, tStep);
697  }
698 }
699 
700 
701 void
703 {
704  FloatArray lc(1);
705  BeamBaseElement :: computeBodyLoadVectorAt(answer, load, tStep, mode);
706  answer.times( this->giveCrossSection()->give(CS_Area, lc, this) );
707 }
708 
709 
710 void
711 Beam3d :: computeConsistentMassMatrix(FloatMatrix &answer, TimeStep *tStep, double &mass, const double *ipDensity)
712 {
713  FloatMatrix stiff;
714  GaussPoint *gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
715 
716  /*
717  * SructuralElement::computeMassMatrix(answer, tStep);
718  * answer.times(this->giveCrossSection()->give('A'));
719  */
720  double l = this->computeLength();
721  double kappay = this->giveKappayCoeff(tStep);
722  double kappaz = this->giveKappazCoeff(tStep);
723  double kappay2 = kappay * kappay;
724  double kappaz2 = kappaz * kappaz;
725 
726  double density = this->giveStructuralCrossSection()->give('d', gp); // constant density assumed
727  if ( ipDensity != NULL ) {
728  // Override density if desired
729  density = * ipDensity;
730  }
731 
732  double area = this->giveCrossSection()->give(CS_Area, gp); // constant area assumed
733  double c2y = ( area * density ) / ( ( 1. + 2. * kappay ) * ( 1. + 2. * kappay ) );
734  double c2z = ( area * density ) / ( ( 1. + 2. * kappaz ) * ( 1. + 2. * kappaz ) );
735  double c1 = ( area * density );
736 
737  answer.resize(12, 12);
738  answer.zero();
739 
740  answer.at(1, 1) = c1 * l / 3.0;
741  answer.at(1, 7) = c1 * l / 6.0;
742  answer.at(2, 2) = c2z * l * ( 13. / 35. + 7. * kappaz / 5. + 4. * kappaz2 / 3. );
743  answer.at(2, 6) = -c2z * l * l * ( 11. / 210. + kappaz * 11. / 60. + kappaz2 / 6. );
744  answer.at(2, 8) = c2z * l * ( 9. / 70. + kappaz * 3. / 5. + kappaz2 * 2. / 3. );
745  answer.at(2, 12) = c2z * l * l * ( 13. / 420. + kappaz * 3. / 20. + kappaz2 / 6. );
746  answer.at(3, 3) = c2y * l * ( 13. / 35. + 7. * kappay / 5. + 4. * kappay2 / 3. );
747  answer.at(3, 5) = -c2y * l * l * ( 11. / 210. + kappay * 11. / 60. + kappay2 / 6. );
748  answer.at(3, 9) = c2y * l * ( 9. / 70. + kappay * 3. / 5. + kappay2 * 2. / 3. );
749  answer.at(3, 11) = c2y * l * l * ( 13. / 420. + kappay * 3. / 20. + kappay2 / 6. );
750  answer.at(5, 5) = c2y * l * l * l * ( 1. / 105. + kappay / 30. + kappay2 / 30. );
751  answer.at(5, 9) = -c2y * l * l * ( 13. / 420. + kappay * 3. / 20. + kappay2 / 6. );
752  answer.at(5, 11) = -c2y * l * l * l * ( 1. / 140. + kappay / 30. + kappay2 / 30. );
753  answer.at(6, 6) = c2z * l * l * l * ( 1. / 105. + kappaz / 30. + kappaz2 / 30. );
754  answer.at(6, 8) = -c2z * l * l * ( 13. / 420. + kappaz * 3. / 20. + kappaz2 / 6. );
755  answer.at(6, 12) = -c2z * l * l * l * ( 1. / 140. + kappaz / 30. + kappaz2 / 30. );
756 
757 
758  answer.at(7, 7) = c1 * l / 3.0;
759  answer.at(8, 8) = c2z * l * ( 13. / 35. + kappaz * 7. / 5. + kappaz2 * 4. / 3. );
760  answer.at(8, 12) = c2z * l * l * ( 11. / 210. + kappaz * 11. / 60. + kappaz2 / 6. );
761  answer.at(9, 9) = c2y * l * ( 13. / 35. + kappay * 7. / 5. + kappay2 * 4. / 3. );
762  answer.at(9, 11) = c2y * l * l * ( 11. / 210. + kappay * 11. / 60. + kappay2 / 6. );
763  answer.at(11, 11) = c2y * l * l * l * ( 1. / 105. + kappay / 30. + kappay2 / 30. );
764  answer.at(12, 12) = c2z * l * l * l * ( 1. / 105. + kappaz / 30. + kappaz2 / 30. );
765 
766  answer.symmetrized();
767 
768  mass = area * l * density;
769 }
770 
771 
772 int
774 {
775  double ksi, n1, n2;
776 
777  ksi = lcoords.at(1);
778  n1 = ( 1. - ksi ) * 0.5;
779  n2 = ( 1. + ksi ) * 0.5;
780 
781  answer.resize(3);
782  answer.at(1) = n1 * this->giveNode(1)->giveCoordinate(1) + n2 * this->giveNode(2)->giveCoordinate(1);
783  answer.at(2) = n1 * this->giveNode(1)->giveCoordinate(2) + n2 * this->giveNode(2)->giveCoordinate(2);
784  answer.at(3) = n1 * this->giveNode(1)->giveCoordinate(3) + n2 * this->giveNode(2)->giveCoordinate(3);
785 
786  return 1;
787 }
788 
789 
790 void
792 {
793  // computes initial stress matrix of receiver (or geometric stiffness matrix)
794 
795  FloatMatrix stiff;
796  FloatArray endForces;
797 
798  double l = this->computeLength();
799  double kappay = this->giveKappayCoeff(tStep);
800  double kappaz = this->giveKappazCoeff(tStep);
801  double kappay2 = kappay * kappay;
802  double kappaz2 = kappaz * kappaz;
803  double minVal;
804  double denomy = ( 1. + 2. * kappay ) * ( 1. + 2. * kappay ), denomz = ( 1. + 2. * kappaz ) * ( 1. + 2. * kappaz );
805  double N;
806 
807  answer.resize(12, 12);
808  answer.zero();
809 
810  answer.at(2, 2) = ( 4. * kappaz2 + 4. * kappaz + 6. / 5. ) / denomz;
811  answer.at(2, 6) = ( l / 10. ) / denomz;
812  answer.at(2, 8) = ( -4. * kappaz2 - 4. * kappaz - 6. / 5. ) / denomz;
813  answer.at(2, 12) = ( l / 10. ) / denomz;
814 
815  answer.at(3, 3) = ( 4. * kappay2 + 4. * kappay + 6. / 5. ) / denomy;
816  answer.at(3, 5) = ( -l / 10. ) / denomy;
817  answer.at(3, 9) = ( -4. * kappay2 - 4. * kappay - 6. / 5. ) / denomy;
818  answer.at(3, 11) = ( -l / 10. ) / denomy;
819 
820  answer.at(5, 5) = l * l * ( kappay2 / 3. + kappay / 3. + 2. / 15. ) / denomy;
821  answer.at(5, 9) = ( l / 10. ) / denomy;
822  answer.at(5, 11) = -l * l * ( kappay2 / 3. + kappay / 3. + 1. / 30. ) / denomy;
823 
824  answer.at(6, 6) = l * l * ( kappaz2 / 3. + kappaz / 3. + 2. / 15. ) / denomz;
825  answer.at(6, 8) = ( -l / 10. ) / denomz;
826  answer.at(6, 12) = -l * l * ( kappaz2 / 3. + kappaz / 3. + 1. / 30. ) / denomz;
827 
828  answer.at(8, 8) = ( 4. * kappaz2 + 4. * kappaz + 6. / 5. ) / denomz;
829  answer.at(8, 12) = ( -l / 10. ) / denomz;
830 
831  answer.at(9, 9) = ( 4. * kappay2 + 4. * kappay + 6. / 5. ) / denomy;
832  answer.at(9, 11) = ( l / 10. ) / denomy;
833 
834  answer.at(11, 11) = l * l * ( kappay2 / 3. + kappay / 3. + 2. / 15. ) / denomy;
835  answer.at(12, 12) = l * l * ( kappaz2 / 3. + kappaz / 3. + 2. / 15. ) / denomz;
836 
837  minVal = min( fabs( answer.at(2, 2) ), fabs( answer.at(3, 3) ) );
838  minVal = min( minVal, fabs( answer.at(5, 5) ) );
839  minVal = min( minVal, fabs( answer.at(6, 6) ) );
840 
841  answer.at(1, 1) = minVal / 1000.;
842  answer.at(1, 7) = -answer.at(1, 1);
843  answer.at(7, 7) = answer.at(1, 1);
844 
845  answer.at(4, 4) = minVal / 1000.;
846  answer.at(4, 10) = -answer.at(4, 4);
847  answer.at(10, 10) = answer.at(4, 4);
848 
849 
850 
851  answer.symmetrized();
852  // ask end forces in g.c.s
853  this->giveEndForcesVector(endForces, tStep);
854 
855  N = ( -endForces.at(1) + endForces.at(7) ) / 2.;
856  answer.times(N / l);
857 
858  //answer.beLumpedOf (mass);
859 }
860 
861 
862 void
864  GaussPoint *slaveGp, TimeStep *tStep)
865 {
866  double layerYCoord, layerZCoord;
867 
868  layerZCoord = slaveGp->giveNaturalCoordinate(2);
869  layerYCoord = slaveGp->giveNaturalCoordinate(1);
870 
871  answer.resize(3); // {Exx,GMzx,GMxy}
872 
873  answer.at(1) = masterGpStrain.at(1) + masterGpStrain.at(5) * layerZCoord - masterGpStrain.at(6) * layerYCoord;
874  answer.at(2) = masterGpStrain.at(2);
875  answer.at(3) = masterGpStrain.at(3);
876 }
877 
878 
879 Interface *
881 {
882  if ( interface == FiberedCrossSectionInterfaceType ) {
883  return static_cast< FiberedCrossSectionInterface * >( this );
884  } else if (interface == Beam3dSubsoilMaterialInterfaceType ) {
885  return static_cast< Beam3dSubsoilMaterialInterface * >( this );
886  } else if (interface == VTKXMLExportModuleElementInterfaceType) {
887  return static_cast< VTKXMLExportModuleElementInterface * >( this );
888  }
889 
890  return NULL;
891 }
892 
893 
894 void
896 {
898  if ( this->referenceNode ) {
899  this->referenceNode = f(this->referenceNode, ERS_DofManager);
900  }
901 }
902 
903 
904 #ifdef __OOFEG
906 {
907  GraphicObj *go;
908 
909  if ( !gc.testElementGraphicActivity(this) ) {
910  return;
911  }
912 
913  // if (!go) { // create new one
914  WCRec p [ 2 ]; /* poin */
915  EASValsSetLineWidth(OOFEG_RAW_GEOMETRY_WIDTH);
916  EASValsSetColor( gc.getElementColor() );
917  EASValsSetLayer(OOFEG_RAW_GEOMETRY_LAYER);
918  p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveCoordinate(1);
919  p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveCoordinate(2);
920  p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveCoordinate(3);
921  p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveCoordinate(1);
922  p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveCoordinate(2);
923  p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveCoordinate(3);
924  go = CreateLine3D(p);
925  EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | LAYER_MASK, go);
926  EGAttachObject(go, ( EObjectP ) this);
927  EMAddGraphicsToModel(ESIModel(), go);
928 }
929 
930 
932 {
933  GraphicObj *go;
934 
935  if ( !gc.testElementGraphicActivity(this) ) {
936  return;
937  }
938 
939  double defScale = gc.getDefScale();
940  // if (!go) { // create new one
941  WCRec p [ 2 ]; /* poin */
942  EASValsSetLineWidth(OOFEG_DEFORMED_GEOMETRY_WIDTH);
943  EASValsSetColor( gc.getDeformedElementColor() );
944  EASValsSetLayer(OOFEG_DEFORMED_GEOMETRY_LAYER);
945  p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(1, tStep, defScale);
946  p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(2, tStep, defScale);
947  p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(3, tStep, defScale);
948 
949  p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(1, tStep, defScale);
950  p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(2, tStep, defScale);
951  p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(3, tStep, defScale);
952  go = CreateLine3D(p);
953  EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | LAYER_MASK, go);
954  EMAddGraphicsToModel(ESIModel(), go);
955 }
956 #endif
957 
958 void
960 {
961  // only winkler model supported now (passing only unknown interpolation)
962  this->computeNmatrixAt(gp->giveNaturalCoordinates(), answer);
963 }
964 
965 
966 void
968  MatResponseMode rMode, TimeStep *tStep)
969 {
970 
971  double l = this->computeLength();
972  FloatMatrix N, DN, d;
973  answer.clear();
974  for ( GaussPoint *gp: *this->giveDefaultIntegrationRulePtr() ) {
975  this->computeSubSoilNMatrixAt(gp, N);
976  ((StructuralMaterial*)this->domain->giveMaterial(subsoilMat))->give3dBeamSubSoilStiffMtrx(d, rMode, gp, tStep);
977  double dV = gp->giveWeight() * 0.5 * l;
978  DN.beProductOf(d, N);
979  answer.plusProductSymmUpper(N, DN, dV);
980  }
981  answer.symmetrized();
982 }
983 
984 int
985 Beam3d :: computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords, const FloatArray &pCoords)
986 {
987  double ksi, n1, n2;
988 
989  ksi = lcoords.at(1);
990  n1 = ( 1. - ksi ) * 0.5;
991  n2 = ( 1. + ksi ) * 0.5;
992 
993  answer.resize(3);
994  answer.at(1) = n1 * this->giveNode(1)->giveCoordinate(1) + n2 * pCoords.at(1);
995  answer.at(2) = n1 * this->giveNode(1)->giveCoordinate(2) + n2 * pCoords.at(2);
996  answer.at(3) = n1 * this->giveNode(1)->giveCoordinate(3) + n2 * pCoords.at(3);
997 
998  return 1;
999 }
1000 
1001 void
1003 {
1004 
1005  // computes exact global end-forces vector
1006  FloatArray loadEndForces, iF;
1007  IntArray leftIndx = {1, 2 , 3, 4, 5 , 6};
1008  this->giveEndForcesVector(iF, tStep);
1009 
1010  answer.beSubArrayOf(iF, leftIndx);
1011  Node *nodeA;
1012 
1013  nodeA = this->giveNode(1);
1014  double dx = nodeA->giveCoordinate(1) - coords.at(1);
1015  double dy = nodeA->giveCoordinate(2) - coords.at(2);
1016  double dz = nodeA->giveCoordinate(3) - coords.at(3);
1017  double ds = sqrt(dx * dx + dy * dy + dz * dz);
1018 
1019  answer.at(5) += iF.at(3)*ds;
1020  answer.at(6) -= iF.at(2)*ds;
1021 
1022 
1023 
1024  // loop over body load array first
1025  int nBodyLoads = this->giveBodyLoadArray()->giveSize();
1026  FloatArray help;
1027 
1028  for ( int i = 1; i <= nBodyLoads; i++ ) {
1029  int id = bodyLoadArray.at(i);
1030  Load *load = domain->giveLoad(id);
1031  bcGeomType ltype = load->giveBCGeoType();
1032  if ( ( ltype == BodyLoadBGT ) && ( load->giveBCValType() == ForceLoadBVT ) ) {
1033  this->computeInternalForcesFromBodyLoadVectorAtPoint(help,load, tStep, VM_Total, coords, ds); // this one is local
1034  answer.add(help);
1035  } else {
1036  if ( load->giveBCValType() != TemperatureBVT && load->giveBCValType() != EigenstrainBVT ) {
1037  // temperature and eigenstrain is handled separately at computeLoadVectorAt subroutine
1038  OOFEM_ERROR("body load %d is of unsupported type (%d)", id, ltype);
1039  }
1040  }
1041  }
1042 
1043  // loop over boundary load array
1044  int nBoundaryLoads = this->giveBoundaryLoadArray()->giveSize() / 2;
1045  for ( int i = 1; i <= nBoundaryLoads; i++ ) {
1046  int n = boundaryLoadArray.at(1 + ( i - 1 ) * 2);
1047  int id = boundaryLoadArray.at(i * 2);
1048  Load *load = domain->giveLoad(n);
1049  BoundaryLoad* bLoad;
1050  if ((bLoad = dynamic_cast<BoundaryLoad*> (load))) {
1051  bcGeomType ltype = load->giveBCGeoType();
1052  if ( ltype == EdgeLoadBGT ) {
1054  ExternalForcesVector, VM_Total, tStep, coords, ds, false);
1055  answer.add(help);
1056 
1057  } else {
1058  OOFEM_ERROR("boundary load %d is of unsupported type (%d)", id, ltype);
1059  }
1060  }
1061  }
1062  // add exact end forces due to nonnodal loading
1063  // this->computeForceLoadVectorAt(loadEndForces, tStep, VM_Total, coords); // will compute only contribution of loads applied directly on receiver (not using sets)
1064  if ( loadEndForces.giveSize() ) {
1065  answer.subtract(loadEndForces);
1066  }
1067 
1068  // add exact end forces due to nonnodal loading applied indirectly (via sets)
1069  BCTracker *bct = this->domain->giveBCTracker();
1070  BCTracker::entryListType bcList = bct->getElementRecords(this->number);
1071 
1072  for (BCTracker::entryListType::iterator it = bcList.begin(); it != bcList.end(); ++it) {
1073  GeneralBoundaryCondition *bc = this->domain->giveBc((*it).bcNumber);
1074  BodyLoad *bodyLoad;
1075  BoundaryLoad *boundaryLoad;
1076  if (bc->isImposed(tStep)) {
1077  if ((bodyLoad = dynamic_cast<BodyLoad*>(bc))) { // body load
1078  this->computeInternalForcesFromBodyLoadVectorAtPoint(help,bodyLoad, tStep, VM_Total, coords, ds); // this one is local
1079  //answer.subtract(help);
1080  } else if ((boundaryLoad = dynamic_cast<BoundaryLoad*>(bc))) {
1081  // compute Boundary Edge load vector in GLOBAL CS !!!!!!!
1082  this->computeInternalForcesFromBoundaryEdgeLoadVectorAtPoint(help, boundaryLoad, (*it).boundaryId,
1083  ExternalForcesVector, VM_Total, tStep, coords, ds, false);
1084  }
1085  answer.add(help);
1086  }
1087  }
1088 
1089 
1090 
1091 
1092  if (subsoilMat) {
1093  // @todo: linear subsoil assumed here; more general approach should integrate internal forces
1094  FloatMatrix k;
1095  FloatArray u, F;
1096  this->computeSubSoilStiffnessMatrix(k, TangentStiffness, tStep);
1097  this->computeVectorOf(VM_Total, tStep, u);
1098  F.beProductOf(k, u);
1099  answer.add(F);
1100  }
1101 
1102 
1103  answer.times(-1);
1104 
1105 }
1106 
1107 
1108 void
1110 {
1111  answer.clear();
1112 
1113  if ( edge != 1 ) {
1114  OOFEM_ERROR("Beam3D only has 1 edge (the midline) that supports loads. Attempted to apply load to edge %d", edge);
1115  }
1116 
1117  if ( type != ExternalForcesVector ) {
1118  return;
1119  }
1120 
1121  FloatArray coords, t;
1122  FloatMatrix T;
1123 
1124 
1125  for ( GaussPoint *gp: *this->giveDefaultIntegrationRulePtr() ) {
1126  const FloatArray &lcoords = gp->giveNaturalCoordinates();
1127  this->computeGlobalCoordinates(coords, lcoords, pointCoords);
1128  if ( load ) {
1129  load->computeValues(t, tStep, coords, {D_u, D_v, D_w, R_u, R_v, R_w}, mode);
1130  } else {
1131  load->computeValues(t, tStep, lcoords, {D_u, D_v, D_w, R_u, R_v, R_w}, mode);
1132  }
1133 
1134  if ( load->giveCoordSystMode() == Load :: CST_Global ) {
1135  if ( this->computeLoadGToLRotationMtrx(T) ) {
1136  t.rotatedWith(T, 'n');
1137  }
1138  }
1139 
1140 
1141  double dl = gp->giveWeight() * 0.5 * ds;
1142  FloatArray f;
1143  f = t;
1144  f.at(5) += f.at(3) * (lcoords.at(1)+1)*ds/2;
1145  f.at(6) -= f.at(2) * (lcoords.at(1)+1)*ds/2;
1146  answer.add(dl, f);
1147  }
1148 
1149  if (global) {
1150  // Loads from sets expects global c.s.
1151  this->computeGtoLRotationMatrix(T);
1152  answer.rotatedWith(T, 't');
1153  }
1154 }
1155 
1156 void
1158 // Computes numerically the load vector of the receiver due to the body
1159 // loads, at tStep.
1160 // load is assumed to be in global cs.
1161 // load vector is then transformed to coordinate system in each node.
1162 // (should be global coordinate system, but there may be defined
1163 // different coordinate system in each node)
1164 {
1165  double dens, dV;
1166  FloatArray force, ntf;
1167  FloatMatrix n, T;
1168  FloatArray lc(1);
1169 
1170  if ( ( forLoad->giveBCGeoType() != BodyLoadBGT ) || ( forLoad->giveBCValType() != ForceLoadBVT ) ) {
1171  OOFEM_ERROR("unknown load type");
1172  }
1173 
1174  // note: force is assumed to be in global coordinate system.
1175  forLoad->computeComponentArrayAt(force, tStep, mode);
1176  force.times( this->giveCrossSection()->give(CS_Area, lc, this) );
1177  // transform from global to element local c.s
1178  if ( this->computeLoadGToLRotationMtrx(T) ) {
1179  force.rotatedWith(T, 'n');
1180  }
1181 
1182  answer.clear();
1183 
1184  if ( force.giveSize() ) {
1185  for ( GaussPoint *gp: *this->giveDefaultIntegrationRulePtr() ) {
1186  const FloatArray &lcoords = gp->giveNaturalCoordinates();
1187  this->computeNmatrixAt(gp->giveSubPatchCoordinates(), n);
1188  dV = gp->giveWeight() * 0.5 * ds;
1189  dens = this->giveCrossSection()->give('d', gp);
1190  FloatArray iF;
1191  iF = force;
1192  iF.at(5) += force.at(3) * (lcoords.at(1)+1)*ds/2;
1193  iF.at(6) -= force.at(2) * (lcoords.at(1)+1)*ds/2;
1194  answer.add(dV * dens, iF);
1195  }
1196  } else {
1197  return;
1198  }
1199 
1200 
1201 
1202 }
1203 
1204 
1205 void
1206 Beam3d :: giveCompositeExportData(std::vector< VTKPiece > &vtkPieces, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep )
1207 {
1208 
1209 
1210  // divide element into several small ones
1211  vtkPieces.resize(1);
1212  vtkPieces[0].setNumberOfCells(Beam3d_nSubBeams);
1213  int nNodes = 2 * Beam3d_nSubBeams;
1214  vtkPieces[0].setNumberOfNodes(nNodes);
1215  FloatArray nodeXi(nNodes), xi(1);
1216 
1217  Node *nodeA, *nodeB;
1218  nodeA = this->giveNode(1);
1219  nodeB = this->giveNode(2);
1220  double dx = (nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1))/Beam3d_nSubBeams;
1221  double dy = (nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2))/Beam3d_nSubBeams;
1222  double dz = (nodeB->giveCoordinate(3) - nodeA->giveCoordinate(3))/Beam3d_nSubBeams;
1223  FloatArray coords(3);
1224  int nodeNumber = 1;
1225  int val = 1;
1226  int offset = 0;
1227  IntArray connectivity(2);
1228  for (int i = 0; i < Beam3d_nSubBeams; i++) {
1229  for (int j = 0; j < 2; j++) {
1230  coords.at(1) = nodeA->giveCoordinate(1) + (i+j) * dx;
1231  coords.at(2) = nodeA->giveCoordinate(2) + (i+j) * dy;
1232  coords.at(3) = nodeA->giveCoordinate(3) + (i+j) * dz;
1233  vtkPieces[0].setNodeCoords(nodeNumber,coords);
1234  nodeXi.at(nodeNumber) = -1.0+(2.0/Beam3d_nSubBeams)*(i+j);
1235  nodeNumber++;
1236  connectivity.at(j+1) = val++;
1237 
1238  }
1239  vtkPieces[0].setConnectivity(i+1, connectivity);
1240  offset += 2;
1241  vtkPieces[0].setOffset(i+1, offset);
1242  vtkPieces[0].setCellType(i+1,3);
1243  }
1244 
1245 
1246 
1247  InternalStateType isttype;
1248  int n = internalVarsToExport.giveSize();
1249  vtkPieces[0].setNumberOfInternalVarsToExport(n, nNodes);
1250  for ( int i = 1; i <= n; i++ ) {
1251  isttype = ( InternalStateType ) internalVarsToExport.at(i);
1252  for (int nN = 1; nN <= nNodes; nN++) {
1253  if ( isttype == IST_BeamForceMomentTensor ) {
1254  FloatArray coords = vtkPieces[0].giveNodeCoords(nN);
1255  FloatArray endForces;
1256  this->giveInternalForcesVectorAtPoint(endForces, tStep, coords);
1257  vtkPieces[0].setInternalVarInNode( i, nN, endForces );
1258  } else {
1259  fprintf( stderr, "VTKXMLExportModule::exportIntVars: unsupported variable type %s\n", __InternalStateTypeToString(isttype) );
1260  }
1261  }
1262  }
1263 
1264  primaryVarsToExport.giveSize();
1265  vtkPieces[0].setNumberOfPrimaryVarsToExport(n, nNodes);
1266  for ( int i = 1; i <= n; i++ ) {
1267  UnknownType utype = (UnknownType) primaryVarsToExport.at(i);
1268  if ( utype == DisplacementVector ) {
1269  FloatMatrix Tgl, n;
1270  FloatArray d(3);
1271 
1273  for (int nN = 1; nN <= nNodes; nN++) {
1274  FloatArray u, dl, dg;
1275  this->computeVectorOf(VM_Total, tStep, u);
1276  xi.at(1) = nodeXi.at(nN);
1277  this->computeNmatrixAt(xi, n);
1278  dl.beProductOf(n,u); // local interpolated displacement
1279  dg.beTProductOf(Tgl, dl); // local displacement tranformed to global c.s.
1280  d.at(1)=dg.at(1); d.at(2)=dg.at(2); d.at(3)=dg.at(3);
1281  vtkPieces[0].setPrimaryVarInNode( i, nN, d );
1282  }
1283  } else {
1284  fprintf( stderr, "VTKXMLExportModule::exportPrimaryVars: unsupported variable type %s\n", __UnknownTypeToString(utype) );
1285  }
1286  }
1287 
1288 }
1289 
1290 
1291 
1292 
1293 
1294 } // end namespace oofem
CrossSection * giveCrossSection()
Definition: element.C:495
void giveInternalForcesVectorAtPoint(FloatArray &answer, TimeStep *tStep, FloatArray &coords)
Definition: beam3d.C:1002
virtual void drawDeformedGeometry(oofegGraphicContext &gc, TimeStep *tStep, UnknownType)
Definition: beam3d.C:931
int testElementGraphicActivity(Element *)
Test if particular element passed fulfills various filtering criteria for its graphics output...
virtual bool isImposed(TimeStep *tStep)
Returns nonzero if receiver representing BC is imposed at given time, otherwise returns zero...
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
void subtract(const FloatArray &src)
Subtracts array src to receiver.
Definition: floatarray.C:258
int number
Component number.
Definition: femcmpnn.h:80
This class keeps track of applied boundary conditions on individual entities.
Definition: bctracker.h:53
virtual void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Computes numerically stiffness matrix of receiver.
Definition: beam3d.C:194
void computeSubSoilStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Definition: beam3d.C:967
bool hasDofs2Condense()
Definition: beam3d.h:220
IntArray * giveBoundaryLoadArray()
Returns array containing load numbers of boundary loads acting on element.
Definition: element.C:381
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
#define Beam3d_nSubBeams
Definition: beam3d.h:54
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
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Returns local vector of unknowns.
Definition: element.C:86
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Access method for default integration rule.
Definition: element.h:822
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
Definition: beam3d.C:361
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: beam3d.C:638
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
Class implementing internal element dof manager having some DOFs.
virtual void computeInitialStressMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes initial stress matrix for linear stability problem.
Definition: beam3d.C:791
void computeKappaCoeffs(TimeStep *tStep)
Definition: beam3d.C:431
void computeSubSoilNMatrixAt(GaussPoint *gp, FloatMatrix &answer)
Definition: beam3d.C:959
Load is specified in global c.s.
Definition: load.h:70
#define _IFT_Beam3d_zaxis
Definition: beam3d.h:50
bcGeomType
Type representing the geometric character of loading.
Definition: bcgeomtype.h:40
double giveKappazCoeff(TimeStep *tStep)
Definition: beam3d.C:467
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
Beam3d(int n, Domain *d)
Definition: beam3d.C:66
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
Definition: valuemodetype.h:78
Class implementing element body load, acting over whole element volume (e.g., the dead weight)...
Definition: bodyload.h:49
virtual int computeLoadGToLRotationMtrx(FloatMatrix &answer)
Returns transformation matrix from global coordinate system to local element coordinate system for el...
Definition: beam3d.C:262
#define OOFEG_RAW_GEOMETRY_LAYER
This class implements a structural material status information.
Definition: structuralms.h:65
double referenceAngle
Definition: beam3d.h:83
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
Elements with geometry defined as EGT_Composite are exported using individual pieces.
BCTracker * giveBCTracker()
Definition: domain.C:427
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
virtual int giveLocalCoordinateSystem(FloatMatrix &answer)
Returns local coordinate system of receiver Required by material models with ortho- and anisotrophy...
Definition: beam3d.C:478
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
Definition: domain.C:433
virtual CoordSystType giveCoordSystMode()
Returns receiver&#39;s coordinate system.
Definition: boundaryload.h:151
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
virtual void updateLocalNumbering(EntityRenumberingFunctor &f)
Local renumbering support.
Definition: beam3d.C:895
virtual void giveGeneralizedStress_Beam3d(FloatArray &answer, GaussPoint *gp, const FloatArray &generalizedStrain, TimeStep *tStep)=0
virtual FEInterpolation * giveInterpolation() const
Definition: beam3d.C:85
#define _IFT_Beam3d_dofstocondense
Definition: beam3d.h:47
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Prints output of receiver to stream, for given time step.
Definition: beam3d.C:672
double kappaz
Definition: beam3d.h:80
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes boundary condition value - its components values at given time.
Definition: load.C:82
virtual double giveCoordinate(int i)
Definition: node.C:82
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 void computeLocalForceLoadVector(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Computes element end force vector from applied loading in local coordinate system.
const char * __UnknownTypeToString(UnknownType _value)
Definition: cltypes.C:302
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *, int useUpdatedGpRecord=0)
Returns equivalent nodal forces vectors.
Definition: beam3d.C:605
virtual void B3SSMI_getUnknownsGtoLRotationMatrix(FloatMatrix &answer)
Evaluate transformation matrix for reciver unknowns.
Definition: beam3d.C:335
#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
virtual int computeNumberOfGlobalDofs()
Computes the total number of element&#39;s global dofs.
Definition: beam3d.h:120
Distributed body load.
Definition: bcgeomtype.h:43
double giveKappayCoeff(TimeStep *tStep)
Definition: beam3d.C:456
const entryListType & getElementRecords(int elem)
Definition: bctracker.C:100
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: beam3d.C:545
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
GeneralBoundaryCondition * giveBc(int n)
Service for accessing particular domain bc.
Definition: domain.C:243
Class representing a general abstraction for finite element interpolation class.
Definition: feinterpol.h:132
Class representing "master" degree of freedom.
Definition: masterdof.h:92
virtual void computeValues(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, const IntArray &dofids, ValueModeType mode)
Computes components values for specified dof ids.
Definition: load.C:57
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
Definition: gausspoint.h:136
virtual ~Beam3d()
Definition: beam3d.C:79
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. ...
Distributed edge load.
Definition: bcgeomtype.h:44
Abstract base class representing a boundary load (force, momentum, ...) that acts directly on a bound...
Definition: boundaryload.h:110
Material * giveMaterial(int n)
Service for accessing particular domain material model.
Definition: domain.C:281
#define M_PI
Definition: mathfem.h:52
void computeInternalForcesFromBodyLoadVectorAtPoint(FloatArray &answer, Load *forLoad, TimeStep *tStep, ValueModeType mode, FloatArray &pointCoords, double ds)
Definition: beam3d.C:1157
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
Definition: floatarray.C:463
int numberOfCondensedDofs
number of condensed DOFs
Definition: beam3d.h:93
virtual void giveCompositeExportData(std::vector< VTKPiece > &vtkPieces, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep)
Definition: beam3d.C:1206
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Computes the global coordinates from given element&#39;s local coordinates.
Definition: beam3d.C:773
#define OOFEM_ERROR(...)
Definition: error.h:61
virtual void drawRawGeometry(oofegGraphicContext &gc, TimeStep *tStep)
Definition: beam3d.C:905
REGISTER_Element(LSpace)
void computeInternalForcesFromBoundaryEdgeLoadVectorAtPoint(FloatArray &answer, BoundaryLoad *load, int edge, CharType type, ValueModeType mode, TimeStep *tStep, FloatArray &pointCoords, double ds, bool global)
Definition: beam3d.C:1109
DofIDItem
Type representing particular dof type.
Definition: dofiditem.h:86
#define _IFT_Beam3d_refnode
Definition: beam3d.h:48
DofManager * ghostNodes[2]
Definition: beam3d.h:91
#define OOFEG_RAW_GEOMETRY_WIDTH
virtual double giveWeight()
Returns integration weight of receiver.
Definition: gausspoint.h:181
virtual bool computeGtoLRotationMatrix(FloatMatrix &answer)
Returns transformation matrix from global c.s.
Definition: beam3d.C:281
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.
void times(double f)
Multiplies receiver by factor f.
Definition: floatmatrix.C:1594
virtual void FiberedCrossSectionInterface_computeStrainVectorInFiber(FloatArray &answer, const FloatArray &masterGpStrain, GaussPoint *slaveGp, TimeStep *tStep)
Computes full 3d strain vector in element fiber.
Definition: beam3d.C:863
IntArray * giveBodyLoadArray()
Returns array containing load numbers of loads acting on element.
Definition: element.C:372
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: beam3d.C:702
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
Definition: floatarray.C:676
virtual double giveUpdatedCoordinate(int ic, TimeStep *tStep, double scale=1.)
Returns updated ic-th coordinate of receiver.
Definition: node.C:245
IntArray bodyLoadArray
Array containing indexes of loads (body loads and boundary loads are kept separately), that apply on receiver.
Definition: element.h:160
#define N(p, q)
Definition: mdm.C:367
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
Definition: floatmatrix.C:698
static FEI3dLineLin interp
Geometry interpolator only.
Definition: beam3d.h:78
Abstract base class for all boundary conditions of problem.
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix^T and anArray.
Definition: floatarray.C:708
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
virtual void give3dBeamStiffMtrx(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Computes the stiffness matrix for 2d beams.
#define _IFT_Beam3d_subsoilmat
Definition: beam3d.h:51
void appendDof(Dof *dof)
Adds the given Dof into the receiver.
Definition: dofmanager.C:134
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
Class representing vector of real numbers.
Definition: floatarray.h:82
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
Definition: beam3d.C:354
int subsoilMat
Subsoil material.
Definition: beam3d.h:96
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
std::list< Entry > entryListType
Definition: bctracker.h:64
void beSubArrayOf(const FloatArray &src, const IntArray &indx)
Extract sub vector form src array and stores the result into receiver.
Definition: floatarray.C:379
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
Definition: gausspoint.h:205
FloatArray zaxis
Definition: beam3d.h:82
CharType
Definition: chartype.h:87
double kappay
Definition: beam3d.h:80
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 computeConsistentMassMatrix(FloatMatrix &answer, TimeStep *tStep, double &mass, const double *ipDensity=NULL)
Computes consistent mass matrix of receiver using numerical integration over element volume...
Definition: beam3d.C:711
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
Returns equivalent nodal forces vectors.
void add(const FloatMatrix &a)
Adds matrix to the receiver.
Definition: floatmatrix.C:1023
int referenceNode
Definition: beam3d.h:81
Class Interface.
Definition: interface.h:82
virtual bcGeomType giveBCGeoType() const
Returns geometry character of boundary condition.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
Definition: beam3d.C:880
virtual void computeGaussPoints()
Initializes the array of integration rules member variable.
Definition: beam3d.C:133
#define OOFEG_DEFORMED_GEOMETRY_WIDTH
void times(double s)
Multiplies receiver with scalar.
Definition: floatarray.C:818
Abstract base class for all "structural" constitutive models.
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 void computeBmatrixAt(GaussPoint *, FloatMatrix &, int=1, int=ALL_STRAINS)
Computes the geometrical matrix of receiver in given integration point.
Definition: beam3d.C:88
virtual void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &)
Computes interpolation matrix for element unknowns.
Definition: beam3d.C:146
The element interface required by FiberedCrossSection.
Definition: fiberedcs.h:220
virtual FloatArray * giveCoordinates()
Definition: node.h:114
void zero()
Zeroes all coefficient of receiver.
Definition: floatmatrix.C:1326
Domain * giveDomain() const
Definition: femcmpnn.h:100
InterfaceType
Enumerative type, used to identify interface type.
Definition: interfacetype.h:43
int min(int i, int j)
Returns smaller value from two given decimals.
Definition: mathfem.h:59
const char * __InternalStateTypeToString(InternalStateType _value)
Definition: cltypes.C:298
Load is base abstract class for all loads.
Definition: load.h:61
#define _IFT_Beam3d_refangle
Definition: beam3d.h:49
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
Definition: floatmatrix.C:337
virtual TimeStep * giveCurrentStep(bool force=false)
Returns current time step.
Definition: engngm.h:683
int giveSize() const
Definition: intarray.h:203
int giveSize() const
Returns the size of receiver.
Definition: floatarray.h:218
void giveEndForcesVector(FloatArray &answer, TimeStep *tStep)
Definition: beam3d.C:645
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
Computes constitutive matrix of receiver.
Definition: beam3d.C:631
Node * giveNode(int n)
Service for accessing particular domain node.
Definition: domain.h:371
int giveLabel() const
Definition: element.h:1055
the oofem namespace is to define a context or scope in which all oofem names are defined.
void clear()
Sets size of receiver to be an empty matrix. It will have zero rows and zero columns size...
Definition: floatmatrix.h:516
virtual bcValType giveBCValType() const
Returns receiver load type.
Class implementing node in finite element mesh.
Definition: node.h:87
virtual void updateLocalNumbering(EntityRenumberingFunctor &f)
Local renumbering support.
Definition: element.C:1511
#define IR_GIVE_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:69
int giveNumber() const
Definition: femcmpnn.h:107
Interface defining required functionality from associated element.
Definition: winklermodel.h:103
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
double length
Definition: beam3d.h:80
Load * giveLoad(int n)
Service for accessing particular domain load.
Definition: domain.C:222
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
Definition: floatmatrix.C:1576
virtual void giveDofManDofIDMask(int inode, IntArray &) const
Returns dofmanager dof mask for node.
Definition: beam3d.C:403
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Class representing integration point in finite element program.
Definition: gausspoint.h:93
#define OOFEM_WARNING(...)
Definition: error.h:62
virtual void computeBoundaryEdgeLoadVector(FloatArray &answer, BoundaryLoad *load, int edge, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true)
Computes the contribution of the given load at the given boundary edge.
Definition: beam3d.C:217
IntArray boundaryLoadArray
Definition: element.h:160
Class representing solution step.
Definition: timestep.h:80
int numberOfDofMans
Number of dofmanagers.
Definition: element.h:149
void add(const FloatArray &src)
Adds array src to receiver.
Definition: floatarray.C:156
This class implements a base beam intented to be a base class for beams based on lagrangian interpola...
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
Definition: gausspoint.h:138
Class representing Gaussian-quadrature integration rule.
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Adds the product .
Definition: floatarray.C:226
virtual double computeLength()
Computes the length (zero for all but 1D geometries)
Definition: beam3d.C:412

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