35#ifndef PRESCRIBEDGRADIENTBCWEAK_H_
36#define PRESCRIBEDGRADIENTBCWEAK_H_
43#include <unordered_map>
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"
70 printf(
"\nTracSegArray segments:\n");
73 l.giveVertex(1).printYourself();
74 l.giveVertex(2).printYourself();
81 l += line.giveLength();
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);
170 const char *
giveClassName()
const override {
return "PrescribedGradientBCWeak"; }
292 void splitSegments(std :: vector< TracSegArray > &ioElArray);
301 virtual void checkIfCorner(
bool &oIsCorner,
bool &oDuplicatable,
const FloatArray &iPos,
const double &iNodeDistTol)
const = 0;
307 void findHoleCoord(std::vector<FloatArray> &oHoleCoordUnsorted, std::vector<FloatArray> &oAllCoordUnsorted);
311 void removeClosePoints(std::vector<FloatArray> &ioCoords,
const double &iAbsTol);
340 bool operator()(
const std :: pair< FloatArray, T > &iVec1,
const std :: pair< FloatArray, int > &iVec2)
const
347 double Lx =
mUC [ 0 ] -
mLC [ 0 ];
348 double Ly =
mUC [ 1 ] -
mLC [ 1 ];
361 return Lx + Ly + Lx +
distance(iPos, x);
398 double Lx =
mUC [ 0 ] -
mLC [ 0 ];
399 double Ly =
mUC [ 1 ] -
mLC [ 1 ];
403 if ( iPos[0] > Lx - Lx*
mRelTol ) {
407 if ( iPos[1] > Ly - Ly*
mRelTol ) {
419 if ( sideInd == 0 ) {
424 if ( sideInd == 1 ) {
428 if ( sideInd == 2 ) {
430 return Lx + Ly + Lx +
distance(iPos, x);
433 if ( sideInd == 3 ) {
ActiveBoundaryCondition(int n, Domain *d)
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
const FloatArray mStartPos
bool operator()(const FloatArray &iVec1, const FloatArray &iVec2) const
ArcPosSortFunction(const FloatArray &iStartPos)
Domain * giveDomain() const
virtual void scale(double s)
int giveSetNumber() const
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)
const IntArray mRegularDispDofIDs
void giveMirroredPointOnGammaMinus(FloatArray &oPosMinus, const FloatArray &iPosPlus) const
void recomputeTractionMesh()
size_t giveNumberOfTractionElements() 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
const IntArray mTractionDofIDs
void setPeriodicityNormal(const FloatArray &iPeriodicityNormal)
const IntArray & giveTracDofIDs() const
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)
bool damageExceedsTolerance(Element *el)
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)
virtual ~PrescribedGradientBCWeak()
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
double mSpringPenaltyStiffness
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 setLowerCorner(FloatArray iLC)
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
bool mDuplicateCornerNodes
int mNumTractionNodesAtIntersections
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
const IntArray mDispLockDofIDs
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
double domainSize() override
FloatArray mPeriodicityNormal
void setUpperCorner(FloatArray iUC)
int giveNumberOfInternalDofManagers() override
Gives the number of internal dof managers.
void computeExtForceElContrib(FloatArray &oContrib, TracSegArray &iEl, int iDim, TimeStep *tStep)
PrescribedGradientBCWeak(int n, Domain *d)
void giveTraction(size_t iElInd, FloatArray &oStartTraction, FloatArray &oEndTraction, ValueModeType mode, TimeStep *tStep)
bcType giveType() const override
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 setDomainSize(double iDomainSize)
void setMirrorFunction(int iMirrorFunction)
PrescribedGradientHomogenization()
virtual double domainSize()
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 setupIntegrationRuleOnEl()
void giveTractionLocationArray(IntArray &rows, CharType type, const UnknownNumberingScheme &s)
static FloatArray Vec2(const double &a, const double &b)
bcType
Type representing the type of bc.
double distance(const FloatArray &x, const FloatArray &y)
double distance_square(const FloatArray &x, const FloatArray &y)
#define _IFT_PrescribedGradientBCWeak_Name