OOFEM 3.0
Loading...
Searching...
No Matches
qdkt.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 - 2025 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
38#include "fei2dquadlin.h"
39#include "node.h"
40#include "material.h"
41#include "crosssection.h"
42#include "gausspoint.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
55namespace oofem {
57
59
69
70
73
74
77{
78 return & interp_lin;
79}
80
81
82void
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 ] = std::make_unique< GaussIntegrationRule >(1, this, 1, 5);
90 }
91}
92
93void
95// Returns the [5x12] strain-displacement matrix {B} of the receiver,
96// evaluated at gp.
97{
98 // get node coordinates
99 double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;
100 this->giveNodeCoordinates(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4);
101
102 // get gp coordinates
103 double ksi = gp->giveNaturalCoordinate(1);
104 double eta = gp->giveNaturalCoordinate(2);
105
106 // geometrical characteristics of element sides
107 double dx4 = x2 - x1;
108 double dy4 = y2 - y1;
109 double l4 = sqrt(dx4 * dx4 + dy4 * dy4);
110
111 double dx5 = x3 - x2;
112 double dy5 = y3 - y2;
113 double l5 = sqrt(dx5 * dx5 + dy5 * dy5);
114
115 double dx6 = x4 - x3;
116 double dy6 = y4 - y3;
117 double l6 = sqrt(dx6 * dx6 + dy6 * dy6);
118
119 double dx7 = x1 - x4;
120 double dy7 = y1 - y4;
121 double l7 = sqrt(dx7 * dx7 + dy7 * dy7);
122
123 double c4 = dy4 / l4;
124 double s4 = -dx4 / l4;
125
126 double c5 = dy5 / l5;
127 double s5 = -dx5 / l5;
128
129 double c6 = dy6 / l6;
130 double s6 = -dx6 / l6;
131
132 double c7 = dy7 / l7;
133 double s7 = -dx7 / l7;
134
135 // transformation matrix from vertex dofs (w,fi_x, fi_y) to quadratic rotation DOFs
136 double T101 = -3. / 2. / l4 * c4;
137 double T102 = -1. / 4. * c4 * c4 + 1. / 2. * s4 * s4;
138 double T103 = -1. / 4. * c4 * s4 - 1. / 2. * c4 * s4;
139 double T104 = 3. / 2. / l4 * c4;
140 double T105 = -1. / 4. * c4 * c4 + 1. / 2. * s4 * s4;
141 double T106 = -1. / 4. * c4 * s4 - 1. / 2. * c4 * s4;
142
143 double T201 = -3. / 2. / l4 * s4;
144 double T202 = -1. / 4. * c4 * s4 - 1. / 2. * c4 * s4;
145 double T203 = -1. / 4. * s4 * s4 + 1. / 2. * c4 * c4;
146 double T204 = 3. / 2. / l4 * s4;
147 double T205 = -1. / 4. * c4 * s4 - 1. / 2. * c4 * s4;
148 double T206 = -1. / 4. * s4 * s4 + 1. / 2. * c4 * c4;
149
150 double T304 = -3. / 2. / l5 * c5;
151 double T305 = -1. / 4. * c5 * c5 + 1. / 2. * s5 * s5;
152 double T306 = -1. / 4. * c5 * s5 - 1. / 2. * c5 * s5;
153 double T307 = 3. / 2. / l5 * c5;
154 double T308 = -1. / 4. * c5 * c5 + 1. / 2. * s5 * s5;
155 double T309 = -1. / 4. * c5 * s5 - 1. / 2. * c5 * s5;
156
157 double T404 = -3. / 2. / l5 * s5;
158 double T405 = -1. / 4. * c5 * s5 - 1. / 2. * c5 * s5;
159 double T406 = -1. / 4. * s5 * s5 + 1. / 2. * c5 * c5;
160 double T407 = 3. / 2. / l5 * s5;
161 double T408 = -1. / 4. * c5 * s5 - 1. / 2. * c5 * s5;
162 double T409 = -1. / 4. * s5 * s5 + 1. / 2. * c5 * c5;
163
164 double T507 = -3. / 2. / l6 * c6;
165 double T508 = -1. / 4. * c6 * c6 + 1. / 2. * s6 * s6;
166 double T509 = -1. / 4. * c6 * s6 - 1. / 2. * c6 * s6;
167 double T510 = 3. / 2. / l6 * c6;
168 double T511 = -1. / 4. * c6 * c6 + 1. / 2. * s6 * s6;
169 double T512 = -1. / 4. * c6 * s6 - 1. / 2. * c6 * s6;
170
171 double T607 = -3. / 2. / l6 * s6;
172 double T608 = -1. / 4. * c6 * s6 - 1. / 2. * c6 * s6;
173 double T609 = -1. / 4. * s6 * s6 + 1. / 2. * c6 * c6;
174 double T610 = 3. / 2. / l6 * s6;
175 double T611 = -1. / 4. * c6 * s6 - 1. / 2. * c6 * s6;
176 double T612 = -1. / 4. * s6 * s6 + 1. / 2. * c6 * c6;
177
178 double T701 = 3. / 2. / l7 * c7;
179 double T702 = -1. / 4. * c7 * c7 + 1. / 2. * s7 * s7;
180 double T703 = -1. / 4. * c7 * s7 - 1. / 2. * c7 * s7;
181 double T710 = -3. / 2. / l7 * c7;
182 double T711 = -1. / 4. * c7 * c7 + 1. / 2. * s7 * s7;
183 double T712 = -1. / 4. * c7 * s7 - 1. / 2. * c7 * s7;
184
185 double T801 = 3. / 2. / l7 * s7;
186 double T802 = -1. / 4. * c7 * s7 - 1. / 2. * c7 * s7;
187 double T803 = -1. / 4. * s7 * s7 + 1. / 2. * c7 * c7;
188 double T810 = -3. / 2. / l7 * s7;
189 double T811 = -1. / 4. * c7 * s7 - 1. / 2. * c7 * s7;
190 double T812 = -1. / 4. * s7 * s7 + 1. / 2. * c7 * c7;
191
192 // derivatives of quadratic interpolation functions
193 // we do not have "midside" nodes -> explicit here
194 double N1dk = 0.25 * ( 2.0 * ksi + eta ) * ( 1.0 + eta );
195 double N2dk = 0.25 * ( 2.0 * ksi - eta ) * ( 1.0 + eta );
196 double N3dk = 0.25 * ( 2.0 * ksi + eta ) * ( 1.0 - eta );
197 double N4dk = 0.25 * ( 2.0 * ksi - eta ) * ( 1.0 - eta );
198 double N7dk = -ksi * ( 1.0 - eta );
199 double N8dk = 0.5 * ( 1.0 - eta * eta );
200 double N5dk = -ksi * ( 1.0 + eta );
201 double N6dk = -0.5 * ( 1.0 - eta * eta );
202
203 double N3de = 0.25 * ( 2.0 * eta + ksi ) * ( 1.0 - ksi );
204 double N4de = 0.25 * ( 2.0 * eta - ksi ) * ( 1.0 + ksi );
205 double N1de = 0.25 * ( 2.0 * eta + ksi ) * ( 1.0 + ksi );
206 double N2de = 0.25 * ( 2.0 * eta - ksi ) * ( 1.0 - ksi );
207 double N7de = -0.5 * ( 1.0 - ksi * ksi );
208 double N8de = -eta * ( 1.0 + ksi );
209 double N5de = 0.5 * ( 1.0 - ksi * ksi );
210 double N6de = -eta * ( 1.0 - ksi );
211
212 double detJ = 1. / 8. * ( ( y4 - y2 ) * ( x3 - x1 ) - ( y3 - y1 ) * ( x4 - x2 ) ) +
213 ksi / 8 * ( ( y3 - y4 ) * ( x2 - x1 ) - ( y2 - y1 ) * ( x3 - x4 ) ) +
214 eta / 8 * ( ( y4 - y1 ) * ( x3 - x2 ) - ( y3 - y2 ) * ( x4 - x1 ) );
215
216 double dxdk = -1.0 / detJ * ( ( y3 - y2 ) + ( y4 - y1 + ksi * ( y1 - y2 + y3 - y4 ) ) ) / 4.0;
217 double dxde = 1.0 / detJ * ( ( y2 - y1 ) + ( y3 - y4 + eta * ( y1 - y2 + y3 - y4 ) ) ) / 4.0;
218 double dydk = 1.0 / detJ * ( ( x3 - x2 ) + ( x4 - x1 + ksi * ( x1 - x2 + x3 - x4 ) ) ) / 4.0;
219 double dyde = -1.0 / detJ * ( ( x2 - x1 ) + ( x3 - x4 + eta * ( x1 - x2 + x3 - x4 ) ) ) / 4.0;
220
221 double dN102 = N1dk * dxdk + N1de * dxde;
222 double dN104 = N2dk * dxdk + N2de * dxde;
223 double dN106 = N3dk * dxdk + N3de * dxde;
224 double dN108 = N4dk * dxdk + N4de * dxde;
225 double dN110 = N5dk * dxdk + N5de * dxde;
226 double dN112 = N6dk * dxdk + N6de * dxde;
227 double dN114 = N7dk * dxdk + N7de * dxde;
228 double dN116 = N8dk * dxdk + N8de * dxde;
229
230 double dN201 = -N1dk * dydk - N1de * dyde;
231 double dN203 = -N2dk * dydk - N2de * dyde;
232 double dN205 = -N3dk * dydk - N3de * dyde;
233 double dN207 = -N4dk * dydk - N4de * dyde;
234 double dN209 = -N5dk * dydk - N5de * dyde;
235 double dN211 = -N6dk * dydk - N6de * dyde;
236 double dN213 = -N7dk * dydk - N7de * dyde;
237 double dN215 = -N8dk * dydk - N8de * dyde;
238
239 answer.resize(5, 12);
240 answer.zero();
241
242 answer.at(1, 1) = T201 * dN110 + T801 * dN116;
243 answer.at(1, 2) = T202 * dN110 + T802 * dN116;
244 answer.at(1, 3) = dN102 + T203 * dN110 + T803 * dN116;
245 answer.at(1, 4) = T204 * dN110 + T404 * dN112;
246 answer.at(1, 5) = T205 * dN110 + T405 * dN112;
247 answer.at(1, 6) = dN104 + T206 * dN110 + T406 * dN112;
248 answer.at(1, 7) = T407 * dN112 + T607 * dN114;
249 answer.at(1, 8) = T408 * dN112 + T608 * dN114;
250 answer.at(1, 9) = dN106 + T409 * dN112 + T609 * dN114;
251 answer.at(1, 10) = T610 * dN114 + T810 * dN116;
252 answer.at(1, 11) = T611 * dN114 + T811 * dN116;
253 answer.at(1, 12) = dN108 + T612 * dN114 + T812 * dN116;
254
255 answer.at(2, 1) = T101 * dN209 + T701 * dN215;
256 answer.at(2, 2) = dN201 + T102 * dN209 + T702 * dN215;
257 answer.at(2, 3) = T103 * dN209 + T703 * dN215;
258 answer.at(2, 4) = T104 * dN209 + T304 * dN211;
259 answer.at(2, 5) = dN203 + T105 * dN209 + T305 * dN211;
260 answer.at(2, 6) = T106 * dN209 + T306 * dN211;
261 answer.at(2, 7) = T307 * dN211 + T507 * dN213;
262 answer.at(2, 8) = dN205 + T308 * dN211 + T508 * dN213;
263 answer.at(2, 9) = T309 * dN211 + T509 * dN213;
264 answer.at(2, 10) = T510 * dN213 + T710 * dN215;
265 answer.at(2, 11) = dN207 + T511 * dN213 + T711 * dN215;
266 answer.at(2, 12) = T512 * dN213 + T712 * dN215;
267
268 answer.at(3, 1) = -T101 * dN110 - T201 * dN209 - T701 * dN116 - T801 * dN215;
269 answer.at(3, 2) = -dN102 - T102 * dN110 - T202 * dN209 - T702 * dN116 - T802 * dN215;
270 answer.at(3, 3) = -dN201 - T103 * dN110 - T203 * dN209 - T703 * dN116 - T803 * dN215;
271 answer.at(3, 4) = -T104 * dN110 - T204 * dN209 - T304 * dN112 - T404 * dN211;
272 answer.at(3, 5) = -dN104 - T105 * dN110 - T205 * dN209 - T305 * dN112 - T405 * dN211;
273 answer.at(3, 6) = -dN203 - T106 * dN110 - T206 * dN209 - T306 * dN112 - T406 * dN211;
274 answer.at(3, 7) = -T307 * dN112 - T407 * dN211 - T507 * dN114 - T607 * dN213;
275 answer.at(3, 8) = -dN106 - T308 * dN112 - T408 * dN211 - T508 * dN114 - T608 * dN213;
276 answer.at(3, 9) = -dN205 - T309 * dN112 - T409 * dN211 - T509 * dN114 - T609 * dN213;
277 answer.at(3, 10) = -T510 * dN114 - T610 * dN213 - T710 * dN116 - T810 * dN215;
278 answer.at(3, 11) = -dN108 - T511 * dN114 - T611 * dN213 - T711 * dN116 - T811 * dN215;
279 answer.at(3, 12) = -dN207 - T512 * dN114 - T612 * dN213 - T712 * dN116 - T812 * dN215;
280
281 // Note: no shear strains, no shear forces => the 4th and 5th rows are zero
282}
283
284
285void
287// Returns the [3x9] displacement interpolation matrix {N} of the receiver,
288// evaluated at gp.
289// Note: this interpolation is not available, as the deflection is cubic along the edges,
290// but not define in the interior of the element
291// Note: the interpolation of rotations is quadratic
292// NOTE: linear interpolation returned instead
293{
295
296 giveInterpolation()->evalN(N, iLocCoord, FEIElementGeometryWrapper(this) );
297
298 answer.beNMatrixOf(N, 3);
299}
300
301
302void
304{
305 answer = this->giveStructuralCrossSection()->giveGeneralizedStress_Plate(strain, gp, tStep);
306}
307
308
309void
310QDKTPlate::computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)
311{
312 answer = this->giveStructuralCrossSection()->give2dPlateStiffMtrx(rMode, gp, tStep);
313}
314
315
316void
317QDKTPlate::giveNodeCoordinates(double &x1, double &x2, double &x3, double &x4,
318 double &y1, double &y2, double &y3, double &y4,
319 double &z1, double &z2, double &z3, double &z4)
320{
321 const auto &nc1 = this->giveNode(1)->giveCoordinates();
322 const auto &nc2 = this->giveNode(2)->giveCoordinates();
323 const auto &nc3 = this->giveNode(3)->giveCoordinates();
324 const auto &nc4 = this->giveNode(4)->giveCoordinates();
325
326 x1 = nc1.at(1);
327 x2 = nc2.at(1);
328 x3 = nc3.at(1);
329 x4 = nc4.at(1);
330
331 y1 = nc1.at(2);
332 y2 = nc2.at(2);
333 y3 = nc3.at(2);
334 y4 = nc4.at(2);
335
336 z1 = nc1.at(3);
337 z2 = nc2.at(3);
338 z3 = nc3.at(3);
339 z4 = nc4.at(3);
340}
341
342
343void
345{
347}
348
349
350void
352{
353 answer = { D_w, R_u, R_v };
354}
355
356
357void
359// returns normal vector to midPlane in GaussPoinr gp of receiver
360{
361 FloatArray u, v;
362 u.beDifferenceOf(this->giveNode(2)->giveCoordinates(), this->giveNode(1)->giveCoordinates() );
363 v.beDifferenceOf(this->giveNode(3)->giveCoordinates(), this->giveNode(1)->giveCoordinates() );
364
365 answer.beVectorProductOf(u, v);
366 answer.normalize();
367}
368
369
370double
372//
373// returns receiver's characteristic length for crack band models
374// for a crack formed in the plane with normal normalToCrackPlane.
375//
376{
377 return this->giveCharacteristicLengthForPlaneElements(normalToCrackPlane);
378}
379
380
381double
383// Returns the portion of the receiver which is attached to gp.
384{
385 double detJ, weight;
386
387 weight = gp->giveWeight();
388 detJ = fabs(this->interp_lin.giveTransformationJacobian(gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ) );
389 return detJ * weight;
390}
391
392
393Interface *
395{
396 if ( interface == LayeredCrossSectionInterfaceType ) {
397 return static_cast< LayeredCrossSectionInterface * >( this );
398 } else if ( interface == ZZNodalRecoveryModelInterfaceType ) {
399 return static_cast< ZZNodalRecoveryModelInterface * >( this );
400 } else if ( interface == SPRNodalRecoveryModelInterfaceType ) {
401 return static_cast< SPRNodalRecoveryModelInterface * >( this );
402 } else if ( interface == ZZErrorEstimatorInterfaceType ) {
403 return static_cast< ZZErrorEstimatorInterface * >( this );
404 }
405
406
407 return NULL;
408}
409
410void
411QDKTPlate::computeBodyLoadVectorAt(FloatArray &answer, Load *forLoad, TimeStep *tStep, ValueModeType mode)
412// Computes numerically the load vector of the receiver due to the body
413// loads, at tStep.
414// load is assumed to be in global cs.
415// load vector is then transformed to coordinate system in each node.
416// (should be global coordinate system, but there may be defined
417// different coordinate system in each node)
418{
419 double dens, dV;
420 FloatArray force, ntf;
421 FloatMatrix n, T;
422
423 if ( ( forLoad->giveBCGeoType() != BodyLoadBGT ) || ( forLoad->giveBCValType() != ForceLoadBVT ) ) {
424 OOFEM_ERROR("unknown load type");
425 }
426
427 // note: force is assumed to be in global coordinate system.
428 forLoad->computeComponentArrayAt(force, tStep, mode);
429 // transform from global to element local c.s
430 if ( this->computeLoadGToLRotationMtrx(T) ) {
431 force.rotatedWith(T, 'n');
432 }
433
434 answer.clear();
435
436 if ( force.giveSize() ) {
437 for ( GaussPoint *gp: * this->giveDefaultIntegrationRulePtr() ) {
438 this->computeNmatrixAt(gp->giveSubPatchCoordinates(), n);
439 dV = this->computeVolumeAround(gp) * this->giveCrossSection()->give(CS_Thickness, gp);
440 dens = this->giveCrossSection()->give('d', gp);
441 ntf.beTProductOf(n, force);
442 answer.add(dV * dens, ntf);
443 }
444 } else {
445 return;
446 }
447}
448
449
450#define POINT_TOL 1.e-3
451
452bool
454//converts global coordinates to local planar area coordinates,
455//does not return a coordinate in the thickness direction, but
456//does check that the point is in the element thickness
457{
458 // get node coordinates
459 double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;
460 this->giveNodeCoordinates(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4);
461
462 // Fetch local coordinates.
463 bool ok = this->interp_lin.global2local(answer, coords, FEIElementGeometryWrapper(this) ) > 0;
464
465 //check that the point is in the element and set flag
466 for ( int i = 1; i <= 4; i++ ) {
467 if ( answer.at(i) < ( 0. - POINT_TOL ) ) {
468 return false;
469 }
470
471 if ( answer.at(i) > ( 1. + POINT_TOL ) ) {
472 return false;
473 }
474 }
475
476 //get midplane location at this point
477 double midplZ;
478 midplZ = z1 * answer.at(1) + z2 * answer.at(2) + z3 * answer.at(3) + z4 * answer.at(4);
479
480 //check that the z is within the element
482 double elthick = cs->give(CS_Thickness, answer, this);
483
484 if ( elthick / 2.0 + midplZ - fabs(coords.at(3) ) < -POINT_TOL ) {
485 answer.zero();
486 return false;
487 }
488
489
490 return ok;
491}
492
493
494int
496{
497 FloatArray help;
498 answer.resize(6);
499 if ( type == IST_ShellForceTensor || type == IST_ShellStrainTensor ) {
500 if ( type == IST_ShellForceTensor ) {
501 help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
502 } else {
503 help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
504 }
505 answer.at(1) = 0.0; // nx
506 answer.at(2) = 0.0; // ny
507 answer.at(3) = 0.0; // nz
508 answer.at(4) = help.at(5); // vyz
509 answer.at(5) = help.at(4); // vxz
510 answer.at(6) = 0.0; // vxy
511 return 1;
512 } else if ( type == IST_ShellMomentTensor || type == IST_CurvatureTensor ) {
513 if ( type == IST_ShellMomentTensor ) {
514 help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStressVector();
515 } else {
516 help = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() )->giveStrainVector();
517 }
518 answer.at(1) = help.at(1); // mx
519 answer.at(2) = help.at(2); // my
520 answer.at(3) = 0.0; // mz
521 answer.at(4) = 0.0; // myz
522 answer.at(5) = 0.0; // mxz
523 answer.at(6) = help.at(3); // mxy
524 return 1;
525 } else {
526 return StructuralElement::giveIPValue(answer, gp, type, tStep);
527 }
528}
529
530
531void
533{
534 pap.resize(4);
535 pap.at(1) = this->giveNode(1)->giveNumber();
536 pap.at(2) = this->giveNode(2)->giveNumber();
537 pap.at(3) = this->giveNode(3)->giveNumber();
538 pap.at(4) = this->giveNode(4)->giveNumber();
539}
540
541
542void
544{
545 answer.resize(1);
546 if ( ( pap == this->giveNode(1)->giveNumber() ) ||
547 ( pap == this->giveNode(2)->giveNumber() ) ||
548 ( pap == this->giveNode(3)->giveNumber() ) ||
549 ( pap == this->giveNode(4)->giveNumber() ) ) {
550 answer.at(1) = pap;
551 } else {
552 OOFEM_ERROR("node unknown");
553 }
554}
555
556
562
563
564//
565// layered cross section support functions
566//
567void
569 GaussPoint *masterGp, GaussPoint *slaveGp, TimeStep *tStep)
570// returns full 3d strain vector of given layer (whose z-coordinate from center-line is
571// stored in slaveGp) for given tStep
572{
573 double layerZeta, layerZCoord, top, bottom;
574
575 top = this->giveCrossSection()->give(CS_TopZCoord, masterGp);
576 bottom = this->giveCrossSection()->give(CS_BottomZCoord, masterGp);
577 layerZeta = slaveGp->giveNaturalCoordinate(3);
578 layerZCoord = 0.5 * ( ( 1. - layerZeta ) * bottom + ( 1. + layerZeta ) * top );
579
580 answer.resize(5); // {Exx,Eyy,GMyz,GMzx,GMxy}
581
582 answer.at(1) = masterGpStrain.at(1) * layerZCoord;
583 answer.at(2) = masterGpStrain.at(2) * layerZCoord;
584 answer.at(5) = masterGpStrain.at(3) * layerZCoord;
585 answer.at(3) = masterGpStrain.at(5);
586 answer.at(4) = masterGpStrain.at(4);
587}
588
589void
591{
592 if ( iEdge == 1 ) { // edge between nodes 1 2
593 answer = { 1, 2, 3, 4, 5, 6 };
594 } else if ( iEdge == 2 ) { // edge between nodes 2 3
595 answer = { 4, 5, 6, 7, 8, 9 };
596 } else if ( iEdge == 3 ) { // edge between nodes 3 4
597 answer = { 7, 8, 9, 10, 11, 12 };
598 } else if ( iEdge == 4 ) { // edge between nodes 4 1
599 answer = { 10, 11, 12, 1, 2, 3 };
600 } else {
601 OOFEM_ERROR("wrong edge number");
602 }
603}
604
605double
607{
608 double detJ = this->interp_lin.edgeGiveTransformationJacobian(iEdge, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) );
609 return detJ * gp->giveWeight();
610}
611
612
613int
615{
616 // returns transformation matrix from
617 // edge local coordinate system
618 // to element local c.s
619 // (same as global c.s in this case)
620 //
621 // i.e. f(element local) = T * f(edge local)
622 //
623
624 const auto &edgeNodes = this->interp_lin.computeLocalEdgeMapping(iEdge);
625
626 auto nodeA = this->giveNode(edgeNodes.at(1) );
627 auto nodeB = this->giveNode(edgeNodes.at(2) );
628
629 double dx = nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1);
630 double dy = nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2);
631 double length = sqrt(dx * dx + dy * dy);
632
633 answer.resize(3, 3);
634 answer.zero();
635 answer.at(1, 1) = 1.0;
636 answer.at(2, 2) = dx / length;
637 answer.at(2, 3) = -dy / length;
638 answer.at(3, 2) = dy / length;
639 answer.at(3, 3) = dx / length;
640
641 return 1;
642}
643
644
645void
647{
648 this->computeNmatrixAt(sgp->giveNaturalCoordinates(), answer);
649}
650
651void
652QDKTPlate::computeSurfaceNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray &lcoords)
653{
654 FloatArray n_vec;
655 this->giveInterpolation()->boundarySurfaceEvalN( n_vec, boundaryID, lcoords, FEIElementGeometryWrapper(this) );
656 answer.beNMatrixOf(n_vec, 3);
657}
658
659void
661{
662 answer.resize(12);
663 answer.zero();
664 if ( iSurf == 1 ) {
665 for ( int i = 1; i <= 12; i++ ) {
666 answer.at(i) = i;
667 }
668 } else {
669 OOFEM_ERROR("wrong surface number");
670 }
671}
672
673
674double
676{
677 return this->computeVolumeAround(gp);
678}
679
680
681int
683{
684 return 0;
685}
686
687
688//
689// io routines
690//
691#ifdef __OOFEG
692void
694{
695 WCRec p[ 4 ];
696 GraphicObj *go;
697
698 if ( !gc.testElementGraphicActivity(this) ) {
699 return;
700 }
701
702 if ( this->giveMaterial()->isActivated(tStep) ) {
703 EASValsSetLineWidth(OOFEG_RAW_GEOMETRY_WIDTH);
704 EASValsSetColor(gc.getElementColor() );
705 EASValsSetEdgeColor(gc.getElementEdgeColor() );
706 EASValsSetEdgeFlag(true);
707 EASValsSetFillStyle(FILL_SOLID);
708 EASValsSetLayer(OOFEG_RAW_GEOMETRY_LAYER);
709 p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveCoordinate(1);
710 p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveCoordinate(2);
711 p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveCoordinate(3);
712 p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveCoordinate(1);
713 p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveCoordinate(2);
714 p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveCoordinate(3);
715 p [ 2 ].x = ( FPNum ) this->giveNode(3)->giveCoordinate(1);
716 p [ 2 ].y = ( FPNum ) this->giveNode(3)->giveCoordinate(2);
717 p [ 2 ].z = ( FPNum ) this->giveNode(3)->giveCoordinate(3);
718 p [ 3 ].x = ( FPNum ) this->giveNode(4)->giveCoordinate(1);
719 p [ 3 ].y = ( FPNum ) this->giveNode(4)->giveCoordinate(2);
720 p [ 3 ].z = 0.;
721
722 go = CreateQuad3D(p);
723 EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
724 EGAttachObject(go, ( EObjectP ) this);
725 EMAddGraphicsToModel(ESIModel(), go);
726 }
727}
728
729
730void
732{
733 WCRec p[ 4 ];
734 GraphicObj *go;
735 double defScale = gc.getDefScale();
736
737 if ( !gc.testElementGraphicActivity(this) ) {
738 return;
739 }
740
741 if ( this->giveMaterial()->isActivated(tStep) ) {
742 EASValsSetLineWidth(OOFEG_DEFORMED_GEOMETRY_WIDTH);
743 EASValsSetColor(gc.getDeformedElementColor() );
744 EASValsSetEdgeColor(gc.getElementEdgeColor() );
745 EASValsSetEdgeFlag(true);
746 EASValsSetFillStyle(FILL_SOLID);
747 EASValsSetLayer(OOFEG_DEFORMED_GEOMETRY_LAYER);
748 p [ 0 ].x = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(1, tStep, defScale);
749 p [ 0 ].y = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(2, tStep, defScale);
750 p [ 0 ].z = ( FPNum ) this->giveNode(1)->giveUpdatedCoordinate(3, tStep, defScale);
751 p [ 1 ].x = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(1, tStep, defScale);
752 p [ 1 ].y = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(2, tStep, defScale);
753 p [ 1 ].z = ( FPNum ) this->giveNode(2)->giveUpdatedCoordinate(3, tStep, defScale);
754 p [ 2 ].x = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(1, tStep, defScale);
755 p [ 2 ].y = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(2, tStep, defScale);
756 p [ 2 ].z = ( FPNum ) this->giveNode(3)->giveUpdatedCoordinate(3, tStep, defScale);
757 p [ 3 ].x = ( FPNum ) this->giveNode(4)->giveUpdatedCoordinate(1, tStep, defScale);
758 p [ 3 ].y = ( FPNum ) this->giveNode(4)->giveUpdatedCoordinate(2, tStep, defScale);
759 p [ 3 ].z = ( FPNum ) this->giveNode(4)->giveUpdatedCoordinate(3, tStep, defScale);
760
761 go = CreateQuad3D(p);
762 EGWithMaskChangeAttributes(WIDTH_MASK | FILL_MASK | COLOR_MASK | EDGE_COLOR_MASK | EDGE_FLAG_MASK | LAYER_MASK, go);
763 EMAddGraphicsToModel(ESIModel(), go);
764 }
765}
766
767
768void
770{
771 int i, indx, result = 0;
772 WCRec p[ 4 ];
773 GraphicObj *tr;
774 FloatArray v[ 4 ];
775 double s[ 4 ], defScale;
776
777 if ( !gc.testElementGraphicActivity(this) ) {
778 return;
779 }
780
781 EASValsSetLayer(OOFEG_VARPLOT_PATTERN_LAYER);
782 if ( gc.giveIntVarMode() == ISM_recovered ) {
783 for ( i = 1; i <= 4; i++ ) {
784 result += this->giveInternalStateAtNode(v [ i - 1 ], gc.giveIntVarType(), gc.giveIntVarMode(), i, tStep);
785 }
786
787 if ( result != 4 ) {
788 return;
789 }
790
791 indx = gc.giveIntVarIndx();
792
793 for ( i = 1; i <= 4; i++ ) {
794 s [ i - 1 ] = v [ i - 1 ].at(indx);
795 }
796
797 if ( gc.getScalarAlgo() == SA_ISO_SURF ) {
798 for ( i = 0; i < 4; i++ ) {
799 if ( gc.getInternalVarsDefGeoFlag() ) {
800 // use deformed geometry
801 defScale = gc.getDefScale();
802 p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(1, tStep, defScale);
803 p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(2, tStep, defScale);
804 p [ i ].z = 0.;
805 } else {
806 p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(1);
807 p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(2);
808 p [ i ].z = 0.;
809 }
810 }
811
812 //EASValsSetColor(gc.getYieldPlotColor(ratio));
813 gc.updateFringeTableMinMax(s, 4);
814 tr = CreateQuadWD3D(p, s [ 0 ], s [ 1 ], s [ 2 ], s [ 3 ]);
815 EGWithMaskChangeAttributes(LAYER_MASK, tr);
816 EMAddGraphicsToModel(ESIModel(), tr);
817 } else if ( ( gc.getScalarAlgo() == SA_ZPROFILE ) || ( gc.getScalarAlgo() == SA_COLORZPROFILE ) ) {
818 double landScale = gc.getLandScale();
819
820 for ( i = 0; i < 4; i++ ) {
821 if ( gc.getInternalVarsDefGeoFlag() ) {
822 // use deformed geometry
823 defScale = gc.getDefScale();
824 p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(1, tStep, defScale);
825 p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(2, tStep, defScale);
826 p [ i ].z = s [ i ] * landScale;
827 } else {
828 p [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(1);
829 p [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(2);
830 p [ i ].z = s [ i ] * landScale;
831 }
832
833 // this fixes a bug in ELIXIR
834 if ( fabs(s [ i ]) < 1.0e-6 ) {
835 s [ i ] = 1.0e-6;
836 }
837 }
838
839 if ( gc.getScalarAlgo() == SA_ZPROFILE ) {
840 EASValsSetColor(gc.getDeformedElementColor() );
841 EASValsSetLineWidth(OOFEG_DEFORMED_GEOMETRY_WIDTH);
842 tr = CreateQuad3D(p);
843 EGWithMaskChangeAttributes(WIDTH_MASK | COLOR_MASK | LAYER_MASK, tr);
844 } else {
845 gc.updateFringeTableMinMax(s, 4);
846 tr = CreateQuadWD3D(p, s [ 0 ], s [ 1 ], s [ 2 ], s [ 3 ]);
847 EGWithMaskChangeAttributes(LAYER_MASK, tr);
848 }
849
850 EMAddGraphicsToModel(ESIModel(), tr);
851 }
852 } else if ( gc.giveIntVarMode() == ISM_local ) {
853 if ( integrationRulesArray [ 0 ]->giveNumberOfIntegrationPoints() != 4 ) {
854 return;
855 }
856
857 IntArray ind(4);
858 WCRec pp[ 9 ];
859
860 for ( i = 0; i < 4; i++ ) {
861 if ( gc.getInternalVarsDefGeoFlag() ) {
862 // use deformed geometry
863 defScale = gc.getDefScale();
864 pp [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(1, tStep, defScale);
865 pp [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveUpdatedCoordinate(2, tStep, defScale);
866 pp [ i ].z = 0.;
867 } else {
868 pp [ i ].x = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(1);
869 pp [ i ].y = ( FPNum ) this->giveNode(i + 1)->giveCoordinate(2);
870 pp [ i ].z = 0.;
871 }
872 }
873
874 for ( i = 0; i < 3; i++ ) {
875 pp [ i + 4 ].x = 0.5 * ( pp [ i ].x + pp [ i + 1 ].x );
876 pp [ i + 4 ].y = 0.5 * ( pp [ i ].y + pp [ i + 1 ].y );
877 pp [ i + 4 ].z = 0.5 * ( pp [ i ].z + pp [ i + 1 ].z );
878 }
879
880 pp [ 7 ].x = 0.5 * ( pp [ 3 ].x + pp [ 0 ].x );
881 pp [ 7 ].y = 0.5 * ( pp [ 3 ].y + pp [ 0 ].y );
882 pp [ 7 ].z = 0.5 * ( pp [ 3 ].z + pp [ 0 ].z );
883
884 pp [ 8 ].x = 0.25 * ( pp [ 0 ].x + pp [ 1 ].x + pp [ 2 ].x + pp [ 3 ].x );
885 pp [ 8 ].y = 0.25 * ( pp [ 0 ].y + pp [ 1 ].y + pp [ 2 ].y + pp [ 3 ].y );
886 pp [ 8 ].z = 0.25 * ( pp [ 0 ].z + pp [ 1 ].z + pp [ 2 ].z + pp [ 3 ].z );
887
888 for ( GaussPoint *gp: * this->giveDefaultIntegrationRulePtr() ) {
889 const FloatArray &gpCoords = gp->giveNaturalCoordinates();
890 if ( ( gpCoords.at(1) > 0. ) && ( gpCoords.at(2) > 0. ) ) {
891 ind.at(1) = 0;
892 ind.at(2) = 4;
893 ind.at(3) = 8;
894 ind.at(4) = 7;
895 } else if ( ( gpCoords.at(1) < 0. ) && ( gpCoords.at(2) > 0. ) ) {
896 ind.at(1) = 4;
897 ind.at(2) = 1;
898 ind.at(3) = 5;
899 ind.at(4) = 8;
900 } else if ( ( gpCoords.at(1) < 0. ) && ( gpCoords.at(2) < 0. ) ) {
901 ind.at(1) = 5;
902 ind.at(2) = 2;
903 ind.at(3) = 6;
904 ind.at(4) = 8;
905 } else {
906 ind.at(1) = 6;
907 ind.at(2) = 3;
908 ind.at(3) = 7;
909 ind.at(4) = 8;
910 }
911
912 if ( giveIPValue(v [ 0 ], gp, gc.giveIntVarType(), tStep) == 0 ) {
913 return;
914 }
915
916 indx = gc.giveIntVarIndx();
917
918 for ( i = 1; i <= 4; i++ ) {
919 s [ i - 1 ] = v [ 0 ].at(indx);
920 }
921
922 for ( i = 0; i < 4; i++ ) {
923 p [ i ].x = pp [ ind.at(i + 1) ].x;
924 p [ i ].y = pp [ ind.at(i + 1) ].y;
925 p [ i ].z = pp [ ind.at(i + 1) ].z;
926 }
927
928 gc.updateFringeTableMinMax(s, 4);
929 tr = CreateQuadWD3D(p, s [ 0 ], s [ 1 ], s [ 2 ], s [ 3 ]);
930 EGWithMaskChangeAttributes(LAYER_MASK, tr);
931 EMAddGraphicsToModel(ESIModel(), tr);
932 }
933 }
934}
935
936#endif
937} // end namespace oofem
double length(const Vector &a)
Definition CSG.h:88
#define N(a, b)
#define REGISTER_Element(class)
virtual double give(CrossSectionProperty a, GaussPoint *gp) const
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
double giveCoordinate(int i) const
Definition dofmanager.h:383
const FloatArray & giveCoordinates() const
Definition dofmanager.h:390
Node * giveNode(int i) const
Definition element.h:629
virtual bool isActivated(TimeStep *tStep)
Definition element.C:838
void initializeFrom(InputRecord &ir, int priority) override
Definition element.C:687
virtual Material * giveMaterial()
Definition element.C:523
int numberOfDofMans
Number of dofmanagers.
Definition element.h:136
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
Definition element.h:157
int numberOfGaussPoints
Definition element.h:175
double giveCharacteristicLengthForPlaneElements(const FloatArray &normalToCrackPlane)
Definition element.C:1188
CrossSection * giveCrossSection()
Definition element.C:534
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Definition element.h:886
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual void boundarySurfaceEvalN(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
int giveNumber() const
Definition femcmpnn.h:104
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Definition floatarray.C:403
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void rotatedWith(FloatMatrix &r, char mode)
Definition floatarray.C:814
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
Definition floatarray.C:476
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
void add(const FloatArray &src)
Definition floatarray.C:218
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void beNMatrixOf(const FloatArray &n, int nsd)
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
Definition gausspoint.h:136
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Definition gausspoint.h:138
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Definition gausspoint.h:204
double giveWeight()
Returns integration weight of receiver.
Definition gausspoint.h:180
virtual bcGeomType giveBCGeoType() const
void resize(int n)
Definition intarray.C:73
void zero()
Sets all component to zero.
Definition intarray.C:52
int & at(std::size_t i)
Definition intarray.h:104
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Definition load.C:84
virtual double giveUpdatedCoordinate(int ic, TimeStep *tStep, double scale=1.)
Definition node.C:234
void giveEdgeDofMapping(IntArray &answer, int iEdge) const override
Definition qdkt.C:590
void computeSurfaceNMatrixAt(FloatMatrix &answer, int iSurf, GaussPoint *gp)
Definition qdkt.C:646
void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) override
Definition qdkt.C:310
void giveSurfaceDofMapping(IntArray &answer, int iSurf) const override
Definition qdkt.C:660
FEInterpolation * giveInterpolation() const override
Definition qdkt.C:72
void drawScalar(oofegGraphicContext &gc, TimeStep *tStep) override
Definition qdkt.C:769
bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords) override
Definition qdkt.C:453
void giveDofManDofIDMask(int inode, IntArray &) const override
Definition qdkt.C:351
int computeLoadLSToLRotationMatrix(FloatMatrix &answer, int iSurf, GaussPoint *gp) override
Definition qdkt.C:682
static FEI2dQuadLin interp_lin
Element geometry approximation.
Definition qdkt.h:71
void initializeFrom(InputRecord &ir, int priority) override
Definition qdkt.C:344
virtual void giveNodeCoordinates(double &x1, double &x2, double &x3, double &x4, double &y1, double &y2, double &y3, double &y4, double &z1, double &z2, double &z3, double &z4)
Definition qdkt.C:317
double computeEdgeVolumeAround(GaussPoint *gp, int iEdge) override
Definition qdkt.C:606
void drawDeformedGeometry(oofegGraphicContext &gc, TimeStep *tStep, UnknownType type) override
Definition qdkt.C:731
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int=1, int=ALL_STRAINS) override
Definition qdkt.C:94
void computeBodyLoadVectorAt(FloatArray &answer, Load *forLoad, TimeStep *tStep, ValueModeType mode) override
Definition qdkt.C:411
double computeSurfaceVolumeAround(GaussPoint *gp, int iSurf) override
Definition qdkt.C:675
int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp) override
Definition qdkt.C:614
void computeSurfaceNMatrix(FloatMatrix &answer, int boundaryID, const FloatArray &lcoords) override
Definition qdkt.C:652
SPRPatchType SPRNodalRecoveryMI_givePatchType() override
Definition qdkt.C:558
void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &answer) override
Definition qdkt.C:286
double giveCharacteristicLength(const FloatArray &normalToCrackPlane) override
Definition qdkt.C:371
void computeStrainVectorInLayer(FloatArray &answer, const FloatArray &masterGpStrain, GaussPoint *masterGp, GaussPoint *slaveGp, TimeStep *tStep) override
Definition qdkt.C:568
void SPRNodalRecoveryMI_giveDofMansDeterminedByPatch(IntArray &answer, int pap) override
Definition qdkt.C:543
double computeVolumeAround(GaussPoint *gp) override
Definition qdkt.C:382
QDKTPlate(int n, Domain *d)
Definition qdkt.C:60
void computeGaussPoints() override
Definition qdkt.C:83
void computeMidPlaneNormal(FloatArray &answer, const GaussPoint *gp) override
Definition qdkt.C:358
void drawRawGeometry(oofegGraphicContext &gc, TimeStep *tStep) override
Definition qdkt.C:693
void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) override
Definition qdkt.C:303
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
Definition qdkt.C:495
void SPRNodalRecoveryMI_giveSPRAssemblyPoints(IntArray &pap) override
Definition qdkt.C:532
Interface * giveInterface(InterfaceType it) override
Definition qdkt.C:394
virtual FloatMatrixF< 5, 5 > give2dPlateStiffMtrx(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const =0
virtual FloatArrayF< 5 > giveGeneralizedStress_Plate(const FloatArrayF< 5 > &generalizedStrain, GaussPoint *gp, TimeStep *tStep) const =0
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
StructuralElement(int n, Domain *d)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
int giveInternalStateAtNode(FloatArray &answer, InternalStateType type, InternalStateMode mode, int node, TimeStep *tStep) override
virtual int computeLoadGToLRotationMtrx(FloatMatrix &answer)
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
ZZErrorEstimatorInterface(Element *element)
Constructor.
ZZNodalRecoveryModelInterface(Element *element)
Constructor.
#define OOFEM_ERROR(...)
Definition error.h:79
#define POINT_TOL
@ CS_BottomZCoord
Bottom z coordinate.
@ CS_Thickness
Thickness.
@ CS_TopZCoord
Top z coordinate.
@ BodyLoadBGT
Distributed body load.
Definition bcgeomtype.h:43
@ ForceLoadBVT
Definition bcvaltype.h:43
@ SPRNodalRecoveryModelInterfaceType
@ ZZNodalRecoveryModelInterfaceType
@ LayeredCrossSectionInterfaceType
@ ZZErrorEstimatorInterfaceType
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define OOFEG_VARPLOT_PATTERN_LAYER
#define OOFEG_DEFORMED_GEOMETRY_LAYER
#define OOFEG_DEFORMED_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_WIDTH
#define OOFEG_RAW_GEOMETRY_LAYER

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011