OOFEM 3.0
Loading...
Searching...
No Matches
prescribeddispslipbcneumannrc.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
36#include "classfactory.h"
37#include "node.h"
38#include "masterdof.h"
39#include "element.h"
40#include "feinterpol.h"
41#include "feinterpol2d.h"
42#include "gausspoint.h"
43#include "sparsemtrx.h"
44#include "timestep.h"
45#include "function.h"
46#include "sparselinsystemnm.h"
48#include "engngm.h"
49#include "mathfem.h"
50#include "crosssection.h"
52
53
54namespace oofem {
56
57PrescribedDispSlipBCNeumannRC :: PrescribedDispSlipBCNeumannRC(int n, Domain *d) :
60 mpSigmaHom( new Node(0, d) ),
61 lmTauHom( new Node(0, d) ),
62 lmSigmaSHom( new Node(0, d) )
63{
64 int nsd = d->giveNumberOfSpatialDimensions();
65 for ( int i = 0; i < nsd * nsd; i++ ) {
66 // Just putting in X_i id-items since they don't matter.
67 int dofId = d->giveNextFreeDofID();
68 mSigmaIds.followedBy(dofId);
69 mpSigmaHom->appendDof( new MasterDof( mpSigmaHom.get(), ( DofIDItem ) ( dofId ) ) );
70 }
71
72 for ( int i = 0; i < nsd; i++ ) {
73 // Just putting in X_i id-items since they don't matter.
74 int dofId = d->giveNextFreeDofID();
75 lmTauIds.followedBy(dofId);
76 lmTauHom->appendDof( new MasterDof( lmTauHom.get(), ( DofIDItem ) ( dofId ) ) );
77 }
78
79 for ( int i = 0; i < nsd ; i++ ) {
80 // Just putting in X_i id-items since they don't matter.
81 int dofId = d->giveNextFreeDofID();
82 lmSigmaSIds.followedBy(dofId);
83 lmSigmaSHom->appendDof( new MasterDof( lmSigmaSHom.get(), ( DofIDItem ) ( dofId ) ) );
84 }
85}
86
87PrescribedDispSlipBCNeumannRC :: ~PrescribedDispSlipBCNeumannRC()
88{
89}
90
91
92void PrescribedDispSlipBCNeumannRC :: initializeFrom(InputRecord &ir)
93{
94 ActiveBoundaryCondition :: initializeFrom(ir);
95 PrescribedDispSlipHomogenization :: initializeFrom(ir);
96
97 if ( this->dispGradient.isNotEmpty() ) {
98 this->dispGradON = true;
99 }
100
101 if ( this->slipField.isNotEmpty() ) {
102 this->slipON = true;
103 }
104
105 if ( this->slipGradient.isNotEmpty() ) {
106 this->slipGradON = true;
107 }
108
109 if ( slipON || slipGradON) { //either slip or slip gradient (or both) will be prescribed weakly
112 }
113}
114
115
116void PrescribedDispSlipBCNeumannRC :: giveInputRecord(DynamicInputRecord &input)
117{
118 ActiveBoundaryCondition :: giveInputRecord(input);
119 PrescribedDispSlipHomogenization :: giveInputRecord(input);
120
121 if ( slipON || slipGradON ) {
124 }
125}
126
127
129{
130 int lmTot = (int)dispGradON + (int)slipON + (int)slipGradON;
131 return lmTot;
132}
133
134DofManager *PrescribedDispSlipBCNeumannRC :: giveInternalDofManager(int i)
135{
136 if ( this->giveNumberOfInternalDofManagers() == 3 ) {
137 if ( i == 1 ) { return mpSigmaHom.get(); }
138 else if ( i == 2 ) { return lmTauHom.get(); }
139 else if ( i == 3) { return lmSigmaSHom.get(); }
140 } else if ( this->giveNumberOfInternalDofManagers() == 2) {
141 if ( dispGradON && slipON ) {
142 if ( i == 1 ) { return mpSigmaHom.get(); }
143 else if ( i == 2 ) { return lmTauHom.get(); }
144 } else if ( dispGradON && slipGradON ) {
145 if ( i == 1 ) { return mpSigmaHom.get(); }
146 else if ( i ==2 ) { return lmSigmaSHom.get(); }
147 } else if ( slipON && slipGradON ) {
148 if ( i == 1 ) { return lmTauHom.get(); }
149 else if ( i == 2 ) { return lmSigmaSHom.get(); }
150 }
151 } else if ( this->giveNumberOfInternalDofManagers() == 1 ) {
152 if ( dispGradON ) { return mpSigmaHom.get(); }
153 else if ( slipON ) { return lmTauHom.get(); }
154 else if ( slipGradON ) {return lmSigmaSHom.get(); }
155 }
156
157 return nullptr;
158}
159
160void PrescribedDispSlipBCNeumannRC :: scale(double s)
161{
162 this->dispGradient.times(s);
163 this->slipField.times(s);
164 this->slipGradient.times(s);
165}
166
167
168void PrescribedDispSlipBCNeumannRC :: assembleVector(FloatArray &answer, TimeStep *tStep,
169 CharType type, ValueModeType mode,
170 const UnknownNumberingScheme &s,
171 FloatArray *eNorm,
172 void* lock)
173{
174 if ( dispGradON ) {
175 this->assembleVectorStress( answer, tStep, type, mode, s, eNorm );
176 }
177
178 if ( slipON ) {
179 this->assembleVectorBStress(answer, tStep, type, mode, s);
180 }
181
182 if ( slipGradON ) {
183 this->assembleVectorRStress( answer, tStep, type, mode, s);
184 }
185}
186
187
189{
190 IntArray sigma_loc; // For the displacements and stress respectively
191 mpSigmaHom->giveLocationArray(mSigmaIds, sigma_loc, s);
192
193 if ( type == ExternalForcesVector ) {
194 // The external forces have two contributions. On the additional equations for sigma, the load is simply the prescribed gradient.
196 FloatArray stressLoad;
197 FloatArray dispGrad;
198 giveDispGradient(dispGrad);
199
200 double loadLevel = this->giveTimeFunction()->evaluateAtTime(tStep->giveTargetTime());
201 stressLoad.beScaled(-rve_size*loadLevel, dispGrad);
202
203 answer.assemble(stressLoad, sigma_loc);
204 } else if ( type == InternalForcesVector ) {
205 FloatMatrix Ke;
206 FloatArray fe_v, fe_s;
207 FloatArray sigmaHom, e_u;
208 IntArray loc, masterDofIDs, sigmaMasterDofIDs;
209
210 // Fetch the current values of the stress;
211 mpSigmaHom->giveUnknownVector(sigmaHom, mSigmaIds, mode, tStep);
212 // and the master dof ids for sigmadev used for the internal norms
213 mpSigmaHom->giveMasterDofIDArray(mSigmaIds, sigmaMasterDofIDs);
214
215 // Assemble
216 Set *setPointer = this->giveDomain()->giveSet(this->set);
217 const IntArray &boundaries = setPointer->giveBoundaryList();
218 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
219 Element *e = this->giveDomain()->giveElement( boundaries.at(pos * 2 - 1) );
220 int boundary = boundaries.at(pos * 2);
221
222 // Fetch the element information;
223 e->giveLocationArray(loc, s, & masterDofIDs);
224 e->computeVectorOf(mode, tStep, e_u);
225 this->integrateTangentStress(Ke, e, boundary);
226
227 // We just use the tangent, less duplicated code (the addition of sigmaDev is linear).
228 fe_v.beProductOf(Ke, e_u);
229 fe_s.beTProductOf(Ke, sigmaHom);
230
231 // Note: The terms appear negative in the equations:
232 fe_v.negated();
233 fe_s.negated();
234
235 answer.assemble(fe_s, loc); // Contributions to delta_v equations
236 answer.assemble(fe_v, sigma_loc); // Contribution to delta_s_i equations
237 if ( eNorm != NULL ) {
238 eNorm->assembleSquared(fe_s, masterDofIDs);
239 eNorm->assembleSquared(fe_v, sigmaMasterDofIDs);
240 }
241 }
242 }
243}
244
245
247{
248 IntArray tau_loc;
249 lmTauHom->giveLocationArray(lmTauIds, tau_loc, s);
250
251 if ( type == ExternalForcesVector ) {
252 // The external forces have two contributions. On the additional equations for tau, the load is equal to the prescribed slip value.
253 FloatArray bStressLoad;
254 FloatArray slipVec;
255 this->giveSlipField(slipVec);
256
257 double loadLevel = this->giveTimeFunction()->evaluateAtTime(tStep->giveTargetTime());
258 bStressLoad.beScaled(loadLevel, slipVec);
259
260 answer.assemble(bStressLoad, tau_loc);
261 } else if ( type == InternalForcesVector ) {
262 FloatMatrix Ktau, Ktau_el;
263 FloatArray fe_tau, fe_u;
264 FloatArray tau, u_s, u_c;
265 IntArray loc, loc_s, loc_c, masterDofIDs;
266
267 // Fetch the current values of the Lagrange multiplier;
268 lmTauHom->giveUnknownVector(tau, lmTauIds, mode, tStep);
269
270 // CONTRIBUTION FROM REINFORCEMENT
271 FloatMatrix C;
272 double gammaBoxInt = computeInterfaceLength(rebarSets);
274 Ktau.clear();
275 Ktau_el.clear();
276 fe_tau.clear();
277 fe_u.clear();
278
279 for (int i = 0; i < rebarSets.giveSize(); ++i) {
280 Set *steelSet = this->giveDomain()->giveSet(rebarSets.at(i+1));
281
282 for (int pos = 1; pos <= steelSet->giveElementList().giveSize(); ++pos) {
283 Element *es = this->giveDomain()->giveElement( steelSet->giveElementList().at(pos) );
284
285 // Fetch the element information;
286 es->giveLocationArray(loc_s, s, &masterDofIDs);
287
288 // Fetch the nodal displacements
289 // since computeVectorOf gives the unknown vector in local coordinate system, it needs to be rotated to global coordinates
290 FloatMatrix G2L;
292 es->computeVectorOf(mode, tStep, u_s);
293 u_s.rotatedWith(G2L, 't');
294
295 //Compute the stiffness matrix expansion
296 this->integrateTangentBStressSteel(Ktau_el, es, rebarSets.at(i+1));
297 Ktau.beTProductOf(C, Ktau_el);
298 Ktau.times(1/gammaBoxInt);
299
300 //Compute the contribution to internal force vector
301 fe_u.beTProductOf(Ktau, tau);
302 fe_tau.beProductOf(Ktau, u_s);
303
304 //Assemble
305 answer.assemble(fe_u, loc_s);
306 answer.assemble(fe_tau, tau_loc);
307 }
308 }
309 Ktau.clear();
310 fe_tau.clear();
311 fe_u.clear();
312
313 // CONTRIBUTION FROM CONCRETE
314 Set *concreteSet = this->giveDomain()->giveSet(concreteVolSet);
316
317 for ( int pos = 1; pos <= concreteSet->giveElementList().giveSize(); ++pos) {
318 Element* ec = this->giveDomain()->giveElement( concreteSet->giveElementList().at(pos) );
319
320 // Fetch the element information;
321 ec->giveLocationArray(loc_c, s, &masterDofIDs);
322
323 // Fetch the nodal displacements
324 ec->computeVectorOf(mode, tStep, u_c);
325
326 //Compute the stiffness matrix expansion
327 this->integrateTangentBStressConcrete(Ktau, ec);
328 Ktau.times(1/omegaBox);
329
330 //Compute the contribution to internal force vector
331 fe_u.beTProductOf(Ktau, tau);
332 fe_tau.beProductOf(Ktau, u_c);
333
334 // Note: The terms appear negative in the equations:
335 fe_u.negated();
336 fe_tau.negated();
337
338 //Assemble
339 answer.assemble(fe_u, loc_c);
340 answer.assemble(fe_tau, tau_loc);
341 }
342 }
343}
344
345
347{
348 IntArray sigmaS_loc;
349 lmSigmaSHom->giveLocationArray(lmSigmaSIds, sigmaS_loc, s);
350
351 if ( type == ExternalForcesVector ) {
352 // The external forces have two contributions. On the additional equations for sigmaS, the load is equal to the prescribed slip gradient value.
353 FloatArray rStressLoad;
354 FloatArray slipGrad;
355 this->giveSlipGradient(slipGrad);
356 slipGrad.resizeWithValues(2);
357
358 double loadLevel = this->giveTimeFunction()->evaluateAtTime(tStep->giveTargetTime());
359 rStressLoad.beScaled(loadLevel, slipGrad);
360
361 answer.assemble(rStressLoad, sigmaS_loc);
362 } else if ( type == InternalForcesVector ) {
363 FloatMatrix Ksig, Ksig_el;
364 FloatArray fe_sig, fe_u;
365 FloatArray sigmaS, u_s, u_c;
366 IntArray loc, loc_s, loc_c, masterDofIDs;
367
368 // Fetch the current values of the Lagrange multiplier;
369 lmSigmaSHom->giveUnknownVector(sigmaS, lmSigmaSIds, mode, tStep);
370
371 // CONTRIBUTION FROM REINFORCEMENT
372 FloatMatrix C;
373 double gammaBoxInt = computeInterfaceLength(rebarSets);
375// C.resizeWithData(4,4);
376 Ksig.clear();
377 Ksig_el.clear();
378 fe_sig.clear();
379 fe_u.clear();
380
381 for ( int i = 0; i < rebarSets.giveSize(); ++i ) {
382 Set *steelSet = this->giveDomain()->giveSet(rebarSets.at(i+1));
383
384 for (int pos = 1; pos <= steelSet->giveElementList().giveSize(); ++pos) {
385 Element *es = this->giveDomain()->giveElement( steelSet->giveElementList().at(pos) );
386
387 // Fetch the element information;
388 es->giveLocationArray(loc_s, s, &masterDofIDs);
389
390 // Fetch the nodal displacements
391 // since computeVectorOf gives the unknown vector in local coordinate system, it needs to be rotated to global coordinates
392 FloatMatrix G2L;
394 es->computeVectorOf(mode, tStep, u_s);
395 u_s.rotatedWith(G2L, 't');
396
397 //Compute the stiffness matrix expansion
398 this->integrateTangentRStressSteel(Ksig_el, es, rebarSets.at(i+1));
399 Ksig.beTProductOf(C, Ksig_el);
400 Ksig.times(1/gammaBoxInt);
401
402 //Compute the contribution to internal force vector
403 fe_u.beTProductOf(Ksig, sigmaS);
404 fe_sig.beProductOf(Ksig, u_s);
405
406 //Assemble
407 answer.assemble(fe_u, loc_s);
408 answer.assemble(fe_sig, sigmaS_loc);
409 }
410 }
411
412 Ksig.clear();
413 fe_sig.clear();
414 fe_u.clear();
415
416 // CONTRIBUTION FROM CONCRETE
418 Set *concreteBoundSet = this->giveDomain()->giveSet(this->set);
419 const IntArray &boundaries = concreteBoundSet->giveBoundaryList();
420
421 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
422 Element *ec = this->giveDomain()->giveElement( boundaries.at(pos*2-1) );
423 int boundary = boundaries.at(pos*2);
424
425 // Fetch the element information;
426 ec->giveLocationArray(loc_c, s, &masterDofIDs);
427
428 // Fetch the nodal displacements
429 ec->computeVectorOf(mode, tStep, u_c);
430
431 //Compute the stiffness matrix expansion
432 this->integrateTangentRStressConcrete(Ksig, ec, boundary);
433 Ksig.times(1/omegaBox);
434
435 //Compute the contribution to internal force vector
436 fe_u.beTProductOf(Ksig, sigmaS);
437 fe_sig.beProductOf(Ksig, u_c);
438
439 // Note: The terms appear negative in the equations:
440 fe_u.negated();
441 fe_sig.negated();
442
443 //Assemble
444 answer.assemble(fe_u, loc_c);
445 answer.assemble(fe_sig, sigmaS_loc);
446 }
447 }
448}
449
450void PrescribedDispSlipBCNeumannRC :: assemble(SparseMtrx &answer, TimeStep *tStep,
451 CharType type,
452 const UnknownNumberingScheme &r_s,
453 const UnknownNumberingScheme &c_s,
454 double scale,
455 void* lock)
456{
457 if ( type == TangentStiffnessMatrix || type == SecantStiffnessMatrix || type == ElasticStiffnessMatrix ) {
458 if ( dispGradON ) {
459 this->assembleOnStress(answer, r_s, c_s, scale );
460 }
461
462 if ( slipON ) {
463 this->assembleOnTransferStress(answer, r_s, c_s, scale);
464 }
465
466 if ( slipGradON ) {
467 this->assembleOnReinfStress(answer, r_s, c_s, scale);
468 }
469 } else {
470 OOFEM_LOG_DEBUG("Skipping assembly in PrescribedDispSlipBCNeumann::assemble().");
471 }
472}
473
474
475
476void PrescribedDispSlipBCNeumannRC :: giveLocationArrays(std :: vector< IntArray > &rows, std :: vector< IntArray > &cols, CharType type,
477 const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s)
478{
479 int i = 0;
480 if ( dispGradON ) {
481 IntArray loc_r, loc_c, sigma_loc_r, sigma_loc_c;
482
483 // Fetch the columns/rows for the stress contributions;
484 mpSigmaHom->giveLocationArray( mSigmaIds, sigma_loc_r, r_s );
485 mpSigmaHom->giveLocationArray( mSigmaIds, sigma_loc_c, c_s );
486
487 Set *set = this->giveDomain()->giveSet( this->set );
488 const IntArray &boundaries = set->giveBoundaryList();
489
490 rows.resize( boundaries.giveSize() );
491 cols.resize( boundaries.giveSize() );
492 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
493 Element *e = this->giveDomain()->giveElement( boundaries.at( pos * 2 - 1 ) );
494
495 // Here, we could use only the nodes actually located on the boundary, but we don't.
496 // Instead, we use all nodes belonging to the element, which is allowed because the
497 // basis functions related to the interior nodes will be zero on the boundary.
498 // Obviously, this is less efficient, so why do we want to do it this way?
499 // Because it is easier when XFEM enrichments are present. /ES
500 e->giveLocationArray( loc_r, r_s );
501 e->giveLocationArray( loc_c, c_s );
502
503 // For most uses, loc_r == loc_c, and sigma_loc_r == sigma_loc_c.
504 rows[i] = loc_r;
505 cols[i] = sigma_loc_c;
506 i++;
507 // and the symmetric part (usually the transpose of above)
508 rows[i] = sigma_loc_r;
509 cols[i] = loc_c;
510 i++;
511 }
512 }
513
514 if ( slipON ) {
515 IntArray loc_r, loc_c, tau_loc_r, tau_loc_c;
516
517 // Fetch the columns/rows for the transfer stress contributions;
518 lmTauHom->giveLocationArray(lmTauIds, tau_loc_r, r_s);
519 lmTauHom->giveLocationArray(lmTauIds, tau_loc_c, c_s);
520
521 Set *concreteSet = this->giveDomain()->giveSet(this->concreteVolSet);
522 const IntArray &conEl = concreteSet->giveElementList();
523 IntArray steelEl;
524
525 for ( int j = 1; j <= this->rebarSets.giveSize(); ++j ) {
526 steelEl.followedBy(this->giveDomain()->giveSet(rebarSets.at(j))->giveElementList());
527 }
528
529 rows.resize( 2*steelEl.giveSize() + 2*conEl.giveSize() + i);
530 cols.resize( 2*steelEl.giveSize() + 2*conEl.giveSize() + i);
531 //Contribution from steel
532 for ( int pos = 1; pos <= steelEl.giveSize(); ++pos ) {
533 Element *e = this->giveDomain()->giveElement(steelEl.at(pos));
534
535 e->giveLocationArray(loc_r, r_s);
536 e->giveLocationArray(loc_c, c_s);
537
538 // For most uses, loc_r == loc_c, and tau_loc_r == tau_loc_c.
539 rows [ i ] = loc_r;
540 cols [ i ] = tau_loc_c;
541 i++;
542 // and the symmetric part (usually the transpose of above)
543 rows [ i ] = tau_loc_r;
544 cols [ i ] = loc_c;
545 i++;
546 }
547
548 //Contribution from concrete
549 for ( int pos = 1; pos <= conEl.giveSize(); ++pos ) {
550 Element *e = this->giveDomain()->giveElement(conEl.at(pos));
551
552 e->giveLocationArray(loc_r, r_s);
553 e->giveLocationArray(loc_c, c_s);
554
555 // For most uses, loc_r == loc_c, and tau_loc_r == tau_loc_c.
556 rows [ i ] = loc_r;
557 cols [ i ] = tau_loc_c;
558 i++;
559 // and the symmetric part (usually the transpose of above)
560 rows [ i ] = tau_loc_r;
561 cols [ i ] = loc_c;
562 i++;
563 }
564 }
565
566 if ( slipGradON ) {
567 IntArray loc_r, loc_c, sigmaS_loc_r, sigmaS_loc_c;
568
569 // Fetch the columns/rows for the reinforcement stress contributions;
570 lmSigmaSHom->giveLocationArray(lmSigmaSIds, sigmaS_loc_r, r_s);
571 lmSigmaSHom->giveLocationArray(lmSigmaSIds, sigmaS_loc_c, c_s);
572
573 Set *concreteSet = this->giveDomain()->giveSet(this->set);
574 const IntArray &boundaries = concreteSet->giveBoundaryList();
575 IntArray steelEl;
576
577 for ( int i = 1; i <= this->rebarSets.giveSize(); ++i ) {
578 steelEl.followedBy(this->giveDomain()->giveSet(rebarSets.at(i))->giveElementList());
579 }
580
581 rows.resize( 2*steelEl.giveSize() + boundaries.giveSize() + i );
582 cols.resize( 2*steelEl.giveSize() + boundaries.giveSize() + i );
583 //Contribution from steel
584 for ( int pos = 1; pos <= steelEl.giveSize(); ++pos ) {
585 Element *e = this->giveDomain()->giveElement(steelEl.at(pos));
586
587 e->giveLocationArray(loc_r, r_s);
588 e->giveLocationArray(loc_c, c_s);
589
590 // For most uses, loc_r == loc_c, and sigmaS_loc_r == sigmaS_loc_c.
591 rows [ i ] = loc_r;
592 cols [ i ] = sigmaS_loc_c;
593 i++;
594 // and the symmetric part (usually the transpose of above)
595 rows [ i ] = sigmaS_loc_r;
596 cols [ i ] = loc_c;
597 i++;
598 }
599
600 //Contribution from concrete
601 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
602 Element *e = this->giveDomain()->giveElement( boundaries.at(pos*2-1) );
603
604 e->giveLocationArray(loc_r, r_s);
605 e->giveLocationArray(loc_c, c_s);
606
607 // For most uses, loc_r == loc_c, and sigmaS_loc_r == sigmaS_loc_c.
608 rows [ i ] = loc_r;
609 cols [ i ] = sigmaS_loc_c;
610 i++;
611 // and the symmetric part (usually the transpose of above)
612 rows [ i ] = sigmaS_loc_r;
613 cols [ i ] = loc_c;
614 i++;
615 }
616 }
617}
618
619void PrescribedDispSlipBCNeumannRC :: computeStress(FloatArray &sigma, TimeStep *tStep)
620{
621 if ( dispGradON ) {
622 double volRVE = this->domainSize( this->giveDomain(), this->giveSetNumber() );
623 double areaRVE = PrescribedDispSlipHomogenization::domainSize( this->giveDomain(), this->giveSetNumber() );
624 double thick = volRVE / areaRVE;
625 mpSigmaHom->giveUnknownVector( sigma, mSigmaIds, VM_Total, tStep );
626 sigma.times( 1 / thick );
627 }
628}
629
630
632{
633 if ( slipON ) {
634 double volRVE = this->domainSize( this->giveDomain(), this->giveSetNumber() );
635 lmTauHom->giveUnknownVector( bStress, lmTauIds, VM_Total, tStep );
636 bStress.times( -1 / volRVE );
637 }
638}
639
640
642{
643 if ( slipGradON ) {
644 double volRVE = this->domainSize( this->giveDomain(), this->giveSetNumber() );
645 lmSigmaSHom->giveUnknownVector( rStress, lmSigmaSIds, VM_Total, tStep );
646 rStress.resizeWithValues(4);
647 rStress.times( -1 / volRVE );
648 }
649}
650
651
652void PrescribedDispSlipBCNeumannRC :: computeTangent(FloatMatrix &tangent, TimeStep *tStep)
653{
654 OOFEM_ERROR("Tangent not implemented")
655}
656
657
658void PrescribedDispSlipBCNeumannRC :: integrateTangentStress(FloatMatrix &oTangent, Element *e, int iBndIndex)
659{
660 FloatArray normal, n;
661 FloatMatrix nMatrix, E_n;
662 FloatMatrix contrib;
663
664 FEInterpolation *interp = e->giveInterpolation(); // Geometry interpolation
665
667
668 // Interpolation order
669 int order = interp->giveInterpolationOrder();
670 std :: unique_ptr< IntegrationRule > ir;
671
672 ir = interp->giveBoundaryIntegrationRule(order, iBndIndex, e->giveGeometryType());
673
674 oTangent.clear();
675
676 for ( auto &gp: *ir ) {
677 const FloatArray &lcoords = gp->giveNaturalCoordinates();
678 FEIElementGeometryWrapper cellgeo(e);
679
680 // Evaluate the normal;
681 double detJ = interp->boundaryEvalNormal(normal, iBndIndex, lcoords, cellgeo);
682
683 // Compute global coordinates of Gauss point
684 FloatArray globalCoord;
685 interp->boundaryLocal2Global(globalCoord, iBndIndex, lcoords, cellgeo);
686
687 // Compute local coordinates on the element
688 FloatArray bulkElLocCoords;
689 e->computeLocalCoordinates(bulkElLocCoords, globalCoord);
690
691 // Evaluate the velocity/displacement coefficients
692 interp->evalN(n, bulkElLocCoords, cellgeo);
693 nMatrix.beNMatrixOf(n, nsd);
694
695 E_n.resize(nsd*nsd, nsd);
696 E_n.zero();
697
698 if ( nsd == 3 ) {
699 E_n.at(1, 1) = normal.at(1);
700 E_n.at(2, 2) = normal.at(2);
701 E_n.at(3, 3) = normal.at(3);
702 E_n.at(4, 1) = normal.at(2);
703 E_n.at(5, 1) = normal.at(3);
704 E_n.at(6, 2) = normal.at(3);
705 E_n.at(7, 2) = normal.at(1);
706 E_n.at(8, 3) = normal.at(1);
707 E_n.at(9, 3) = normal.at(2);
708 } else if ( nsd == 2 ) {
709 E_n.at(1, 1) = normal.at(1);
710 E_n.at(2, 2) = normal.at(2);
711 E_n.at(3, 1) = normal.at(2);
712 E_n.at(4, 2) = normal.at(1);
713 } else {
714 E_n.at(1, 1) = normal.at(1);
715 }
716
717 contrib.beProductOf(E_n, nMatrix);
718
719 oTangent.add(detJ * gp->giveWeight(), contrib);
720 }
721}
722
723
725{
726 FloatMatrix Nstau, Ns, contrib;
727 double Ss;
728 IntArray DofMask;
729
730 //Get number of DOFs per DofManager
731 e->giveDofManDofIDMask(1, DofMask);
732 int ndof = DofMask.giveSize();
733
734 FEInterpolation *interp = e->giveInterpolation();
735 int order = interp->giveInterpolationOrder();
736 std :: unique_ptr< IntegrationRule > ir;
737 ir = interp->giveIntegrationRule(order, e->giveGeometryType());
738
739 oTangent.clear();
740
741 for ( auto &gp : *ir ) {
742 const FloatArray &lcoords = gp->giveNaturalCoordinates();
743 FEIElementGeometryWrapper cellgeo(e);
744
745 //Compute shape functions
746 FloatArray nu;
747 interp->evalN(nu, lcoords, cellgeo);
748 Ns.beNMatrixOf(nu, ndof);
749
750 //Constant traction interpolation
751 this->computeRebarDyad(Nstau, rebarSet);
752 Nstau.resizeWithData(3,2);
753
754 //Compute rebar perimeter
756 Ss = sqrt(4 * cs->give(CS_Area, gp) * M_PI);
757
758 //Compute the integral
759 contrib.beTProductOf(Nstau, Ns);
760 contrib.times(Ss);
761 double detJ = interp->giveTransformationJacobian(lcoords, cellgeo);
762 oTangent.add(detJ * gp->giveWeight(), contrib);
763 }
764}
765
766
768{
769 FloatMatrix Nctau, Nc, contrib;
770 IntArray DofMask;
771
772 //Get number of DOFs per DofManager
773 e->giveDofManDofIDMask(1, DofMask);
774 int ndof = DofMask.giveSize();
775
776 FEInterpolation *interp = e->giveInterpolation();
777 int order = interp->giveInterpolationOrder();
778 std :: unique_ptr< IntegrationRule > ir;
779 ir = interp->giveIntegrationRule(order, e->giveGeometryType());
780
781 oTangent.clear();
782 Nctau.resize(ndof,ndof);
783
784 for ( auto &gp : *ir ) {
785 const FloatArray &lcoords = gp->giveNaturalCoordinates();
786 FEIElementGeometryWrapper cellgeo(e);
787
788 //Compute shape functions
789 FloatArray nu;
790 interp->evalN(nu, lcoords, cellgeo);
791 Nc.beNMatrixOf(nu, ndof);
792
793 //Constant traction interpolation
794 Nctau.beUnitMatrix();
795
796 //Compute the integral
797 contrib.beTProductOf(Nctau, Nc);
798 double detJ = interp->giveTransformationJacobian(lcoords, cellgeo);
799 oTangent.add(detJ * gp->giveWeight(), contrib);
800 }
801}
802
803
805{
806 FloatMatrix Nssig, Bs, contrib;
807 double Ss;
808 IntArray DofMask;
809
810 //Get number of DOFs per DofManager
811 e->giveDofManDofIDMask(1, DofMask);
812
813 FEInterpolation *interp = e->giveInterpolation();
814 int order = interp->giveInterpolationOrder();
815 std :: unique_ptr< IntegrationRule > ir;
816 ir = interp->giveIntegrationRule(order, e->giveGeometryType());
817 //Cast into StructuralElement
818 StructuralElement *se = dynamic_cast<StructuralElement*>(e);
819
820 oTangent.clear();
821
822 for ( auto &gp : *ir ) {
823 const FloatArray &lcoords = gp->giveNaturalCoordinates();
824 FEIElementGeometryWrapper cellgeo(e);
825
826 //Compute shape function derivatives
827 FloatMatrix b;
828 se->computeBmatrixAt(gp, b);
829 //TODO: make it element independent; now hardcoded for libeam2d elements
830 Bs.resize(2,6);
831 Bs.at(1,1) = b.at(1,1);
832 Bs.at(2,2) = b.at(1,1);
833 Bs.at(1,4) = b.at(1,4);
834 Bs.at(2,5) = b.at(1,4);
835
836 //Constant traction interpolation
837 this->computeRebarDyad(Nssig, rebarSet);
838// Nssig.resizeWithData(2,4);
839
840 //Compute rebar perimeter
842 Ss = sqrt(4 * cs->give(CS_Area, gp) * M_PI);
843
844 //Compute the integral
845 contrib.beTProductOf(Nssig, Bs);
846 contrib.times(Ss);
847 double detJ = interp->giveTransformationJacobian(lcoords, cellgeo);
848 oTangent.add(detJ * gp->giveWeight(), contrib);
849 }
850}
851
852
854{
855 FloatArray normal, n;
856 FloatMatrix nMatrix, E_n;
857 FloatMatrix contrib;
858
859 FEInterpolation *interp = e->giveInterpolation();
860
862
863 //Interpolation order
864 int order = interp->giveInterpolationOrder();
865 std :: unique_ptr< IntegrationRule > ir = interp->giveBoundaryEdgeIntegrationRule(order, iBndIndex, e->giveGeometryType());
866
867 oTangent.clear();
868
869 for ( auto &gp : *ir ) {
870 const FloatArray &lcoords = gp->giveNaturalCoordinates();
871 FEIElementGeometryWrapper cellgeo(e);
872
873 //Evaluate the normal
874 double detJ = interp->boundaryEvalNormal(normal, iBndIndex, lcoords, cellgeo);
875
876 //Compute global coordinates of Gauss point
877 FloatArray globalCoord;
878 interp->boundaryLocal2Global(globalCoord, iBndIndex, lcoords, cellgeo);
879
880 //Compute local coordinates on the element
881 FloatArray bulkElLocCoords;
882 e->computeLocalCoordinates(bulkElLocCoords, globalCoord);
883
884 //Evaluate the shape functions
885 interp->evalN(n, bulkElLocCoords, cellgeo);
886 nMatrix.beNMatrixOf(n, nsd);
887
888 E_n.resize(nsd, nsd);
889 E_n.zero();
890 if ( nsd == 3 ) {
891 E_n.at(1, 1) = normal.at(1);
892 E_n.at(2, 2) = normal.at(2);
893 E_n.at(3, 3) = normal.at(3);
894 } else if ( nsd == 2 ) {
895 E_n.at(1, 1) = normal.at(1);
896 E_n.at(2,2) = normal.at(2);
897 } else {
898 E_n.at(1, 1) = normal.at(1);
899 }
900
901 contrib.beProductOf(E_n, nMatrix);
902
903 oTangent.add(detJ * gp->giveWeight(), contrib);
904 }
905
906}
907
908
910{
911 FloatMatrix Ke, KeT;
912 IntArray loc_r, loc_c, sigma_loc_r, sigma_loc_c;
913 Set *set = this->giveDomain()->giveSet(this->set);
914 const IntArray &boundaries = set->giveBoundaryList();
915
916 // Fetch the columns/rows for the stress contributions;
917 mpSigmaHom->giveLocationArray(mSigmaIds, sigma_loc_r, r_s);
918 mpSigmaHom->giveLocationArray(mSigmaIds, sigma_loc_c, c_s);
919
920
921 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
922 Element *e = this->giveDomain()->giveElement( boundaries.at(pos * 2 - 1) );
923 int boundary = boundaries.at(pos * 2);
924
925 e->giveLocationArray(loc_r, r_s);
926 e->giveLocationArray(loc_c, c_s);
927
928 this->integrateTangentStress(Ke, e, boundary);
929
930 Ke.negated();
931 Ke.times(scale);
932 KeT.beTranspositionOf(Ke);
933
934 answer.assemble(sigma_loc_r, loc_c, Ke); // Contribution to delta_s_i equations
935 answer.assemble(loc_r, sigma_loc_c, KeT); // Contributions to delta_v equations
936 }
937}
938
939
941{
942 FloatMatrix Ke, KeT;
943 FloatMatrix Ktau;
944 IntArray loc_r, loc_c, tau_loc_r, tau_loc_c;
945
946 // Fetch the columns/rows for transferr stress contributions;
947 lmTauHom->giveLocationArray(lmTauIds, tau_loc_r, r_s);
948 lmTauHom->giveLocationArray(lmTauIds, tau_loc_c, c_s);
949
950 //Contribution from reinforcement
951 FloatMatrix C;
952 double gammaBoxInt = computeInterfaceLength(rebarSets);
954
955 for ( int i = 0; i < rebarSets.giveSize(); ++i ) {
956 Set *steelSet = this->giveDomain()->giveSet(rebarSets.at(i+1));
957
958 for ( int pos = 1; pos <= steelSet->giveElementList().giveSize(); ++pos ) {
959 Element *es = this->giveDomain()->giveElement( steelSet->giveElementList().at(pos) );
960
961 es->giveLocationArray(loc_r, r_s);
962 es->giveLocationArray(loc_c, c_s);
963
964 this->integrateTangentBStressSteel(Ktau, es, rebarSets.at(i+1));
965 Ke.beTProductOf(C, Ktau);
966 Ke.times(1/gammaBoxInt);
967 KeT.beTranspositionOf(Ke);
968
969 answer.assemble(tau_loc_r, loc_c, Ke);
970 answer.assemble(loc_r, tau_loc_c, KeT);
971 }
972 }
973
974 Ktau.clear();
975 Ke.clear();
976 KeT.clear();
977
978 //Contribution from concrete
979 Set *concreteSet = this->giveDomain()->giveSet(concreteVolSet);
981
982 for ( int pos = 1; pos <= concreteSet->giveElementList().giveSize(); ++pos ) {
983 Element *ec = this->giveDomain()->giveElement( concreteSet->giveElementList().at(pos) );
984
985 ec->giveLocationArray(loc_r, r_s);
986 ec->giveLocationArray(loc_c, c_s);
987
989 Ke.times(1/omegaBox);
990 Ke.negated();
991 KeT.beTranspositionOf(Ke);
992
993 answer.assemble(tau_loc_r, loc_c, Ke);
994 answer.assemble(loc_r, tau_loc_c, KeT);
995 }
996}
997
998
1000{
1001 FloatMatrix Ke, KeT;
1002 FloatMatrix Ksig;
1003 IntArray loc_r, loc_c, sigmaS_loc_r, sigmaS_loc_c;
1004
1005 // Fetch the columns/rows for the stress contributions;
1006 lmSigmaSHom->giveLocationArray(lmSigmaSIds, sigmaS_loc_r, r_s);
1007 lmSigmaSHom->giveLocationArray(lmSigmaSIds, sigmaS_loc_c, c_s);
1008
1009 //Contribution from reinforcement
1010 FloatMatrix C;
1011 double gammaBoxInt = computeInterfaceLength(rebarSets);
1013// C.resizeWithData(4,4);
1014
1015 for ( int i = 0; i < rebarSets.giveSize(); ++i ) {
1016 Set *steelSet = this->giveDomain()->giveSet(rebarSets.at(i+1));
1017
1018 for ( int pos = 1; pos <= steelSet->giveElementList().giveSize(); ++pos ) {
1019 Element *es = this->giveDomain()->giveElement( steelSet->giveElementList().at(pos) );
1020
1021 es->giveLocationArray(loc_r, r_s);
1022 es->giveLocationArray(loc_c, c_s);
1023
1024 this->integrateTangentRStressSteel(Ksig, es, rebarSets.at(i+1));
1025 Ke.beTProductOf(C, Ksig);
1026 Ke.times(1/gammaBoxInt);
1027 KeT.beTranspositionOf(Ke);
1028
1029 answer.assemble(sigmaS_loc_r, loc_c, Ke);
1030 answer.assemble(loc_r, sigmaS_loc_c, KeT);
1031 }
1032 }
1033
1034 Ksig.clear();
1035 Ke.clear();
1036 KeT.clear();
1037
1038 //Contribution from concrete
1039 Set *concreteBoundSet = this->giveDomain()->giveSet(this->set);
1040 const IntArray &boundaries = concreteBoundSet->giveBoundaryList();
1041 double omegaBox = PrescribedDispSlipHomogenization::domainSize(this->giveDomain(), this->giveSetNumber());
1042
1043 for ( int pos = 1; pos <= boundaries.giveSize() / 2; ++pos ) {
1044 Element *ec = this->giveDomain()->giveElement( boundaries.at(pos*2-1) );
1045 int boundary = boundaries.at(pos*2);
1046
1047 ec->giveLocationArray(loc_r, r_s);
1048 ec->giveLocationArray(loc_c, c_s);
1049
1050 this->integrateTangentRStressConcrete(Ke, ec, boundary);
1051
1052 Ke.times(1/omegaBox);
1053 Ke.negated();
1054 KeT.beTranspositionOf(Ke);
1055
1056 answer.assemble(sigmaS_loc_r, loc_c, Ke);
1057 answer.assemble(loc_r, sigmaS_loc_c, KeT);
1058 }
1059}
1060
1061
1063{
1066 double gammaBoxInt = computeInterfaceLength(reinfSets);
1067 FloatMatrix dyadMatrix;
1068 for ( int i = 0; i < reinfSets.giveSize(); ++i ) {
1069 FloatMatrix dya;
1070 double perimeterCoeff = 0;
1071
1072 Set *set = this->giveDomain()->giveSet(reinfSets.at(i+1));
1073 for ( int j = 0; j < set->giveElementList().giveSize(); ++j ) {
1074 Element *e = this->giveDomain()->giveElement(set->giveElementList().at(j+1));
1075 FEInterpolation *interp = e->giveInterpolation();
1076 int order = interp->giveInterpolationOrder();
1077 std :: unique_ptr< IntegrationRule > ir;
1078 ir = interp->giveIntegrationRule(order, e->giveGeometryType());
1079
1080 for ( auto &gp : *ir ) {
1081 const FloatArray &lcoords = gp->giveNaturalCoordinates();
1082 FEIElementGeometryWrapper cellgeo(e);
1083 double detJ = interp->giveTransformationJacobian(lcoords, cellgeo);
1084 CrossSection *cs = e->giveCrossSection();
1085 double perim = sqrt(4 * cs->give(CS_Area, gp) * M_PI);
1086 perimeterCoeff = perimeterCoeff + perim * detJ * gp->giveWeight();
1087 }
1088 }
1089
1090 this->computeRebarDyad(dya, reinfSets.at(i+1));
1091 dyadMatrix.add(perimeterCoeff, dya);
1092 }
1093
1094 C.beInverseOf(dyadMatrix);
1095 C.times(gammaBoxInt);
1096}
1097
1098
1100{
1103
1104 FloatArray e_l;
1105 Set *set = this->giveDomain()->giveSet(reinfSet);
1106 IntArray ellist = set->giveElementList();
1107 Element *element = this->giveDomain()->giveElement(ellist.at(1));
1108 FEIElementGeometryWrapper cellgeo(element);
1109
1110 e_l.resize(2);
1111 e_l.at(1) = cellgeo.giveVertexCoordinates(2).at(1) - cellgeo.giveVertexCoordinates(1).at(1);
1112 e_l.at(2) = cellgeo.giveVertexCoordinates(2).at(2) - cellgeo.giveVertexCoordinates(1).at(2);
1113 e_l.normalize();
1114
1115 dyad.beDyadicProductOf(e_l,e_l);
1116}
1117
1118
1120{
1121 double gamma = 0.;
1122 for ( int i=0; i < reinfSets.giveSize(); ++i ) {
1123 Set *set = this->giveDomain()->giveSet(reinfSets.at(i+1));
1124 for ( int j=0; j < set->giveElementList().giveSize(); ++j ) {
1125 Element *e = this->giveDomain()->giveElement(set->giveElementList().at(j+1));
1126 FEInterpolation *interp = e->giveInterpolation();
1127 int order = interp->giveInterpolationOrder();
1128 std :: unique_ptr< IntegrationRule > ir;
1129 ir = interp->giveIntegrationRule(order, e->giveGeometryType());
1130
1131 for ( auto &gp : *ir ) {
1132 const FloatArray &lcoords = gp->giveNaturalCoordinates();
1133 FEIElementGeometryWrapper cellgeo(e);
1134 double detJ = interp->giveTransformationJacobian(lcoords, cellgeo);
1135 gamma = gamma + detJ * gp->giveWeight();
1136 }
1137 }
1138 }
1139
1140 return gamma;
1141}
1142
1143
1145{
1146 double omegaBox = PrescribedDispSlipHomogenization::domainSize(d, this->giveSetNumber());
1147
1148 if ( this->giveDomain()->giveNumberOfSpatialDimensions() == 2 ) {
1149 //assuming that the RVE thickness is constant in 2D
1150 Element *e = this->giveDomain()->giveElement( this->giveDomain()->giveSet( this->giveSetNumber() )->giveBoundaryList().at(1) );
1151 std::unique_ptr<IntegrationRule> ir = e->giveInterpolation()->giveIntegrationRule( e->giveInterpolation()->giveInterpolationOrder(), e->giveGeometryType() );
1152 CrossSection *cs = e->giveCrossSection();
1153 GaussPoint *gp = ir->getIntegrationPoint(0);
1154 double thickness = cs->give(CS_Thickness, gp);
1155 return omegaBox * thickness;
1156 } else {
1157 return omegaBox;
1158 }
1159}
1160
1161} /* namespace oofem */
#define REGISTER_BoundaryCondition(class)
ActiveBoundaryCondition(int n, Domain *d)
Definition activebc.h:71
virtual double give(CrossSectionProperty a, GaussPoint *gp) const
Set * giveSet(int n)
Definition domain.C:366
int giveNextFreeDofID(int increment=1)
Definition domain.C:1519
Element * giveElement(int n)
Definition domain.C:165
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
Definition domain.C:1137
void setField(int item, InputFieldType id)
virtual bool computeGtoLRotationMatrix(FloatMatrix &answer)
Definition element.C:1710
virtual FEInterpolation * giveInterpolation() const
Definition element.h:648
virtual void giveDofManDofIDMask(int inode, IntArray &answer) const
Definition element.h:488
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
Definition element.C:429
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Definition element.C:103
CrossSection * giveCrossSection()
Definition element.C:534
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
Definition element.C:1240
virtual Element_Geometry_Type giveGeometryType() const =0
const FloatArray giveVertexCoordinates(int i) const override
Definition feinterpol.h:116
virtual std::unique_ptr< IntegrationRule > giveBoundaryIntegrationRule(int order, int boundary, const Element_Geometry_Type) const
Definition feinterpol.C:101
virtual std::unique_ptr< IntegrationRule > giveBoundaryEdgeIntegrationRule(int order, int boundary, const Element_Geometry_Type) const
Definition feinterpol.C:112
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
Definition feinterpol.C:81
virtual std::unique_ptr< IntegrationRule > giveIntegrationRule(int order, const Element_Geometry_Type) const
Definition feinterpol.C:90
int giveInterpolationOrder() const
Definition feinterpol.h:199
virtual void boundaryLocal2Global(FloatArray &answer, int boundary, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double boundaryEvalNormal(FloatArray &answer, int boundary, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Definition femcmpnn.h:97
void assemble(const FloatArray &fe, const IntArray &loc)
Definition floatarray.C:616
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
void resizeWithValues(Index s, std::size_t allocChunk=0)
Definition floatarray.C:103
void rotatedWith(FloatMatrix &r, char mode)
Definition floatarray.C:814
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void assembleSquared(const FloatArray &fe, const IntArray &loc)
Definition floatarray.C:637
void beScaled(double s, const FloatArray &b)
Definition floatarray.C:208
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
void times(double s)
Definition floatarray.C:834
void times(double f)
void resizeWithData(Index, Index)
Definition floatmatrix.C:91
void add(const FloatMatrix &a)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beNMatrixOf(const FloatArray &n, int nsd)
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)
void beUnitMatrix()
Sets receiver to unity matrix.
virtual double evaluateAtTime(double t)
Definition function.C:78
int set
Set number for boundary condition to be applied to.
void followedBy(const IntArray &b, int allocChunk=0)
Definition intarray.C:94
void resize(int n)
Definition intarray.C:73
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
void assembleVectorBStress(FloatArray &answer, TimeStep *tStep, CharType type, ValueModeType mode, const UnknownNumberingScheme &s)
int concreteVolSet
Element set containing concrete elements (in the volume of RVE).
void computeWeightMatrix(FloatMatrix &C, const IntArray &reinfSets)
void integrateTangentRStressConcrete(FloatMatrix &oTangent, Element *e, int iBndIndex)
std ::unique_ptr< Node > lmSigmaSHom
DofManager for effective reinforcement membrane stress.
void assembleOnStress(SparseMtrx &answer, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale)
void assembleOnReinfStress(SparseMtrx &answer, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale)
virtual double domainSize(Domain *d, int set) override
void assembleVectorRStress(FloatArray &answer, TimeStep *tStep, CharType type, ValueModeType mode, const UnknownNumberingScheme &s)
void computeReinfStress(FloatArray &rStress, TimeStep *tStep) override
std ::unique_ptr< Node > lmTauHom
DofManager for effective transfer stress.
void assembleOnTransferStress(SparseMtrx &answer, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale)
std ::unique_ptr< Node > mpSigmaHom
on/off flag specifying whether the slip gradient should be applied via Neumann BCs
void integrateTangentStress(FloatMatrix &oTangent, Element *e, int iBndIndex)
IntArray rebarSets
IntArray containing sets of individual reinforcement bars.
double computeInterfaceLength(const IntArray &reinfSets)
void integrateTangentBStressConcrete(FloatMatrix &oTangent, Element *e)
bool slipON
on/off flag specifying whether the displacement gradient should be applied via Neumann BCs
bool slipGradON
on/off flag specifying whether the slip field should be applied via Neumann BCs
void integrateTangentRStressSteel(FloatMatrix &oTangent, Element *e, const int &rebarSet)
void computeRebarDyad(FloatMatrix &dyad, const int &reinfSet)
int giveNumberOfInternalDofManagers() override
Gives the number of internal dof managers.
void integrateTangentBStressSteel(FloatMatrix &oTangent, Element *e, const int &rebarSet)
void computeTransferStress(FloatArray &bStress, TimeStep *tStep) override
void assembleVectorStress(FloatArray &answer, TimeStep *tStep, CharType type, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorm)
const IntArray & giveBoundaryList()
Definition set.C:160
const IntArray & giveElementList()
Definition set.C:158
virtual int assemble(const IntArray &loc, const FloatMatrix &mat)=0
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
double giveTargetTime()
Returns target time.
Definition timestep.h:164
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define OOFEM_LOG_DEBUG(...)
Definition logger.h:144
#define M_PI
Definition mathfem.h:52
@ CS_Area
Area.
@ CS_Thickness
Thickness.
FloatMatrixF< N, M > dyad(const FloatArrayF< N > &a, const FloatArrayF< M > &b)
Computes the dyadic product .
#define _IFT_PrescribedDispSlipBCNeumannRC_RebarSets
#define _IFT_PrescribedDispSlipBCNeumannRC_ConcreteVolSet

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