OOFEM 3.0
Loading...
Searching...
No Matches
prescribedgradientbcweak.h
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
35#ifndef PRESCRIBEDGRADIENTBCWEAK_H_
36#define PRESCRIBEDGRADIENTBCWEAK_H_
37
39#include "activebc.h"
40#include "geometry.h"
41#include "dofiditem.h"
42
43#include <unordered_map>
44#include <memory>
45#include "node.h"
46
47#define _IFT_PrescribedGradientBCWeak_Name "prescribedgradientbcweak"
48#define _IFT_PrescribedGradientBCWeak_TractionInterpOrder "tractioninterporder"
49#define _IFT_PrescribedGradientBCWeak_NumTractionNodesAtIntersections "numnodesatintersections"
50#define _IFT_PrescribedGradientBCWeak_NumTractionNodeSpacing "tractionnodespacing"
51#define _IFT_PrescribedGradientBCWeak_DuplicateCornerNodes "duplicatecornernodes"
52#define _IFT_PrescribedGradientBCWeak_TangDistPadding "tangdistpadding"
53#define _IFT_PrescribedGradientBCWeak_TracDofScaling "tracdofscaling"
54#define _IFT_PrescribedGradientBCWeak_PeriodicityNormal "periodicitynormal"
55#define _IFT_PrescribedGradientBCWeak_MirrorFunction "mirrorfunction"
56
57namespace oofem {
58class IntegrationRule;
59class Node;
60class GaussPoint;
61
63{
64public:
66 TracSegArray(TracSegArray &&src) = default;
67 virtual ~TracSegArray() {}
68
70 printf("\nTracSegArray segments:\n");
71 for ( auto &l : mInteriorSegments ) {
72 printf("\n");
73 l.giveVertex(1).printYourself();
74 l.giveVertex(2).printYourself();
75 }
76 }
77
78 double giveLength() {
79 double l = 0.0;
80 for( auto &line : mInteriorSegments ) {
81 l += line.giveLength();
82 }
83
84 return l;
85 }
86
88
90
91 std :: vector< Line > mInteriorSegments;
92
93 // Interior segments used for Gaussian quadrature
94 std :: vector< Line > mInteriorSegmentsFine;
95
96 std :: vector< FloatArray > mInteriorSegmentsPointsFine;
97
98 std :: unique_ptr< Node > mFirstNode;
99
100 std :: unique_ptr< IntegrationRule > mIntRule;
101};
102
111{
112public:
115
116 void clear();
117
119
120 int giveNumberOfInternalDofManagers() override;
121 DofManager *giveInternalDofManager(int i) override;
122
123 bcType giveType() const override { return UnknownBT; }
124
125 void initializeFrom(InputRecord &ir) override;
126 void giveInputRecord(DynamicInputRecord &input) override;
127
128 void postInitialize() override;
129
130 void computeField(FloatArray &sigma, TimeStep *tStep) override;
131 void computeTangent(FloatMatrix &E, TimeStep *tStep) override;
132
133 void assembleVector(FloatArray &answer, TimeStep *tStep,
134 CharType type, ValueModeType mode,
135 const UnknownNumberingScheme &s, FloatArray *eNorm=nullptr, void* lock=nullptr) override;
136
137 void computeExtForceElContrib(FloatArray &oContrib, TracSegArray &iEl, int iDim, TimeStep *tStep);
138 void computeIntForceGPContrib(FloatArray &oContrib_disp, IntArray &oDisp_loc_array, FloatArray &oContrib_trac, IntArray &oTrac_loc_array,TracSegArray &iEl, GaussPoint &iGP, int iDim, TimeStep *tStep, const FloatArray &iBndCoord, const double &iScaleFac, ValueModeType mode, CharType type, const UnknownNumberingScheme &s);
139
140
141 void assemble(SparseMtrx &answer, TimeStep *tStep,
142 CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale = 1.0, void* lock=nullptr) override;
143
144 virtual void assembleExtraDisplock(SparseMtrx &answer, TimeStep *tStep,
145 CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s);
146
147 virtual void assembleGPContrib(SparseMtrx &answer, TimeStep *tStep,
148 CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s,
149 TracSegArray &iEl, GaussPoint &iGP, double k, void* lock=nullptr);
150
151 void giveLocationArrays(std :: vector< IntArray > &rows, std :: vector< IntArray > &cols, CharType type,
152 const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s) override;
153
154 virtual void giveTractionLocationArray(IntArray &rows,
155 const UnknownNumberingScheme &s);
156
157 virtual void giveDisplacementLocationArray(IntArray &rows,
158 const UnknownNumberingScheme &s);
159
160 void compute_x_times_N_1(FloatMatrix &o_x_times_N);
161 void compute_x_times_N_2(FloatMatrix &o_x_times_N);
162
163
164// virtual void giveTractionLocationArrays(int iTracElInd, IntArray &rows, CharType type,
165// const UnknownNumberingScheme &s);
166//
167// virtual void giveDisplacementLocationArrays(int iTracElInd, IntArray &rows, CharType type,
168// const UnknownNumberingScheme &s);
169
170 const char *giveClassName() const override { return "PrescribedGradientBCWeak"; }
171 const char *giveInputRecordName() const override { return _IFT_PrescribedGradientBCWeak_Name; }
172
173 // Routines for postprocessing
174 size_t giveNumberOfTractionElements() const { return mpTracElNew.size(); }
175 void giveTractionElCoord(size_t iElInd, FloatArray &oStartCoord, FloatArray &oEndCoord) const { oStartCoord = mpTracElNew [ iElInd ].mInteriorSegments[0].giveVertex(1); oEndCoord = mpTracElNew [ iElInd ].mInteriorSegments.back().giveVertex(2); }
176 void giveTractionElNormal(size_t iElInd, FloatArray &oNormal, FloatArray &oTangent) const;
177 void giveTractionElArcPos(size_t iElInd, double &oXiStart, double &oXiEnd) const;
178 void giveBoundaries(IntArray &oBoundaries);
179
180 void giveTraction(size_t iElInd, FloatArray &oStartTraction, FloatArray &oEndTraction, ValueModeType mode, TimeStep *tStep);
181
182 // TODO: Consider moving this function to Domain.
183 void computeDomainBoundingBox(Domain &iDomain, FloatArray &oLC, FloatArray &oUC);
184
185
186 const IntArray &giveTracDofIDs() const { return mTractionDofIDs; }
187 const IntArray &giveDispLockDofIDs() const { return mDispLockDofIDs; }
189
190
191 // Functions mainly for testing
192 void setPeriodicityNormal(const FloatArray &iPeriodicityNormal) { mPeriodicityNormal = iPeriodicityNormal; }
193 void setDomainSize(double iDomainSize) { mDomainSize = std::move(iDomainSize); }
194 void setLowerCorner(FloatArray iLC) { mLC = std::move(iLC); }
195 void setUpperCorner(FloatArray iUC) { mUC = std::move(iUC); }
196
197 void setMirrorFunction(int iMirrorFunction) {mMirrorFunction = iMirrorFunction;};
198
199protected:
200
204
205
206 // Options
207
210
219
225
233
234
240
245
247
250
253
254
256 std::unique_ptr<Node> mpDisplacementLock;
259
264
265
267 std :: vector< TracSegArray > mpTracElNew;
268
269
274
276
282
283public:
285
286 void giveMirroredPointOnGammaMinus(FloatArray &oPosMinus, const FloatArray &iPosPlus) const;
287 void giveMirroredPointOnGammaPlus(FloatArray &oPosPlus, const FloatArray &iPosMinus) const;
288
289protected:
290 void createTractionMesh(bool iEnforceCornerPeriodicity, int iNumSides);
291
292 void splitSegments(std :: vector< TracSegArray > &ioElArray);
293
295
296 void assembleTangentGPContributionNew(FloatMatrix &oTangent, TracSegArray &iEl, GaussPoint &iGP, const double &iScaleFactor, const FloatArray &iBndCoord);
297
298 bool pointIsOnGammaPlus(const FloatArray &iPos) const;
299
300 virtual void giveBoundaryCoordVector(FloatArray &oX, const FloatArray &iPos) const = 0;
301 virtual void checkIfCorner(bool &oIsCorner, bool &oDuplicatable, const FloatArray &iPos, const double &iNodeDistTol) const = 0;
302 virtual bool boundaryPointIsOnActiveBoundary(const FloatArray &iPos) const = 0;
303
304 int giveSideIndex(const FloatArray &iPos) const;
305
306
307 void findHoleCoord(std::vector<FloatArray> &oHoleCoordUnsorted, std::vector<FloatArray> &oAllCoordUnsorted);
308 void findCrackBndIntersecCoord(std::vector<FloatArray> &oHoleCoordUnsorted);
309 void findPeriodicityCoord(std::vector<FloatArray> &oHoleCoordUnsorted);
310
311 void removeClosePoints(std::vector<FloatArray> &ioCoords, const double &iAbsTol);
312 void removeSegOverHoles(TracSegArray &ioTSeg, const double &iAbsTol);
313};
314
316{
317public:
318 ArcPosSortFunction(const FloatArray &iStartPos) : mStartPos(iStartPos) {}
319
320 bool operator()(const FloatArray &iVec1, const FloatArray &iVec2) const
321 {
322 return distance_square(mStartPos, iVec1) < distance_square(mStartPos, iVec2);
323 }
324
325private:
327};
328
329template< class T >
331{
332public:
333 ArcPosSortFunction3(const FloatArray &iLC, const FloatArray &iUC, const double &iTol, int iSideInd) :
334 mLC(iLC),
335 mUC(iUC),
336 mTol(iTol),
337 mSideInd(iSideInd)
338 {}
339
340 bool operator()(const std :: pair< FloatArray, T > &iVec1, const std :: pair< FloatArray, int > &iVec2) const
341 {
342 return calcArcPos(iVec1.first) < calcArcPos(iVec2.first);
343 }
344
345 double calcArcPos(const FloatArray &iPos) const
346 {
347 double Lx = mUC [ 0 ] - mLC [ 0 ];
348 double Ly = mUC [ 1 ] - mLC [ 1 ];
349
350 if ( mSideInd == 0 ) {
351 const FloatArray &x = Vec2( mUC [ 0 ], mLC [ 1 ] );
352 return Lx + distance(iPos, x);
353 }
354
355 if ( mSideInd == 1 ) {
356 return Lx + Ly + distance(iPos, mUC);
357 }
358
359 if ( mSideInd == 2 ) {
360 const FloatArray &x = Vec2( mLC [ 0 ], mUC [ 1 ] );
361 return Lx + Ly + Lx + distance(iPos, x);
362 }
363
364 if ( mSideInd == 3 ) {
365 return distance(iPos, mLC);
366 }
367
368 OOFEM_ERROR("Could not compute distance.")
369 //return 0.0;
370 }
371
372private:
375 const double mTol;
376
377 // 0->x=L, 1->y=L, 2->x=0, 3->y=0
378 const int mSideInd;
379};
380
381
383{
384public:
385 ArcPosSortFunction4(const FloatArray &iLC, const FloatArray &iUC, const double &iRelTol) :
386 mLC(iLC),
387 mUC(iUC),
388 mRelTol(iRelTol)
389 {}
390
391 bool operator()(const FloatArray &iVec1, const FloatArray &iVec2) const
392 {
393 return calcArcPos(iVec1) < calcArcPos(iVec2);
394 }
395
396 double calcArcPos(const FloatArray &iPos) const
397 {
398 double Lx = mUC [ 0 ] - mLC [ 0 ];
399 double Ly = mUC [ 1 ] - mLC [ 1 ];
400
401 int sideInd = -1;
402
403 if ( iPos[0] > Lx - Lx*mRelTol ) {
404 sideInd = 0;
405 }
406
407 if ( iPos[1] > Ly - Ly*mRelTol ) {
408 sideInd = 1;
409 }
410
411 if ( iPos[0] < Lx*mRelTol ) {
412 sideInd = 2;
413 }
414
415 if ( iPos[1] < Ly*mRelTol ) {
416 sideInd = 3;
417 }
418
419 if ( sideInd == 0 ) {
420 const FloatArray &x = Vec2( mUC [ 0 ], mLC [ 1 ] );
421 return Lx + distance(iPos, x);
422 }
423
424 if ( sideInd == 1 ) {
425 return Lx + Ly + distance(iPos, mUC);
426 }
427
428 if ( sideInd == 2 ) {
429 const FloatArray &x = Vec2( mLC [ 0 ], mUC [ 1 ] );
430 return Lx + Ly + Lx + distance(iPos, x);
431 }
432
433 if ( sideInd == 3 ) {
434 return distance(iPos, mLC);
435 }
436
437 OOFEM_ERROR("Could not compute distance.")
438 //return 0.0;
439 }
440
441private:
444 const double mRelTol;
445
446};
447
448} /* namespace oofem */
449
450#endif /* PRESCRIBEDGRADIENTBCWEAK_H_ */
#define E(a, b)
ActiveBoundaryCondition(int n, Domain *d)
Definition activebc.h:71
double calcArcPos(const FloatArray &iPos) const
ArcPosSortFunction3(const FloatArray &iLC, const FloatArray &iUC, const double &iTol, int iSideInd)
bool operator()(const std ::pair< FloatArray, T > &iVec1, const std ::pair< FloatArray, int > &iVec2) const
double calcArcPos(const FloatArray &iPos) const
ArcPosSortFunction4(const FloatArray &iLC, const FloatArray &iUC, const double &iRelTol)
bool operator()(const FloatArray &iVec1, const FloatArray &iVec2) const
bool operator()(const FloatArray &iVec1, const FloatArray &iVec2) const
ArcPosSortFunction(const FloatArray &iStartPos)
Domain * giveDomain() const
Definition femcmpnn.h:97
void compute_x_times_N_2(FloatMatrix &o_x_times_N)
virtual void assembleExtraDisplock(SparseMtrx &answer, TimeStep *tStep, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s)
virtual void giveTractionLocationArray(IntArray &rows, const UnknownNumberingScheme &s)
void giveMirroredPointOnGammaMinus(FloatArray &oPosMinus, const FloatArray &iPosPlus) const
void removeSegOverHoles(TracSegArray &ioTSeg, const double &iAbsTol)
void assembleVector(FloatArray &answer, TimeStep *tStep, CharType type, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorm=nullptr, void *lock=nullptr) override
void setPeriodicityNormal(const FloatArray &iPeriodicityNormal)
virtual void giveBoundaryCoordVector(FloatArray &oX, const FloatArray &iPos) const =0
void giveInputRecord(DynamicInputRecord &input) override
void findPeriodicityCoord(std::vector< FloatArray > &oHoleCoordUnsorted)
void giveTractionElArcPos(size_t iElInd, double &oXiStart, double &oXiEnd) const
const IntArray & giveDispLockDofIDs() const
void initializeFrom(InputRecord &ir) override
void giveLocationArrays(std ::vector< IntArray > &rows, std ::vector< IntArray > &cols, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s) override
void giveBoundaries(IntArray &oBoundaries)
void postInitialize() override
Performs post initialization steps. Called after all components are created and initialized.
const char * giveInputRecordName() const override
virtual void assembleGPContrib(SparseMtrx &answer, TimeStep *tStep, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, TracSegArray &iEl, GaussPoint &iGP, double k, void *lock=nullptr)
void splitSegments(std ::vector< TracSegArray > &ioElArray)
void findCrackBndIntersecCoord(std::vector< FloatArray > &oHoleCoordUnsorted)
void computeIntForceGPContrib(FloatArray &oContrib_disp, IntArray &oDisp_loc_array, FloatArray &oContrib_trac, IntArray &oTrac_loc_array, TracSegArray &iEl, GaussPoint &iGP, int iDim, TimeStep *tStep, const FloatArray &iBndCoord, const double &iScaleFac, ValueModeType mode, CharType type, const UnknownNumberingScheme &s)
const IntArray & giveRegularDispDofIDs() const
void compute_x_times_N_1(FloatMatrix &o_x_times_N)
void removeClosePoints(std::vector< FloatArray > &ioCoords, const double &iAbsTol)
std ::vector< TracSegArray > mpTracElNew
Elements for the independent traction discretization.
virtual void giveDisplacementLocationArray(IntArray &rows, const UnknownNumberingScheme &s)
void giveTractionElCoord(size_t iElInd, FloatArray &oStartCoord, FloatArray &oEndCoord) const
void assembleTangentGPContributionNew(FloatMatrix &oTangent, TracSegArray &iEl, GaussPoint &iGP, const double &iScaleFactor, const FloatArray &iBndCoord)
FloatArray mUC
Upper corner of domain (assuming a rectangular RVE).
void computeField(FloatArray &sigma, TimeStep *tStep) override
DofManager * giveInternalDofManager(int i) override
Gives an internal dof manager from receiver.
bool pointIsOnGammaPlus(const FloatArray &iPos) const
void computeTangent(FloatMatrix &E, TimeStep *tStep) override
FloatArray mLC
Lower corner of domain (assuming a rectangular RVE).
int giveSideIndex(const FloatArray &iPos) const
const char * giveClassName() const override
virtual bool boundaryPointIsOnActiveBoundary(const FloatArray &iPos) const =0
std::unique_ptr< Node > mpDisplacementLock
Lock displacements in one node if periodic.
void assemble(SparseMtrx &answer, TimeStep *tStep, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale=1.0, void *lock=nullptr) override
void giveTractionElNormal(size_t iElInd, FloatArray &oNormal, FloatArray &oTangent) const
int mTractionInterpOrder
Order of interpolation for traction (0->piecewise constant, 1->piecewise linear).
void computeDomainBoundingBox(Domain &iDomain, FloatArray &oLC, FloatArray &oUC)
void giveMirroredPointOnGammaPlus(FloatArray &oPosPlus, const FloatArray &iPosMinus) const
int giveNumberOfInternalDofManagers() override
Gives the number of internal dof managers.
void computeExtForceElContrib(FloatArray &oContrib, TracSegArray &iEl, int iDim, TimeStep *tStep)
void giveTraction(size_t iElInd, FloatArray &oStartTraction, FloatArray &oEndTraction, ValueModeType mode, TimeStep *tStep)
virtual void checkIfCorner(bool &oIsCorner, bool &oDuplicatable, const FloatArray &iPos, const double &iNodeDistTol) const =0
void findHoleCoord(std::vector< FloatArray > &oHoleCoordUnsorted, std::vector< FloatArray > &oAllCoordUnsorted)
void createTractionMesh(bool iEnforceCornerPeriodicity, int iNumSides)
void setMirrorFunction(int iMirrorFunction)
std ::unique_ptr< IntegrationRule > mIntRule
std ::vector< Line > mInteriorSegments
TracSegArray(TracSegArray &&src)=default
std ::vector< Line > mInteriorSegmentsFine
std ::unique_ptr< Node > mFirstNode
std ::vector< FloatArray > mInteriorSegmentsPointsFine
void giveTractionLocationArray(IntArray &rows, CharType type, const UnknownNumberingScheme &s)
#define OOFEM_ERROR(...)
Definition error.h:79
static FloatArray Vec2(const double &a, const double &b)
Definition floatarray.h:606
bcType
Type representing the type of bc.
Definition bctype.h:40
@ UnknownBT
Unknown.
Definition bctype.h:41
double distance(const FloatArray &x, const FloatArray &y)
double distance_square(const FloatArray &x, const FloatArray &y)
#define _IFT_PrescribedGradientBCWeak_Name

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