76 mFirstNode->giveLocationArray({Trac_u, Trac_v}, rows, s);
79void TracSegArray :: setupIntegrationRuleOnEl()
83 int numPointsPerSeg = 1;
84 mIntRule->SetUpPointsOnLine(numPointsPerSeg, _PlaneStrain);
88PrescribedGradientBCWeak :: PrescribedGradientBCWeak(
int n,
Domain *d) :
92 mDispLockDofIDs( {LMP_u, LMP_v} ),
93 mRegularDispDofIDs( {D_u, D_v} ),
94 mTractionInterpOrder(0),
95 mNumTractionNodesAtIntersections(1),
96 mTractionNodeSpacing(1),
97 mMeshIsPeriodic(
false),
98 mDuplicateCornerNodes(
false),
99 mTangDistPadding(0.0),
100 mTracDofScaling(1.0e0),
102 mDispLockScaling(1.0),
105 mSpringPenaltyStiffness(1.0e-3),
106 mPeriodicityNormal(
Vec2(0.0, 1.0)),
112 computeDomainBoundingBox(* d, mLC, mUC);
117PrescribedGradientBCWeak :: ~PrescribedGradientBCWeak()
123void PrescribedGradientBCWeak :: clear()
131int PrescribedGradientBCWeak :: giveNumberOfInternalDofManagers()
143DofManager *PrescribedGradientBCWeak :: giveInternalDofManager(
int i)
156 ActiveBoundaryCondition :: initializeFrom(ir);
157 PrescribedGradientHomogenization :: initializeFrom(ir);
166 OOFEM_ERROR(
"mNumTractionNodesAtIntersections > 1 is not allowed if mTractionInterpOrder == 0.")
172 int duplicateCorners = 0;
176 if ( duplicateCorners == 1 ) {
205 ActiveBoundaryCondition :: giveInputRecord(input);
206 PrescribedGradientHomogenization :: giveInputRecord(input);
227void PrescribedGradientBCWeak :: postInitialize()
236 int dim =
domain->giveNumberOfSpatialDimensions();
238 if ( type == ExternalForcesVector ) {
249 el.giveTractionLocationArray(rows, type, s);
251 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
255 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
260 }
else if ( type == InternalForcesVector ) {
264 for (
auto &gp: *el.mIntRule ) {
268 IntArray disp_loc_array, trac_loc_array;
269 computeIntForceGPContrib(contrib_disp, disp_loc_array, contrib_trac, trac_loc_array, el, *gp, dim, tStep, gp->giveGlobalCoordinates(), 1.0, mode, type, s);
271 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
273 answer.
assemble(contrib_disp, disp_loc_array);
274 answer.
assemble(contrib_trac, trac_loc_array);
276 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
281 disp_loc_array.
clear(); trac_loc_array.
clear();
284 computeIntForceGPContrib(contrib_disp, disp_loc_array, contrib_trac, trac_loc_array, el, *gp, dim, tStep, xMinus, -1.0, mode, type, s);
286 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
288 answer.
assemble(contrib_disp, disp_loc_array);
289 answer.
assemble(contrib_trac, trac_loc_array);
291 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
307 for (
int i = 0; i <
domain->giveNumberOfSpatialDimensions(); i++ ) {
308 fe_dispLock[i] = nodeUnknowns [ i ];
313 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
315 answer.
assemble(fe_dispLock, dispLockRows);
317 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
333 const FloatArray &x = gp->giveGlobalCoordinates();
357 contrib_gp.
times(-detJ * gp->giveWeight()*loadLevel);
359 oContrib.
add(contrib_gp);
364void PrescribedGradientBCWeak :: 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)
383 std::vector<double> dispUnknowns_;
384 for (
int i = 1; i <= numDMan; i++ ) {
389 if (
domain->hasXfemManager() ) {
395 dispUnknowns_.insert(dispUnknowns_.end(),nodeUnknowns.
begin(),nodeUnknowns.
end());
410void PrescribedGradientBCWeak :: assemble(
SparseMtrx &answer,
418 std::vector<FloatArray> gpCoordArray;
420 if ( type == TangentStiffnessMatrix || type == SecantStiffnessMatrix || type == ElasticStiffnessMatrix ) {
424 for (
auto &gp: *el.mIntRule ) {
426 gpCoordArray.push_back( gp->giveGlobalCoordinates() );
432 int nsd =
domain->giveNumberOfSpatialDimensions();
440 IntArray lockRows, lockCols, nodeRows, nodeCols;
447 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
449 answer.
assemble(lockRows, nodeCols, KeDispLock);
450 answer.
assemble(nodeRows, lockCols, KeDispLock);
452 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
459 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
461 answer.
assemble(lockRows, lockCols, KZero);
463 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
468 int nsd =
domain->giveNumberOfSpatialDimensions();
482 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
484 answer.
assemble(nodeRows, nodeCols, KeDispLock);
486 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
491 printf(
"Skipping assembly in PrescribedGradientBCWeak::assemble().\n");
506 int nsd =
domain->giveNumberOfSpatialDimensions();
511 double scaling = 1.0e0;
523 answer.
assemble(nodeRows, nodeCols, KeDispLock);
527 int nsd =
domain->giveNumberOfSpatialDimensions();
532 double scaling = 1.0e0;
563 answer.
assemble(nodeRows, nodeCols, KeDispLock);
597 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
599 answer.
assemble(trac_rows, disp_cols, contrib);
601 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
607 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
609 answer.
assemble(disp_cols, trac_rows, contribT);
611 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
621 tracUnknowns.
clear();
635 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
637 answer.
assemble(trac_rows, disp_cols, contrib);
639 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
644 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
646 answer.
assemble(disp_cols, trac_rows, contribT);
648 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
655 if (lock) omp_set_lock(
static_cast<omp_lock_t*
>(lock));
657 for (
int i : trac_rows) {
661 if (lock) omp_unset_lock(
static_cast<omp_lock_t*
>(lock));
665void PrescribedGradientBCWeak :: giveLocationArrays(std :: vector< IntArray > &rows, std :: vector< IntArray > &cols,
CharType type,
671void PrescribedGradientBCWeak :: giveTractionLocationArray(
IntArray &rows,
682 el.mFirstNode->giveLocationArray(
giveTracDofIDs(), trac_loc_r, s);
691 for (
size_t tracElInd = 0; tracElInd < mpTractionElements.size(); tracElInd++ ) {
694 const TractionElement &tEl = mpTractionElements [ tracElInd ];
695 for (
int tracNodeInd : tEl.mTractionNodeInd ) {
696 Node *tNode = mpTractionNodes [ tracNodeInd ];
718void PrescribedGradientBCWeak :: compute_x_times_N_1(
FloatMatrix &o_x_times_N)
721 const int dim =
domain->giveNumberOfSpatialDimensions();
730 o_x_times_N.
resize(num_t_eq,3);
738 IntArray rows = {trac_el_ind*2-1,trac_el_ind*2};
740 for (
auto &gp : *el.mIntRule ) {
753 const FloatArray &x = gp->giveGlobalCoordinates();
767 coord_mat.
at(1,1) = tmp.
at(1);
768 coord_mat.
at(2,2) = tmp.
at(2);
778 coord_mat.
at(1,3) = 0.5*tmp.
at(2);
779 coord_mat.
at(2,3) = 0.5*tmp.
at(1);
792 double detJ = 0.5 * el.giveLength();
793 contrib.
times( detJ * gp->giveWeight() );
799 o_x_times_N.
assemble(contrib, rows, cols);
806void PrescribedGradientBCWeak :: compute_x_times_N_2(
FloatMatrix &o_x_times_N)
809 const int dim =
domain->giveNumberOfSpatialDimensions();
818 o_x_times_N.
resize(3, num_t_eq);
826 IntArray cols = {trac_el_ind*2-1,trac_el_ind*2};
828 for (
auto &gp : *el.mIntRule ) {
841 const FloatArray &x = gp->giveGlobalCoordinates();
855 coord_mat.
at(1,1) = tmp.
at(1);
856 coord_mat.
at(2,2) = tmp.
at(2);
864 coord_mat.
at(3,1) = 0.5*tmp.
at(2);
865 coord_mat.
at(3,2) = 0.5*tmp.
at(1);
878 double detJ = 0.5 * el.giveLength();
879 contrib.
times( detJ * gp->giveWeight() );
885 o_x_times_N.
assemble(contrib, rows, cols);
895 double Lx =
mUC[0] -
mLC[0];
896 double Ly =
mUC[1] -
mLC[1];
897 double dSize = Lx*Ly;
900 const int dim =
domain->giveNumberOfSpatialDimensions();
905 for (
auto &gp : *el.mIntRule ) {
915 const FloatArray &x = gp->giveGlobalCoordinates();
919 el.mFirstNode->giveUnknownVector(tracUnknowns,
giveTracDofIDs(), VM_Total, tStep);
931 double detJ = 0.5 * el.giveLength();
932 contrib.
times( detJ * gp->giveWeight() );
934 for (
int m = 0; m < dim; m++ ) {
935 for (
int n = 0; n < dim; n++ ) {
936 stressMatrix(m, n) += contrib(m, n);
946 stressMatrix(0, 0), stressMatrix(1, 1), 0.0, 0.0, 0.0, 0.5*(stressMatrix(0, 1) + stressMatrix(1, 0))
952 sigma.
times(1.0 / dSize);
961 static double tot_time = 0.0;
965 static double assemble_time = 0.0;
966 Timer assemble_timer;
983 std :: unique_ptr< SparseLinearSystemNM > solver(
985 bool symmetric_matrix =
false;
986 SparseMtrxType stype = solver->giveRecommendedMatrix(symmetric_matrix);
988 double Lx =
mUC[0] -
mLC[0];
989 double Ly =
mUC[1] -
mLC[1];
990 double rve_size = Lx*Ly;
994 std :: unique_ptr< SparseMtrx > Kmicro(
classFactory.createSparseMtrx(stype) );
996 OOFEM_ERROR(
"Couldn't create sparse matrix of type %d\n", stype);
1001 if ( rveStatStruct ) {
1015 if ( Kmicro->giveNumberOfColumns() == 0 ) {
1017 Kmicro->buildInternalStructure(rve, this->
domain->giveNumber(), fnum);
1027 assemble_time += assemble_timer.
getUtime();
1028 printf(
"Assembly time for RVE tangent: %e\n", assemble_time);
1036 int neq = Kmicro->giveNumberOfRows();
1039 for (
int i = 1; i <= neq; i++ ) {
1047 std :: unique_ptr< SparseMtrx >
S = Kmicro->giveSubMatrix(loc_u, loc_u);
1049 std :: unique_ptr< SparseMtrx > C = Kmicro->giveSubMatrix(loc_u, loc_t);
1051 C->toFloatMatrix(Cd);
1055 solver->solve(*
S, Cd, m);
1070 std :: unique_ptr< SparseMtrx > Gs(
classFactory.createSparseMtrx(stype) );
1072 OOFEM_ERROR(
"Couldn't create sparse matrix of type %d\n", stype);
1079 Gs->buildInternalStructure(rve, num_eq_G, num_eq_G, loc_G, loc_G);
1080 Gs->assemble(loc_G, loc_G, G);
1082 Gs->assembleBegin();
1088 solver->solve(*Gs, D, p);
1094 Ered.
times(1.0/rve_size);
1112 E.assemble(Ered, indx, indx);
1123void PrescribedGradientBCWeak :: giveTractionElNormal(
size_t iElInd,
FloatArray &oNormal,
FloatArray &oTangent)
const
1132 oTangent [ 1 ], -oTangent [ 0 ]
1136void PrescribedGradientBCWeak :: giveTractionElArcPos(
size_t iElInd,
double &oXiStart,
double &oXiEnd)
const
1146 const double nodeDistTol = 1.0e-15;
1153void PrescribedGradientBCWeak :: giveBoundaries(
IntArray &oBoundaries)
1168void PrescribedGradientBCWeak :: recomputeTractionMesh()
1174void PrescribedGradientBCWeak :: createTractionMesh(
bool iEnforceCornerPeriodicity,
int iNumSides)
1176 bool split_at_holes =
true;
1178 const double l_s =
mUC[0] -
mLC[0];
1179 const double minPointDist = 1.0e-4*l_s;
1182 std::vector<FloatArray> holeCoordUnsorted, allCoordUnsorted;
1186 holeCoordUnsorted.push_back(
Vec2(
mUC[0],
mLC[1]) );
1187 allCoordUnsorted.push_back(
Vec2(
mUC[0],
mLC[1]) );
1189 holeCoordUnsorted.push_back(
Vec2(
mUC[0],
mUC[1]) );
1190 allCoordUnsorted.push_back(
Vec2(
mUC[0],
mUC[1]) );
1192 holeCoordUnsorted.push_back(
Vec2(
mLC[0],
mUC[1]) );
1193 allCoordUnsorted.push_back(
Vec2(
mLC[0],
mUC[1]) );
1209 int pointsPassed = 0;
1210 for (
const auto &x : allCoordUnsorted ) {
1213 holeCoordUnsorted.push_back(x);
1232 std :: vector< TracSegArray > tracElNew0, tracElNew1;
1233 tracElNew0.emplace_back();
1236 for (
size_t i = 1; i < holeCoordUnsorted.size(); i++) {
1242 const FloatArray xC =
Vec2(0.5*(xS[0]+xE[0]), 0.5*(xS[1]+xE[1]));
1245 tracElNew0[0].mInteriorSegments.emplace_back(xS, xE);
1247 tracElNew1[0].mInteriorSegments.emplace_back(xS, xE);
1255 if ( split_at_holes ) {
1265 int numNodes =
domain->giveNumberOfDofManagers();
1266 int totNodesCreated = 0;
1279 for (
auto &el : tracElNew0 ) {
1285 el.mFirstNode = std::make_unique<Node>(numNodes + 1,
domain);
1286 el.mFirstNode->setGlobalNumber(numNodes + 1);
1291 el.mFirstNode->setCoordinates( el.mInteriorSegments[0].giveVertex(1) );
1297 for (
auto &el : tracElNew1 ) {
1303 el.mFirstNode = std::make_unique<Node>(numNodes + 1,
domain);
1304 el.mFirstNode->setGlobalNumber(numNodes + 1);
1309 el.mFirstNode->setCoordinates( el.mInteriorSegments[0].giveVertex(1) );
1316 int numNodes =
domain->giveNumberOfDofManagers();
1331 double maxDist = 1.0e10;
1353 std::move(tracElNew0.begin(), tracElNew0.end(), std::back_inserter(
mpTracElNew));
1354 std::move(tracElNew1.begin(), tracElNew1.end(), std::back_inserter(
mpTracElNew));
1365 const FloatArray &xS = el.mInteriorSegments[0].giveVertex(1);
1366 const double arcPosXS = arcPosFunc.
calcArcPos(xS);
1368 const FloatArray &xE = el.mInteriorSegments.back().giveVertex(2);
1369 const double arcPosXE = arcPosFunc.
calcArcPos(xE);
1371 while (i < allCoordUnsorted.size()) {
1375 const double arcPosX = arcPosFunc.
calcArcPos(x);
1377 if ( arcPosX > (arcPosXS+minPointDist) && arcPosX < (arcPosXE-minPointDist) ) {
1378 el.mInteriorSegmentsPointsFine.push_back(std::move(x));
1381 if ( arcPosX > arcPosXE ) {
1394 for (
auto &line : el.mInteriorSegments ) {
1397 const double arcPosXS = arcPosFunc.
calcArcPos(xS);
1401 const double arcPosXE = arcPosFunc.
calcArcPos(xE);
1403 if ( el.mInteriorSegmentsPointsFine.size() == 0 ) {
1404 Line newLine(xS, xE);
1405 el.mInteriorSegmentsFine.push_back(newLine);
1407 while ( i < el.mInteriorSegmentsPointsFine.size() ) {
1409 const FloatArray &x = el.mInteriorSegmentsPointsFine[i];
1410 const double arcPosX = arcPosFunc.
calcArcPos(x);
1412 if ( arcPosX < arcPosXS ) {
1413 OOFEM_ERROR(
"Error in PrescribedGradientBCWeak :: createTractionMesh.")
1416 if ( arcPosX < arcPosXE ) {
1418 Line newLine(xS, x);
1419 el.mInteriorSegmentsFine.push_back(newLine);
1424 Line newLine(xS, xE);
1425 el.mInteriorSegmentsFine.push_back(newLine);
1430 if ( i == (el.mInteriorSegmentsPointsFine.size()-1) ) {
1432 Line newLine(xS, xE);
1433 el.mInteriorSegmentsFine.push_back(newLine);
1444 el.setupIntegrationRuleOnEl();
1448 std :: vector< FloatArray > discPoints;
1451 discPoints.push_back( el.mInteriorSegments[0].giveVertex(1) );
1452 discPoints.push_back( el.mInteriorSegments.back().giveVertex(2) );
1460void PrescribedGradientBCWeak :: splitSegments(std :: vector< TracSegArray > &ioElArray)
1462 std :: vector< TracSegArray > newArray;
1464 for (
auto &el : ioElArray ) {
1465 for (
auto &line : el.mInteriorSegments ) {
1468 newArray.push_back(std::move(newEl));
1472 ioElArray = std::move(newArray);
1475bool PrescribedGradientBCWeak :: damageExceedsTolerance(
Element *el)
1479 double maxDamage = 0.0, damageTol = 0.01;
1482 el->
giveIPValue(damage, gp, IST_DamageScalar, tStep);
1484 maxDamage = std::max(maxDamage, damage(0));
1489 return maxDamage >= damageTol;
1495 int dim =
domain->giveNumberOfSpatialDimensions();
1519 if ( xfemElInt &&
domain->hasXfemManager() ) {
1538bool PrescribedGradientBCWeak :: pointIsOnGammaPlus(
const FloatArray &iPos)
const
1540 const double distTol = 1.0e-12;
1542 if ( iPos [ 0 ] >
mUC [ 0 ] - distTol ) {
1546 if ( iPos [ 1 ] >
mUC [ 1 ] - distTol ) {
1553void PrescribedGradientBCWeak :: giveMirroredPointOnGammaMinus(
FloatArray &oPosMinus,
const FloatArray &iPosPlus)
const
1557 oPosMinus = iPosPlus;
1558 const double distTol = 1.0e-12;
1565 if ( iPosPlus [ 0 ] >
mUC [ 0 ] - distTol ) {
1566 oPosMinus [ 0 ] =
mLC [ 0 ];
1568 }
else if ( iPosPlus [ 1 ] >
mUC [ 1 ] - distTol ) {
1569 oPosMinus [ 1 ] =
mLC [ 1 ];
1583 const double distTol = 1.0e-12;
1590 double l_s =
mUC[0] -
mLC[0];
1593 double alpha = 0.0, a = 0.0;
1594 if ( fabs(t(0)) > 1.0e-6 && fabs(t(1)) > 1.0e-6 ) {
1595 alpha = atan(t(1)/t(0));
1597 if ( alpha > 45.0*
M_PI/180.0 ) {
1608 if ( alpha > 45.0*
M_PI/180.0 ) {
1612 if ( iPosPlus [ 0 ] >
mUC [ 0 ] - distTol ) {
1614 oPosMinus =
Vec2(0.0, iPosPlus[1]);
1618 if ( iPosPlus [ 1 ] >
mUC [ 1 ] - distTol ) {
1621 if ( iPosPlus[0] < a ) {
1622 oPosMinus =
Vec2(l_s - a + iPosPlus[0], 0.0);
1625 oPosMinus =
Vec2(iPosPlus[0] - a, 0.0);
1635 if ( iPosPlus [ 0 ] >
mUC [ 0 ] - distTol ) {
1637 if ( iPosPlus[1] < a ) {
1638 oPosMinus =
Vec2(0.0, l_s - a + iPosPlus[1]);
1641 oPosMinus =
Vec2(0.0, iPosPlus[1] - a);
1647 if ( iPosPlus [ 1 ] >
mUC [ 1 ] - distTol ) {
1650 oPosMinus =
Vec2(iPosPlus[0], 0.0);
1663void PrescribedGradientBCWeak :: giveMirroredPointOnGammaPlus(
FloatArray &oPosPlus,
const FloatArray &iPosMinus)
const
1668 const double l_box =
mUC(0) -
mLC(0);
1670 oPosPlus = iPosMinus;
1672 const double distTol = l_box*1.0e-10;
1679 if ( iPosMinus [ 0 ] <
mLC [ 0 ] + distTol ) {
1680 oPosPlus [ 0 ] =
mUC [ 0 ];
1682 }
else if ( iPosMinus [ 1 ] <
mLC [ 1 ] + distTol ) {
1683 oPosPlus [ 1 ] =
mUC [ 1 ];
1694 const double distTol = 1.0e-12;
1700 double l_s =
mUC[0] -
mLC[0];
1703 double alpha = 0.0, a = 0.0;
1704 if ( fabs(t(0)) > 1.0e-6 && fabs(t(1)) > 1.0e-6 ) {
1705 alpha = atan(t(1)/t(0));
1707 if ( alpha > 45.0*
M_PI/180.0 ) {
1720 if ( alpha > 45.0*
M_PI/180.0 ) {
1724 if ( iPosMinus [ 0 ] <
mLC [ 0 ] + distTol ) {
1726 oPosPlus =
Vec2(l_s, iPosMinus[1]);
1730 if ( iPosMinus [ 1 ] <
mLC [ 1 ] + distTol ) {
1733 if ( iPosMinus[0] < l_s - a) {
1734 oPosPlus =
Vec2(iPosMinus[0] + a, l_s);
1738 oPosPlus =
Vec2(iPosMinus[0] - (l_s - a), l_s);
1747 if ( iPosMinus [ 0 ] <
mLC [ 0 ] + distTol ) {
1750 if ( iPosMinus[1] < l_s - a ) {
1751 oPosPlus =
Vec2(l_s, iPosMinus[1] + a);
1754 oPosPlus =
Vec2(l_s, iPosMinus[1] - (l_s - a) );
1759 if ( iPosMinus [ 1 ] <
mLC [ 1 ] + distTol ) {
1762 oPosPlus =
Vec2(iPosMinus[0], l_s);
1783 for (
int i = 1; i <= numNodes; i++ ) {
1787 for (
int j = 0; j < nsd; j++ ) {
1788 if ( coord [ j ] < lc [ j ] ) {
1789 lc [ j ] = coord [ j ];
1792 if ( coord [ j ] > uc [ j ] ) {
1793 uc [ j ] = coord [ j ];
1798 oLC = std::move(lc);
1799 oUC = std::move(uc);
1802int PrescribedGradientBCWeak :: giveSideIndex(
const FloatArray &iPos)
const
1804 const double distTol = 1.0e-12;
1806 if ( iPos [ 0 ] >
mUC [ 0 ] - distTol ) {
1810 if ( iPos [ 1 ] >
mUC [ 1 ] - distTol ) {
1814 if ( iPos [ 0 ] <
mLC [ 0 ] + distTol ) {
1818 if ( iPos [ 1 ] <
mLC [ 1 ] + distTol ) {
1827void PrescribedGradientBCWeak :: findHoleCoord(std::vector<FloatArray> &oHoleCoordUnsorted, std::vector<FloatArray> &oAllCoordUnsorted)
1836 std::unordered_map<int,int> map_bnd_node_ind_to_num_occurences;
1837 for (
int pos = 1; pos <= boundaries.
giveSize() / 2; ++pos ) {
1839 int elIndex = boundaries.
at(pos * 2 - 1);
1841 int boundary = boundaries.
at(pos * 2);
1849 auto res = map_bnd_node_ind_to_num_occurences.find(startNodeInd);
1850 if ( res != map_bnd_node_ind_to_num_occurences.end() ) {
1851 map_bnd_node_ind_to_num_occurences[startNodeInd]++;
1853 map_bnd_node_ind_to_num_occurences[startNodeInd] = 1;
1856 res = map_bnd_node_ind_to_num_occurences.find(endNodeInd);
1857 if ( res != map_bnd_node_ind_to_num_occurences.end() ) {
1858 map_bnd_node_ind_to_num_occurences[endNodeInd]++;
1860 map_bnd_node_ind_to_num_occurences[endNodeInd] = 1;
1866 for (
auto it = map_bnd_node_ind_to_num_occurences.begin(); it != map_bnd_node_ind_to_num_occurences.end(); ++it ) {
1868 bool mandatory_to_keep =
false;
1869 if ( it->second == 1 ) {
1870 mandatory_to_keep =
true;
1881 if ( mandatory_to_keep ) {
1882 oHoleCoordUnsorted.push_back(xPlus);
1885 oAllCoordUnsorted.push_back(xPlus);
1890void PrescribedGradientBCWeak :: findCrackBndIntersecCoord(std::vector<FloatArray> &oHoleCoordUnsorted)
1895 for (
int pos = 1; pos <= boundaries.
giveSize() / 2; ++pos ) {
1897 int boundary = boundaries.
at(pos * 2);
1916 if ( xfemElInt &&
domain->hasXfemManager() ) {
1917 std :: vector< Line >segments;
1918 std :: vector< FloatArray >intersecPoints;
1921 for (
auto x : intersecPoints ) {
1924 oHoleCoordUnsorted.push_back(x);
1928 oHoleCoordUnsorted.push_back( std::move(xPlus) );
1939void PrescribedGradientBCWeak :: findPeriodicityCoord(std::vector<FloatArray> &oHoleCoordUnsorted)
1941 const double l_s =
mUC[0] -
mLC[0];
1948 if ( fabs(n(1)) <= fabs(n(0)) ) {
1950 double a = 0.5*l_s*( 1.0 + n(1)/n(0) );
1955 oHoleCoordUnsorted.push_back(std::move(p1Plus));
1958 double c = l_s - 0.5*l_s*( 1.0 + t(1)/t(0) );
1961 oHoleCoordUnsorted.push_back(std::move(p1));
1966 oHoleCoordUnsorted.push_back(std::move(p2Plus));
1972void PrescribedGradientBCWeak :: removeClosePoints(std::vector<FloatArray> &ioCoords,
const double &iAbsTol)
1974 if ( ioCoords.size() == 0 ) {
1978 const double tol2 = iAbsTol*iAbsTol;
1980 std::vector<FloatArray> tmp = { ioCoords[0] };
1983 for (
size_t i = 1; i < ioCoords.size(); i++ ) {
1985 tmp.push_back(ioCoords[i]);
1990 ioCoords = std::move(tmp);
1994void PrescribedGradientBCWeak :: removeSegOverHoles(
TracSegArray &ioTSeg,
const double &iAbsTol)
2000 std :: vector< Line > tmp;
2003 const double tol2 = iAbsTol*iAbsTol;
2006 const auto &xS = l.giveVertex(1);
2007 const auto &xE = l.giveVertex(2);
ActiveBoundaryCondition(int n, Domain *d)
double calcArcPos(const FloatArray &iPos) const
double calcArcPos(const FloatArray &iPos) const
int giveGlobalNumber() const
void giveLocationArray(const IntArray &dofIDArry, IntArray &locationArray, const UnknownNumberingScheme &s) const
const FloatArray & giveCoordinates() const
void giveUnknownVector(FloatArray &answer, const IntArray &dofMask, ValueModeType mode, TimeStep *tStep, bool padding=false)
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
DofManager * giveDofManager(int n)
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
virtual FEInterpolation * giveInterpolation() const
virtual int giveSpatialDimension()
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
virtual int giveNumberOfDofManagers() const
DofManager * giveDofManager(int i) const
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
virtual Element_Geometry_Type giveGeometryType() const =0
virtual void assemble(SparseMtrx &answer, TimeStep *tStep, const MatrixAssembler &ma, const UnknownNumberingScheme &s, Domain *domain)
virtual IntArray boundaryGiveNodes(int boundary, const Element_Geometry_Type) const =0
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
void assemble(const FloatArray &fe, const IntArray &loc)
std::vector< double >::iterator begin()
void resizeWithValues(Index s, std::size_t allocChunk=0)
static FloatArray fromVector(const std::vector< double > &v)
virtual void printYourself() const
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beScaled(double s, const FloatArray &b)
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void beVectorForm(const FloatMatrix &aMatrix)
void add(const FloatArray &src)
std::vector< double >::iterator end()
void resizeWithData(Index, Index)
void resize(Index rows, Index cols)
*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.
void beDyadicProductOf(const FloatArray &vec1, const FloatArray &vec2)
int giveNumberOfRows() const
Returns number of rows of receiver.
void assemble(const FloatMatrix &src, const IntArray &loc)
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.
const FloatArray & giveGlobalCoordinates()
double giveWeight()
Returns integration weight of receiver.
int set
Set number for boundary condition to be applied to.
Function * giveTimeFunction()
virtual void scale(double s)
void followedBy(const IntArray &b, int allocChunk=0)
void enumerate(int maxVal)
bool contains(int value) const
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)
const IntArray mTractionDofIDs
const IntArray & giveTracDofIDs() const
virtual void giveBoundaryCoordVector(FloatArray &oX, const FloatArray &iPos) const =0
void findPeriodicityCoord(std::vector< FloatArray > &oHoleCoordUnsorted)
const IntArray & giveDispLockDofIDs() const
void postInitialize() override
Performs post initialization steps. Called after all components are created and initialized.
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
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.
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).
bool pointIsOnGammaPlus(const FloatArray &iPos) const
bool mDuplicateCornerNodes
int mNumTractionNodesAtIntersections
FloatArray mLC
Lower corner of domain (assuming a rectangular RVE).
int giveSideIndex(const FloatArray &iPos) const
virtual bool boundaryPointIsOnActiveBoundary(const FloatArray &iPos) const =0
std::unique_ptr< Node > mpDisplacementLock
Lock displacements in one node if periodic.
int mTractionInterpOrder
Order of interpolation for traction (0->piecewise constant, 1->piecewise linear).
void giveMirroredPointOnGammaPlus(FloatArray &oPosPlus, const FloatArray &iPosMinus) const
FloatArray mPeriodicityNormal
void computeExtForceElContrib(FloatArray &oContrib, TracSegArray &iEl, int iDim, TimeStep *tStep)
void findHoleCoord(std::vector< FloatArray > &oHoleCoordUnsorted, std::vector< FloatArray > &oAllCoordUnsorted)
FloatMatrix mGradient
Prescribed gradient .
PrescribedGradientHomogenization()
const IntArray & giveBoundaryList()
virtual int assemble(const IntArray &loc, const FloatMatrix &mat)=0
virtual Node * giveNodeClosestToPoint(const FloatArray &coords, double maxDist)=0
virtual Element * giveElementClosestToPoint(FloatArray &lcoords, FloatArray &closest, const FloatArray &coords, int region=0)=0
std ::unique_ptr< SparseMtrx > stiffnessMatrix
double giveTargetTime()
Returns target time.
double getUtime()
Returns total user time elapsed in seconds.
std ::unique_ptr< IntegrationRule > mIntRule
std ::vector< Line > mInteriorSegments
std ::vector< Line > mInteriorSegmentsFine
std ::unique_ptr< Node > mFirstNode
void giveTractionLocationArray(IntArray &rows, CharType type, const UnknownNumberingScheme &s)
void XfemElementInterface_createEnrNmatrixAt(FloatMatrix &oAnswer, const FloatArray &iLocCoord, Element &iEl, bool iSetDiscontContribToZero)
Creates enriched N-matrix.
void partitionEdgeSegment(int iBndIndex, std ::vector< Line > &oSegments, std ::vector< FloatArray > &oIntersectionPoints, const double &iTangDistPadding=0.0)
const IntArray & giveEnrichedDofIDs() const
static FloatArray Vec2(const double &a, const double &b)
static FloatArray Vec6(const double &a, const double &b, const double &c, const double &d, const double &e, const double &f)
ClassFactory & classFactory
double distance_square(const FloatArray &x, const FloatArray &y)
static FloatArray Vec1(const double &a)
#define _IFT_PrescribedGradientBCWeak_PeriodicityNormal
#define _IFT_PrescribedGradientBCWeak_DuplicateCornerNodes
#define _IFT_PrescribedGradientBCWeak_MirrorFunction
#define _IFT_PrescribedGradientBCWeak_TangDistPadding
#define _IFT_PrescribedGradientBCWeak_NumTractionNodeSpacing
#define _IFT_PrescribedGradientBCWeak_TracDofScaling
#define _IFT_PrescribedGradientBCWeak_NumTractionNodesAtIntersections
#define _IFT_PrescribedGradientBCWeak_TractionInterpOrder