OOFEM 3.0
Loading...
Searching...
No Matches
htselement.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//last edit: 07/02/2013 by Jan Novak
35
37#include "gausspoint.h"
38#include "floatmatrix.h"
39#include "floatarray.h"
40#include "intarray.h"
41#include "node.h"
42#include "mathfem.h"
43#include "boundaryload.h"
44#include "classfactory.h"
45
46namespace oofem {
48
49HTSelement :: HTSelement(int n, Domain *aDomain) : StructuralElement(n, aDomain)
50 // Constructor.
51{
52 this->lambda = 8;
53 this->mu = 8;
54 this->numberOfStressDofs = 12;
55 // numberOfEdges = 3;
56 numberOfEdges = 4;
59}
60
61
62void
63HTSelement :: giveDofManDofIDMask(int inode, IntArray &answer) const
64
65{
66 if ( inode <= numberOfEdges ) {
67 answer.clear();
68 } else {
69 answer = {D_u_edge_const, D_u_edge_lin, D_v_edge_const, D_v_edge_lin};
70 }
71}
72
73
74void
76{
77 StructuralElement :: postInitialize();
79
81}
82
83void
84HTSelement :: computeGaussPoints()
85{
86 if ( integrationRulesArray.size() == 0 ) {
88
89 for ( int i = 0; i < numberOfEdges; i++ ) {
90 integrationRulesArray [ i ] = std::make_unique<GaussIntegrationRule>(i + 1, this, 1, 100);
91 integrationRulesArray [ i ]->SetUpPointsOnLine(numberOfGaussPoints, _1dMat);
92 }
93 }
94}
95
96void
97HTSelement :: computeCenterOfGravity()
98{
99 double area = 0, sX = 0, sY = 0;
100 double aX, aY, bX, bY;
101 Node *nodeA, *nodeB;
102
103 for ( int i = 0; i < numberOfEdges; i++ ) {
104 nodeA = this->giveSideNode(i + 1, 1);
105 nodeB = this->giveSideNode(i + 1, 2);
106
107 aX = nodeA->giveCoordinate(1);
108 aY = nodeA->giveCoordinate(2);
109 bX = nodeB->giveCoordinate(1);
110 bY = nodeB->giveCoordinate(2);
111 area += ( bX - aX ) * ( bY + aY ) / 2;
112
113 sY += ( ( aX * aX ) + ( bX - aX ) * aX + ( bX - aX ) * ( bX - aX ) / 3 ) * ( bY - aY ) / 2.0;
114 sX += ( ( aY * aY ) + ( bY - aY ) * aY + ( bY - aY ) * ( bY - aY ) / 3 ) * ( bX - aX ) / 2.0;
115 }
116
117 cgX = -sY / area;
118 cgY = sX / area;
119}
120
121Node *
122HTSelement :: giveSideNode(int elementSideNumber, int nodeNumber)
123{
124 int firstNodeNumber = elementSideNumber;
125 int secondNodeNumber = elementSideNumber + 1;
126 if ( secondNodeNumber > numberOfEdges ) {
127 secondNodeNumber = 1;
128 }
129 if ( nodeNumber == 1 ) {
130 return this->giveNode(firstNodeNumber);
131 } else if ( nodeNumber == 2 ) {
132 return this->giveNode(secondNodeNumber);
133 } else {
134 //error("Only two nodes per side");
135 return 0;
136 }
137}
138
139
140double
141HTSelement :: computeVolumeAroundSide(GaussPoint *gp, int elemSideNumber)
142// Returns the length of the receiver. This method is valid only if 1
143// Gauss point is used.
144{
145 return 0.5 * this->giveSideLength(elemSideNumber) * gp->giveWeight(); // * this->giveCrossSection()->give(CS_Area);
146}
147
148double
149HTSelement :: giveSideLength(int sideNumber)
150{
151 Node *nodeA;
152 Node *nodeB;
153 double dx, dy;
154 nodeA = this->giveSideNode(sideNumber, 1);
155 nodeB = this->giveSideNode(sideNumber, 2);
156 dx = nodeB->giveCoordinate(1) - nodeA->giveCoordinate(1);
157 dy = nodeB->giveCoordinate(2) - nodeA->giveCoordinate(2);
158 return sqrt(dx * dx + dy * dy);
159}
160
161
162void
163HTSelement :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode,
164 TimeStep *tStep)
165// Computes numerically the stiffness matrix of the receiver.
166{
167 double dV;
169 answer.zero();
170
171 FloatMatrix Fedge, Aedge, F, A, N;
173 F.zero();
175 A.zero();
176 for ( int i = 0; i < numberOfEdges; i++ ) {
177 this->computeOutwardNormalMatrix(N, i + 1);
178 for ( GaussPoint *gp: *this->giveIntegrationRule(i) ) {
179 dV = this->computeVolumeAroundSide(gp, i + 1);
180 this->computeFMatrixAt(Fedge, N, gp, i + 1);
181 Fedge.times(dV);
182 this->computeAMatrixAt(Aedge, N, gp, i + 1);
183 Aedge.times(dV);
184 F.add(Fedge);
185 }
186 for ( int k = 0; k < numberOfStressDofs; k++ ) {
187 for ( int l = 0; l < 4; l++ ) {
188 A(k, l + i * 4) = Aedge(k, l);
189 }
190 }
191 }
192
193 // kondenzace
194 FloatMatrix invF;
195 invF.beInverseOf(F);
196
197 FloatMatrix FG;
198 FG.beProductOf(invF, A);
199 answer.beTProductOf(A, FG);
200}
201
202
203void
204HTSelement :: computePuVectorAt(FloatArray &answer, FloatMatrix N, FloatArray u, GaussPoint *gp, int sideNumber) //\int{(NSv)^T*u}
205{
206 FloatMatrix Sv, NSv;
207 //answer.resize() ??? otazka zda bude nutne ji preskejlovat, asi alo jo vzhledem k tomu jaky element vracim (ctverec, trojuhelnik)
208 answer.zero(); //radsi ano
209 this->computeSvMatrixAt(Sv, gp, sideNumber); //the quation is whether (NSv)^t Uv will operate on the same gp
210 //if so, this matrix should be calculated just once in F matrix
211 NSv.beProductOf(N, Sv);
212 // answer.beTProductOf(NSv, u);
213} //end of computePuVectorAt
214
215
216void
217HTSelement :: computePsVectorAt(FloatArray &answer, FloatArray t, GaussPoint *gp) //\int{Ugamma^T*t}
218{
219 FloatMatrix Ugamma;
220 //answer.resize() ??? otazka zda bude nutne ji preskejlovat, asi alo jo vzhledem k tomu jaky element vracim (ctverec, trojuhelnik)
221 answer.zero(); //radsi ano
222 //vytahnout t - zatizeni na hrane
223 this->computeUgammaMatrixAt(Ugamma, gp);
224 answer.beTProductOf(Ugamma, t);
225} //end of computePsVectorAt
226
227void
228HTSelement :: computePrescribedDisplacementLoadVectorAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
229{
230 //double dV;
231
232 // FloatArray PuEdge,Pu(numberOfDofs);
233 //FloatMatrix N;
234 //IntegrationRule* iRule;
235
236 FloatArray u;
237 FloatMatrix K;
238
239 this->computeVectorOf(mode, tStep, u);
240 if ( u.containsOnlyZeroes() ) {
241 answer.clear();
242 } else {
243 this->computeStiffnessMatrix(K, TangentStiffness, tStep);
244 answer.beProductOf(K, u);
245 answer.negated();
246 }
247
248#if 0
249 Pu.zero();
250 answer.resize(numberOfDofs);
251 for ( int i = 0; i < numberOfEdges; i++ ) {
252 this->computeOutwardNormalMatrix(N, i + 1);
253 iRule = this->giveIntegrationRule(i);
254 for ( GaussPoint *gp: *iRule ) {
255 dV = this->computeVolumeAroundSide(gp, i + 1);
256 this->computePuVectorAt(PuEdge, N, u, gp, i + 1);
257 PuEdge.times(dV);
258 answer.add(PuEdge);
259 }
260 }
261#endif
262}
263
264
265
266/*Public functions*/
267
268//element stifness matrix
269
270
271/*Protected functions*/
272
273
274void
275HTSelement :: computeOutwardNormalMatrix(FloatMatrix &answer, int sideNumber)
276{
277 double Ax = this->giveSideNode(sideNumber, 1)->giveCoordinate(1);
278 double Bx = this->giveSideNode(sideNumber, 2)->giveCoordinate(1);
279 double Ay = this->giveSideNode(sideNumber, 1)->giveCoordinate(2);
280 double By = this->giveSideNode(sideNumber, 2)->giveCoordinate(2);
281
282 answer.resize(2, 3);
283 answer.zero();
284 answer.at(1, 1) = answer.at(2, 3) = ( By - Ay );
285 answer.at(1, 3) = answer.at(2, 2) = -( Bx - Ax );
286 double norm = sqrt( answer.at(1, 1) * answer.at(1, 1) + answer.at(2, 2) * answer.at(2, 2) );
287 answer.times(1. / norm);
288}
289
290
291
292//generalized stress degrees of freedom: v
293void
294HTSelement :: computeFMatrixAt(FloatMatrix &answer, FloatMatrix N, GaussPoint *gp, int sideNumber) //\int{(NSv)^T Uv}
295{
296 FloatMatrix Uv, Sv, NSv;
297 //answer.resize() ??? otazka zda bude nutne ji preskejlovat, asi alo jo vzhledem k tomu jaky element vracim (ctverec, trojuhelnik)
298 answer.zero(); //radsi ano
299
300 this->computeUvMatrixAt(Uv, gp, sideNumber);
301 this->computeSvMatrixAt(Sv, gp, sideNumber);
302
303 NSv.beProductOf(N, Sv);
304 answer.beTProductOf(NSv, Uv);
305} //end of computeFMatrixAt
306
307
308//addtional displacements degrees of freedom: q (also called G matrix)
309void
310HTSelement :: computeAMatrixAt(FloatMatrix &answer, FloatMatrix N, GaussPoint *gp, int sideNumber) //\int{(NSv)^T Ug}
311{
312 //answer.resize() ??? otazka zda bude nutne ji preskejlovat, asi alo jo vzhledem k tomu jaky element vracim (ctverec, trojuhelnik)
313 answer.zero(); //radsi ano
314 FloatMatrix Sv, Ugamma, NSv;
315
316 this->computeUgammaMatrixAt(Ugamma, gp);
317 this->computeSvMatrixAt(Sv, gp, sideNumber);
318 NSv.beProductOf(N, Sv);
319 answer.beTProductOf(NSv, Ugamma);
320} //end of computeAMatrixAt
321
322
323void
324HTSelement :: computeUvMatrixAt(FloatMatrix &answer, GaussPoint *gp, int sideNumber)
325{
326 FloatArray uv;
328 uv.resize(2);
329
330
331 double t = ( gp->giveNaturalCoordinate(1) + 1. ) / 2.;
332
333 double Ax = ( this->giveSideNode(sideNumber, 1)->giveCoordinate(1) ) - cgX;
334 double Bx = this->giveSideNode(sideNumber, 2)->giveCoordinate(1) - cgX;
335
336 double x = ( Bx - Ax ) * t + Ax;
337
338 double Ay = this->giveSideNode(sideNumber, 1)->giveCoordinate(2) - cgY;
339 double By = this->giveSideNode(sideNumber, 2)->giveCoordinate(2) - cgY;
340 double y = ( By - Ay ) * t + Ay;
341
342 //v1 ... vi generalized stress variables the following matrices are associated with
343 this->uv1(uv, x, y);
344 Uv(0, 0) = uv(0);
345 Uv(0, 1) = uv(1);
346 //v2
347 this->uv3(uv, x, y);
348 Uv(1, 0) = uv(0);
349 Uv(1, 1) = uv(1);
350 //v3
351 this->uv4(uv, x, y);
352 Uv(2, 0) = uv(0);
353 Uv(2, 1) = uv(1);
354 //v4
355 this->uv5(uv, x, y);
356 Uv(3, 0) = uv(0);
357 Uv(3, 1) = uv(1);
358 //v5
359 this->uv6(uv, x, y);
360 Uv(4, 0) = uv(0);
361 Uv(4, 1) = uv(1);
362 //v6
363 this->uv7(uv, x, y);
364 Uv(5, 0) = uv(0);
365 Uv(5, 1) = uv(1);
366 //v7
367 this->uv8(uv, x, y);
368 Uv(6, 0) = uv(0);
369 Uv(6, 1) = uv(1);
370 //v8
371 this->uv9(uv, x, y);
372 Uv(7, 0) = uv(0);
373 Uv(7, 1) = uv(1);
374 //v9
375 this->uv10(uv, x, y);
376 Uv(8, 0) = uv(0);
377 Uv(8, 1) = uv(1);
378 //v10
379 this->uv11(uv, x, y);
380 Uv(9, 0) = uv(0);
381 Uv(9, 1) = uv(1);
382 //v11
383 this->uv12(uv, x, y);
384 Uv(10, 0) = uv(0);
385 Uv(10, 1) = uv(1);
386 //v12
387 this->uv25_4(uv, x, y);
388 Uv(11, 0) = uv(0);
389 Uv(11, 1) = uv(1);
390 //transpose Uv in order to conform with Texeira notation
391 answer.beTranspositionOf(Uv);
392} //end of computeUvMatrixAt
393
394void
395HTSelement :: computeSvMatrixAt(FloatMatrix &answer, GaussPoint *gp, int sideNumber)
396{
397 FloatArray sv;
398 FloatMatrix Sv;
399 sv.resize(3);
401
402
403 double t = ( gp->giveNaturalCoordinate(1) + 1. ) / 2.;
404
405 double Ax = this->giveSideNode(sideNumber, 1)->giveCoordinate(1);
406 double Bx = this->giveSideNode(sideNumber, 2)->giveCoordinate(1);
407
408 double x = ( Bx - Ax ) * t + Ax - cgX;
409
410 double Ay = this->giveSideNode(sideNumber, 1)->giveCoordinate(2);
411 double By = this->giveSideNode(sideNumber, 2)->giveCoordinate(2);
412 double y = ( By - Ay ) * t + Ay - cgY;
413
414
415
416
417 //v1
418 this->sv1(sv, x, y);
419 Sv(0, 0) = sv(0);
420 Sv(0, 1) = sv(1);
421 Sv(0, 2) = sv(2);
422 //v2
423 this->sv3(sv, x, y);
424 Sv(1, 0) = sv(0);
425 Sv(1, 1) = sv(1);
426 Sv(1, 2) = sv(2);
427 //v3
428 this->sv4(sv, x, y);
429 Sv(2, 0) = sv(0);
430 Sv(2, 1) = sv(1);
431 Sv(2, 2) = sv(2);
432 //v4
433 this->sv5(sv, x, y);
434 Sv(3, 0) = sv(0);
435 Sv(3, 1) = sv(1);
436 Sv(3, 2) = sv(2);
437 //v5
438 this->sv6(sv, x, y);
439 Sv(4, 0) = sv(0);
440 Sv(4, 1) = sv(1);
441 Sv(4, 2) = sv(2);
442 //v6
443 this->sv7(sv, x, y);
444 Sv(5, 0) = sv(0);
445 Sv(5, 1) = sv(1);
446 Sv(5, 2) = sv(2);
447 //v7
448 this->sv8(sv, x, y);
449 Sv(6, 0) = sv(0);
450 Sv(6, 1) = sv(1);
451 Sv(6, 2) = sv(2);
452 //v8
453 this->sv9(sv, x, y);
454 Sv(7, 0) = sv(0);
455 Sv(7, 1) = sv(1);
456 Sv(7, 2) = sv(2);
457 //v9
458 this->sv10(sv, x, y);
459 Sv(8, 0) = sv(0);
460 Sv(8, 1) = sv(1);
461 Sv(8, 2) = sv(2);
462 //v10
463 this->sv11(sv, x, y);
464 Sv(9, 0) = sv(0);
465 Sv(9, 1) = sv(1);
466 Sv(9, 2) = sv(2);
467 //v11
468 this->sv12(sv, x, y);
469 Sv(10, 0) = sv(0);
470 Sv(10, 1) = sv(1);
471 Sv(10, 2) = sv(2);
472 //v12
473 this->sv25_4(sv, x, y);
474 Sv(11, 0) = sv(0);
475 Sv(11, 1) = sv(1);
476 Sv(11, 2) = sv(2);
477
478 //transpose Sv in order to conform with Texeira notation
479 answer.beTranspositionOf(Sv);
480} //end of computeSvMatrixAt
481
482
483void
484HTSelement :: computeUgammaMatrixAt(FloatMatrix &answer, GaussPoint *gp)
485{
486 FloatMatrix Ugamma(4, 2);
487 Ugamma.zero();
488
489 //following constatnts should be sent from elsewhere
490 // int d = 2, p = 2; //@p - polynomial order (number of hierarchical functions)
491 //@d - task dimension d={2,3}
492
493 //single edge
494 //q_const
495 Ugamma(0, 0) = Ugamma(1, 1) = u_gammaConst(gp);
496 //q_linear
497 Ugamma(2, 0) = Ugamma(3, 1) = u_gammaLin(gp);
498 answer.beTranspositionOf(Ugamma);
499} //end of computeUgammaMatrixAt
500
501
502
503/*Private functions*/
504
505//Uv and Sv basis definition:
506//@lambda - lame elastic constant
507//@mu - lame elastic constant
508void
509HTSelement :: uv1(FloatArray &answer, double x, double y)
510{
511 answer(0) = x;
512 answer(1) = 0;
513} //end of uv1
514
515void
516HTSelement :: uv2(FloatArray &answer, double x, double y)
517{
518 answer(0) = y;
519 answer(1) = 0;
520} //end of uv2
521
522void
523HTSelement :: uv3(FloatArray &answer, double x, double y)
524{
525 answer(0) = 0;
526 answer(1) = x;
527} //end of uv3
528
529void
530HTSelement :: uv4(FloatArray &answer, double x, double y)
531{
532 answer(0) = 0;
533 answer(1) = y;
534} //end of uv4
535
536void
537HTSelement :: sv1(FloatArray &answer, double x, double y)
538{
539 answer(0) = 2 * mu + lambda;
540 answer(1) = lambda;
541 answer(2) = 0;
542} //end of sv1
543
544void
545HTSelement :: sv2(FloatArray &answer, double x, double y)
546{
547 answer(0) = 0;
548 answer(1) = 0;
549 answer(2) = mu;
550} //end of sv2
551
552void
553HTSelement :: sv3(FloatArray &answer, double x, double y)
554{
555 answer(0) = 0;
556 answer(1) = 0;
557 answer(2) = mu;
558} //end of sv3
559
560void
561HTSelement :: sv4(FloatArray &answer, double x, double y)
562{
563 answer(0) = lambda;
564 answer(1) = 2 * mu + lambda;
565 answer(2) = 0;
566} //end of sv4
567
568void
569HTSelement :: uv5(FloatArray &answer, double x, double y)
570{
571 answer(0) = x * y;
572 answer(1) = -0.5 * y * y * ( lambda + mu ) / ( 2 * mu + lambda );
573} //end of uv5
574
575void
576HTSelement :: uv6(FloatArray &answer, double x, double y)
577{
578 answer(0) = -( -2 * y * y * mu - y * y * lambda + x * x * mu ) / ( 2 * mu + lambda );
579 answer(1) = 0;
580} //end of uv6
581
582void
583HTSelement :: uv7(FloatArray &answer, double x, double y)
584{
585 answer(0) = 0;
586 answer(1) = ( 2 * x * x * mu + x * x * lambda - y * y * mu ) / ( 2 * mu + lambda );
587} //end of uv7
588
589void
590HTSelement :: uv8(FloatArray &answer, double x, double y)
591{
592 answer(0) = -0.5 * x * x * ( lambda + mu ) / ( 2 * mu + lambda );
593 answer(1) = x * y;
594} //end of uv8
595
596void
597HTSelement :: sv5(FloatArray &answer, double x, double y)
598{
599 answer(0) = mu * y * ( 4 * mu + 3 * lambda ) / ( 2 * mu + lambda );
600 answer(1) = -mu * y;
601 answer(2) = mu * x;
602} //end of sv5
603
604void
605HTSelement :: sv6(FloatArray &answer, double x, double y)
606{
607 answer(0) = -2 * mu * x;
608 answer(1) = -2 * lambda * mu * x / ( 2 * mu + lambda );
609 answer(2) = 2 * mu * y;
610} //end of sv6
611
612void
613HTSelement :: sv7(FloatArray &answer, double x, double y)
614{
615 answer(0) = -2 * lambda * y * mu / ( 2 * mu + lambda );
616 answer(1) = -2 * mu * y;
617 answer(2) = 2 * mu * x;
618} //end of sv7
619
620void
621HTSelement :: sv8(FloatArray &answer, double x, double y)
622{
623 answer(0) = -mu * x;
624 answer(1) = mu * x * ( 4 * mu + 3 * lambda ) / ( 2 * mu + lambda );
625 answer(2) = mu * y;
626} //end of sv8
627
628void
629HTSelement :: uv9(FloatArray &answer, double x, double y)
630{
631 answer(0) = -( 1 / 3.0 ) * x * x * x * mu / ( 2 * mu + lambda ) + x * y * y;
632 answer(1) = -( 1 / 3.0 ) * y * y * y * ( lambda + mu ) / ( 2 * mu + lambda );
633} //end of uv9
634
635void
636HTSelement :: uv10(FloatArray &answer, double x, double y)
637{
638 answer(0) = -3 * x * x * y * ( 2 * mu + lambda ) / ( 2 * lambda + 3 * mu ) + y * y * y;
639 answer(1) = 3 * x * y * y * ( lambda + mu ) / ( 2 * lambda + 3 * mu );
640} //end of uv10
641
642void
643HTSelement :: uv11(FloatArray &answer, double x, double y)
644{
645 answer(0) = -3 * x * x * y * ( -mu - lambda ) / ( 2 * lambda + 3 * mu );
646 answer(1) = x * x * x + 3 * x * y * y * ( -lambda - 2 * mu ) / ( 2 * lambda + 3 * mu );
647} //end of uv11
648
649void
650HTSelement :: uv12(FloatArray &answer, double x, double y)
651{
652 answer(0) = -( 1 / 3.0 ) * x * x * x * ( lambda + mu ) / ( 2 * mu + lambda );
653 answer(1) = x * x * y - ( 1 / 3.0 ) * y * y * y * mu / ( 2 * mu + lambda );
654} //end of uv12
655
656void
657HTSelement :: sv9(FloatArray &answer, double x, double y)
658{
659 answer(0) = -mu * ( -4 * mu * y * y - 3 * lambda * y * y + 2 * x * x * mu + lambda * x * x ) / ( 2 * mu + lambda );
660 answer(1) = -mu * ( lambda * y * y + 2 * mu * y * y + lambda * x * x ) / ( 2 * mu + lambda );
661 answer(2) = 2 * mu * x * y;
662} //end of sv9
663
664void
665HTSelement :: sv10(FloatArray &answer, double x, double y)
666{
667 answer(0) = -6 * x * y * mu * ( 4 * mu + 3 * lambda ) / ( 2 * lambda + 3 * mu );
668 answer(1) = 6 * mu * x * y * ( 2 * mu + lambda ) / ( 2 * lambda + 3 * mu );
669 answer(2) = -3 * mu * ( 2 * x * x * mu + x * x * lambda - 3 * lambda * y * y - 4 * mu * y * y ) / ( 2 * lambda + 3 * mu );
670} //end of sv10
671
672void
673HTSelement :: sv11(FloatArray &answer, double x, double y)
674{
675 answer(0) = 6 * mu * x * y * ( 2 * mu + lambda ) / ( 2 * lambda + 3 * mu );
676 answer(1) = -6 * x * y * mu * ( 4 * mu + 3 * lambda ) / ( 2 * lambda + 3 * mu );
677 answer(2) = 3 * mu * ( -2 * mu * y * y - lambda * y * y + 3 * x * x * lambda + 4 * x * x * mu ) / ( 2 * lambda + 3 * mu );
678} //end of sv11
679
680void
681HTSelement :: sv12(FloatArray &answer, double x, double y)
682{
683 answer(0) = -mu * ( x * x * lambda + 2 * x * x * mu + lambda * y * y ) / ( 2 * mu + lambda );
684 answer(1) = mu * ( 4 * x * x * mu + 3 * x * x * lambda - 2 * mu * y * y - lambda * y * y ) / ( 2 * mu + lambda );
685 answer(2) = 2 * mu * x * y;
686} //end of sv12
687
688#if 0
689void
690HTSelement :: sv13(FloatArray &answer, double x, double y)
691{
692 answer(0) = ( 6 * x * x * y * y * mu + x * x * x * x * lambda - 2 * y * y * y * y * mu - y * y * y * y * lambda ) / lambda;
693 answer(1) = -4 * x * x * x * y * ( lambda + mu ) / lambda;
694} //end of sv13
695
696void
697HTSelement :: uv13(FloatArray &answer, double x, double y)
698{
699 answer(0) = x * y * ( y * y * mu + x * x * lambda ) / lambda;
700 answer(1) = 0.5 * x * x * ( lambda + mu ) * ( x * x - 3 * y * y ) / lambda;
701} //end of uv13
702
703void
704HTSelement :: uv15(FloatArray &answer, double x, double y)
705{
706 answer(0) = -0.5 * y * y * ( lambda + mu ) * ( 3 * x * x - y * y ) / lambda;
707 answer(1) = x * y * ( x * x * mu + y * y * lambda ) / lambda;
708} //end of uv15
709
710void
711HTSelement :: uv16(FloatArray &answer, double x, double y)
712{
713 answer(0) = -4 * x * y * y * y * ( lambda + mu ) / lambda;
714 answer(1) = -( -6 * x * x * y * y * mu - y * y * y * y * lambda + x * x * x * x * lambda + 2 * x * x * x * x * mu ) / lambda;
715} //end of uv16
716
717void
718HTSelement :: sv13(FloatArray &answer, double x, double y)
719{
720 answer(0) = 4 * mu * x * ( 6 * y * y * mu + x * x * lambda + 3 * y * y * lambda ) / lambda;
721 answer(1) = -4 * mu * x * ( 3 * x * x * lambda + 2 * x * x * mu - 3 * lambda * y * y ) / lambda;
722 answer(2) = -4 * mu * y * ( 2 * y * y * mu + y * y * lambda + 3 * x * x * lambda ) / lambda;
723} //end of sv13
724
725void
726HTSelement :: sv14(FloatArray &answer, double x, double y)
727{
728 answer(0) = mu * y * ( 2 * y * y * mu + 3 * x * x * lambda + lambda * y * y ) / lambda;
729 answer(1) = -mu * y * ( 9 * x * x * lambda + 6 * x * x * mu - lambda * y * y ) / lambda;
730 answer(2) = mu * x * ( 3 * x * x * lambda - 3 * y * y * lambda + 2 * x * x * mu ) / lambda;
731} //end of sv14
732
733void
734HTSelement :: sv15(FloatArray &answer, double x, double y)
735{
736 answer(0) = mu * x * ( -9 * y * y * lambda - 6 * y * y * mu + lambda * x * x ) / lambda;
737 answer(1) = mu * x * ( 3 * y * y * lambda + 2 * x * x * mu + lambda * x * x ) / lambda;
738 answer(2) = -mu * y * ( -3 * y * y * lambda - 2 * y * y * mu + 3 * x * x * lambda ) / lambda;
739} //end of sv15
740
741void
742HTSelement :: sv16(FloatArray &answer, double x, double y)
743{
744 answer(0) = 4 * y * mu * ( -3 * y * y * lambda - 2 * y * y * mu + 3 * lambda * x * x ) / lambda;
745 answer(1) = 4 * mu * y * ( y * y * lambda + 6 * x * x * mu + 3 * lambda * x * x ) / lambda;
746 answer(2) = -4 * mu * x * ( x * x * lambda + 2 * x * x * mu + 3 * y * y * lambda ) / lambda;
747} //end of sv16
748
749void
750HTSelement :: uv17(FloatArray &answer, double x, double y)
751{
752 answer(0) = x * ( 2 * x * x * x * x * lambda + x * x * x * x * mu - 5 * y * y * y * y * mu - 10 * x * x * y * y * lambda ) / ( 2 * lambda + mu );
753 answer(1) = -10 * x * x * y * ( lambda + mu ) * ( x * x - y * y ) / ( 2 * lambda + mu );
754} //end of uv17
755
756void
757HTSelement :: uv18(FloatArray &answer, double x, double y)
758{
759 answer(0) = ( 1 / 5.0 ) * y * ( 10 * x * x * y * y * mu - y * y * y * y * lambda - 2 * y * y * y * y * mu + 5 * x * x * x * x * lambda ) / lambda;
760 answer(1) = ( 2 / 5.0 ) * x * x * x * ( lambda + mu ) * ( -5 * y * y + x * x ) / lambda;
761} //end of uv18
762
763void
764HTSelement :: uv19(FloatArray &answer, double x, double y)
765{
766 answer(0) = -( 2 / 5.0 ) * y * y * y * ( lambda + mu ) * ( 5 * x * x - y * y ) / lambda;
767 answer(1) = -( 1 / 5.0 ) * x * ( x * x * x * x * lambda + 2 * x * x * x * x * mu - 5 * y * y * y * y * lambda - 10 * x * x * y * y * mu ) / lambda;
768} //end of uv19
769
770void
771HTSelement :: uv20(FloatArray &answer, double x, double y)
772{
773 answer(0) = 10 * x * y * y * ( lambda + mu ) * ( -y * y + x * x ) / ( 2 * lambda + mu );
774 answer(1) = -y * ( 5 * x * x * x * x * mu - 2 * y * y * y * y * lambda - y * y * y * y * mu + 10 * x * x * y * y * lambda ) / ( 2 * lambda + mu );
775} //end of uv20
776
777void
778HTSelement :: sv17(FloatArray &answer, double x, double y)
779{
780 answer(0) = 5 * mu * ( -6 * x * x * y * y * lambda + 3 * x * x * x * x * lambda + 2 * x * x * x * x * mu - 2 * y * y * y * y * mu - lambda * y * y * y * y ) / ( 2 * lambda + mu );
781 answer(1) = -5 * mu * ( 5 * x * x * x * x * lambda - 18 * x * x * y * y * lambda + 4 * x * x * x * x * mu - 12 * x * x * y * y * mu + lambda * y * y * y * y ) / ( 2 * lambda + mu );
782 answer(2) = -20 * mu * x * y * ( 3 * x * x * lambda + 2 * x * x * mu - y * y * lambda ) / ( 2 * lambda + mu );
783} //end of sv17
784
785void
786HTSelement :: sv18(FloatArray &answer, double x, double y)
787{
788 answer(0) = 4 * mu * x * y * ( 2 * y * y * mu + x * x * lambda + lambda * y * y ) / lambda;
789 answer(1) = -4 * mu * x * y * ( 3 * x * x * lambda + 2 * x * x * mu - lambda * y * y ) / lambda;
790 answer(2) = mu * ( 3 * x * x * x * x * lambda + 2 * x * x * x * x * mu - y * y * y * y * lambda - 2 * y * y * y * y * mu - 6 * x * x * y * y * lambda ) / lambda;
791} //end of sv18
792
793void
794HTSelement :: sv19(FloatArray &answer, double x, double y)
795{
796 answer(0) = 4 * mu * x * y * ( -3 * y * y * lambda - 2 * y * y * mu + lambda * x * x ) / lambda;
797 answer(1) = 4 * mu * x * y * ( 2 * x * x * mu + y * y * lambda + lambda * x * x ) / lambda;
798 answer(2) = -mu * ( 6 * x * x * y * y * lambda + x * x * x * x * lambda + 2 * x * x * x * x * mu - 3 * y * y * y * y * lambda - 2 * y * y * y * y * mu ) / lambda;
799} //end of sv19
800
801void
802HTSelement :: sv20(FloatArray &answer, double x, double y)
803{
804 answer(0) = -5 * mu * ( -18 * x * x * y * y * lambda + 5 * y * y * y * y * lambda - 12 * x * x * y * y * mu + 4 * y * y * y * y * mu + lambda * x * x * x * x ) / ( 2 * lambda + mu );
805 answer(1) = -5 * mu * ( 6 * x * x * y * y * lambda - 3 * y * y * y * y * lambda - 2 * y * y * y * y * mu + 2 * x * x * x * x * mu + lambda * x * x * x * x ) / ( 2 * lambda + mu );
806 answer(2) = 20 * mu * x * y * ( -3 * y * y * lambda + x * x * lambda - 2 * y * y * mu ) / ( 2 * lambda + mu );
807} //end of sv20
808
809void
810HTSelement :: uv21(FloatArray &answer, double x, double y)
811{
812 answer(0) = ( -15 * x * x * y * y * y * y * mu - 15 * x * x * x * x * y * y * lambda + 2 * x * x * x * x * x * x * lambda + x * x * x * x * x * x * mu + y * y * y * y * y * y * lambda + \
813 2 * y * y * y * y * y * y * mu ) / ( 2 * lambda + mu );
814 answer(1) = -4 * x * x * x * y * ( lambda + mu ) * ( -5 * y * y + 3 * x * x ) / ( 2 * lambda + mu );
815} //end of uv21
816
817void
818HTSelement :: uv22(FloatArray &answer, double x, double y)
819{
820 answer(0) = ( 1 / 3.0 ) * x * y * ( -10 * x * x * y * y * lambda - 3 * y * y * y * y * mu + 6 * x * x * x * x * lambda + 3 * x * x * x * x * mu ) / ( 2 * lambda + mu );
821 answer(1) = 0.5 * x * x * ( lambda + mu ) * ( 5 * y * y * y * y + x * x * x * x - 10 * x * x * y * y ) / ( 2 * lambda + mu );
822} //end of uv22
823
824void
825HTSelement :: uv23(FloatArray &answer, double x, double y)
826{
827 answer(0) = 0.5 * y * y * ( lambda + mu ) * ( y * y * y * y + 5 * x * x * x * x - 10 * x * x * y * y ) / ( 2 * lambda + mu );
828 answer(1) = -( 1 / 3.0 ) * x * y * ( -6 * y * y * y * y * lambda - 3 * y * y * y * y * mu + 3 * x * x * x * x * mu + 10 * x * x * y * y * lambda ) / ( 2 * lambda + mu );
829} //end of uv23
830
831void
832HTSelement :: uv24(FloatArray &answer, double x, double y)
833{
834 answer(0) = 4 * x * y * y * y * ( lambda + mu ) * ( 5 * x * x - 3 * y * y ) / ( 2 * lambda + mu );
835 answer(1) = ( 2 * y * y * y * y * y * y * lambda + y * y * y * y * y * y * mu + x * x * x * x * x * x * lambda + 2 * x * x * x * x * x * x * mu - 15 * x * x * x * x * y * y * mu - \
836 15 * x * x * y * y * y * y * lambda ) / ( 2 * lambda + mu );
837} //end of uv24
838
839void
840HTSelement :: sv21(FloatArray &answer, double x, double y)
841{
842 answer(0) = 6 * mu * x * ( 3 * x * x * x * x * lambda + 2 * x * x * x * x * mu - 10 * y * y * y * y * mu - 10 * x * x * y * y * lambda - 5 * lambda * y * y * y * y ) / ( 2 * lambda + mu );
843 answer(1) = -6 * mu * x * ( -30 * x * x * y * y * lambda + 5 * x * x * x * x * lambda - 20 * x * x * y * y * mu + 4 * x * x * x * x * mu + 5 * lambda * y * y * y * y ) / ( 2 * lambda + mu );
844 answer(2) = -6 * mu * y * ( -y * y * y * y * lambda - 2 * y * y * y * y * mu + 15 * x * x * x * x * lambda - 10 * x * x * y * y * lambda + 10 * x * x * x * x * mu ) / ( 2 * lambda + mu );
845} //end of sv21
846
847void
848HTSelement :: sv22(FloatArray &answer, double x, double y)
849{
850 answer(0) = mu * y * ( -10 * x * x * y * y * lambda - 2 * y * y * y * y * mu + 15 * x * x * x * x * lambda + 10 * x * x * x * x * mu - lambda * y * y * y * y ) / ( 2 * lambda + mu );
851 answer(1) = -mu * y * ( -30 * x * x * y * y * lambda + 25 * x * x * x * x * lambda - 20 * x * x * y * y * mu + 20 * x * x * x * x * mu + lambda * y * y * y * y ) / ( 2 * lambda + mu );
852 answer(2) = mu * x * ( -30 * x * x * y * y * lambda + 5 * x * x * x * x * lambda + 4 * x * x * x * x * mu + 5 * y * y * y * y * lambda - 20 * x * x * y * y * mu ) / ( 2 * lambda + mu );
853} //end of sv22
854
855void
856HTSelement :: sv23(FloatArray &answer, double x, double y)
857{
858 answer(0) = -mu * x * ( 25 * y * y * y * y * lambda - 30 * x * x * y * y * lambda + 20 * y * y * y * y * mu - 20 * x * x * y * y * mu + lambda * x * x * x * x ) / ( 2 * lambda + mu );
859 answer(1) = -mu * x * ( 2 * x * x * x * x * mu - 15 * y * y * y * y * lambda - 10 * y * y * y * y * mu + 10 * x * x * y * y * lambda + lambda * x * x * x * x ) / ( 2 * lambda + mu );
860 answer(2) = mu * y * ( 5 * x * x * x * x * lambda + 5 * y * y * y * y * lambda + 4 * y * y * y * y * mu - 30 * x * x * y * y * lambda - 20 * x * x * y * y * mu ) / ( 2 * lambda + mu );
861} //end of sv23
862
863void
864HTSelement :: sv24(FloatArray &answer, double x, double y)
865{
866 answer(0) = -6 * mu * y * ( -30 * x * x * y * y * lambda + 5 * y * y * y * y * lambda - 20 * x * x * y * y * mu + 4 * y * y * y * y * mu + 5 * lambda * x * x * x * x ) / ( 2 * lambda + mu );
867 answer(1) = -6 * mu * y * ( 10 * x * x * x * x * mu - 3 * y * y * y * y * lambda - 2 * y * y * y * y * mu + 10 * x * x * y * y * lambda + 5 * lambda * x * x * x * x ) / ( 2 * lambda + mu );
868 answer(2) = 6 * mu * x * ( -15 * y * y * y * y * lambda - 10 * y * y * y * y * mu + x * x * x * x * lambda + 2 * x * x * x * x * mu + 10 * x * x * y * y * lambda ) / ( 2 * lambda + mu );
869} //end of sv24
870#endif
871
872void
873HTSelement :: uv25_4(FloatArray &answer, double x, double y)
874{
875 answer(0) = -5 * x * x * x * x + 30 * x * x * y * y - 5 * y * y * y * y;
876 answer(1) = 20 * x * x * x * y - 20 * x * y * y * y;
877} //end of uv25_4
878
879void
880HTSelement :: sv25_4(FloatArray &answer, double x, double y)
881{
882 answer(0) = 2 * mu * ( -20 * x * x * x + 60 * x * y * y );
883 answer(1) = 2 * mu * ( 20 * x * x * x - 60 * x * y * y );
884 answer(2) = mu * ( 120 * x * x * y - 40 * y * y * y );
885} //end of sv25_4
886
887
888//u_gamma functions
889double
890HTSelement :: u_gammaConst(GaussPoint *gp)
891{
892 return 1;
893} //end of u_gammaConst
894
895double
896HTSelement :: u_gammaLin(GaussPoint *gp)
897{
898 // double ksi = 1; must be calculated
899 return gp->giveNaturalCoordinate(1);
900} //end of u_gammaLin
901} // end namespace oofem
#define N(a, b)
#define REGISTER_Element(class)
double giveCoordinate(int i) const
Definition dofmanager.h:383
Node * giveNode(int i) const
Definition element.h:629
int numberOfDofMans
Number of dofmanagers.
Definition element.h:136
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Definition element.C:103
virtual IntegrationRule * giveIntegrationRule(int i)
Definition element.h:899
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
Definition element.h:157
int numberOfGaussPoints
Definition element.h:175
bool containsOnlyZeroes() const
Definition floatarray.C:671
void resize(Index s)
Definition floatarray.C:94
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
void add(const FloatArray &src)
Definition floatarray.C:218
void times(double f)
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beTranspositionOf(const FloatMatrix &src)
void zero()
Zeroes all coefficient of receiver.
bool beInverseOf(const FloatMatrix &src)
double at(std::size_t i, std::size_t j) const
void beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
double giveNaturalCoordinate(int i) const
Returns i-th natural element coordinate of receiver.
Definition gausspoint.h:136
double giveWeight()
Returns integration weight of receiver.
Definition gausspoint.h:180
void computePuVectorAt(FloatArray &answer, FloatMatrix N, FloatArray u, GaussPoint *gp, int sideNumber)
Definition htselement.C:204
void sv1(FloatArray &answer, double x, double y)
Definition htselement.C:537
double u_gammaConst(GaussPoint *gp)
Definition htselement.C:890
void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) override
Definition htselement.C:163
void uv11(FloatArray &answer, double x, double y)
Definition htselement.C:643
double computeVolumeAroundSide(GaussPoint *gp, int elemSideNumber)
Definition htselement.C:141
void sv7(FloatArray &answer, double x, double y)
Definition htselement.C:613
void uv9(FloatArray &answer, double x, double y)
Definition htselement.C:629
void computeAMatrixAt(FloatMatrix &answer, FloatMatrix N, GaussPoint *gp, int sideNumber)
Definition htselement.C:310
void uv1(FloatArray &answer, double x, double y)
Definition htselement.C:509
void computeSvMatrixAt(FloatMatrix &answer, GaussPoint *gp, int sideNumber)
Definition htselement.C:395
void sv3(FloatArray &answer, double x, double y)
Definition htselement.C:553
void computeFMatrixAt(FloatMatrix &answer, FloatMatrix N, GaussPoint *gp, int sideNumber)
Definition htselement.C:294
void sv10(FloatArray &answer, double x, double y)
Definition htselement.C:665
void uv12(FloatArray &answer, double x, double y)
Definition htselement.C:650
void uv8(FloatArray &answer, double x, double y)
Definition htselement.C:590
void sv8(FloatArray &answer, double x, double y)
Definition htselement.C:621
void uv6(FloatArray &answer, double x, double y)
Definition htselement.C:576
void sv4(FloatArray &answer, double x, double y)
Definition htselement.C:561
void uv4(FloatArray &answer, double x, double y)
Definition htselement.C:530
void computeUgammaMatrixAt(FloatMatrix &answer, GaussPoint *gp)
Definition htselement.C:484
void postInitialize() override
Performs post initialization steps.
Definition htselement.C:75
double u_gammaLin(GaussPoint *gp)
Definition htselement.C:896
void computeCenterOfGravity()
Definition htselement.C:97
void sv25_4(FloatArray &answer, double x, double y)
Definition htselement.C:880
void uv3(FloatArray &answer, double x, double y)
Definition htselement.C:523
double giveSideLength(int sideNumber)
Definition htselement.C:149
void sv11(FloatArray &answer, double x, double y)
Definition htselement.C:673
void uv25_4(FloatArray &answer, double x, double y)
Definition htselement.C:873
void computeUvMatrixAt(FloatMatrix &answer, GaussPoint *gp, int sideNubmer)
Definition htselement.C:324
void computeOutwardNormalMatrix(FloatMatrix &answer, int sideNumber)
Definition htselement.C:275
Node * giveSideNode(int elementSideNumber, int nodeNumber)
Definition htselement.C:122
void uv10(FloatArray &answer, double x, double y)
Definition htselement.C:636
void sv9(FloatArray &answer, double x, double y)
Definition htselement.C:657
void uv7(FloatArray &answer, double x, double y)
Definition htselement.C:583
void uv5(FloatArray &answer, double x, double y)
Definition htselement.C:569
void sv6(FloatArray &answer, double x, double y)
Definition htselement.C:605
void sv12(FloatArray &answer, double x, double y)
Definition htselement.C:681
void sv5(FloatArray &answer, double x, double y)
Definition htselement.C:597
StructuralElement(int n, Domain *d)
double norm(const FloatArray &x)

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