Skip to content
Snippets Groups Projects
Commit 3297a45c authored by podlesny's avatar podlesny
Browse files

compute active contact boundary nodes actually in contact;

determined by nonmortarBoundary patch obtained from reducePatches in dualmortarcoupling
parent adde3ee3
No related branches found
No related tags found
No related merge requests found
......@@ -74,6 +74,9 @@ class ZeroNonlinearity
template <class StateVector>
void updateAlpha(const StateVector& alpha) {}
template <class BitVector>
void setActiveNodes(const BitVector& active) {}
};
#endif
......
......@@ -51,13 +51,17 @@ CoupledTimeStepper<Factory, NBodyAssembler, Updaters, ErrorNorms>::step(std::sha
updaters_.state_->setup(tau);
updaters_.rate_->setup(ell, tau, newRelativeTime, velocityRHS, velocityIterate, velocityMatrix);
std::vector<BitVector> nonmortarBoundaries;
getNonmortarBoundaries(nonmortarBoundaries);
updaters_.state_->setActiveNodes(nonmortarBoundaries);
globalFriction_.setActiveNodes(nonmortarBoundaries);
/* std::cout << "tau: " << tau << std::endl;
print(ell, "ell: ");
print(velocityRHS, "velocityRHS: ");
print(velocityIterate, "velocityIterate: ");
for (size_t i=0; i<velocityMatrix.size(); i++) {
print(velocityMatrix[i], "velocityMatrix: ");
}*/
print(velocityIterate, "velocityIterate: "); */
FixedPointIterator fixedPointIterator(
parset_, nBodyAssembler_, ignoreNodes_, globalFriction_, bodywiseNonmortarBoundaries_, errorNorms_);
......@@ -66,4 +70,33 @@ CoupledTimeStepper<Factory, NBodyAssembler, Updaters, ErrorNorms>::step(std::sha
return iterations;
}
template <class Factory, class NBodyAssembler, class Updaters, class ErrorNorms>
void CoupledTimeStepper<Factory, NBodyAssembler, Updaters, ErrorNorms>::getNonmortarBoundaries(std::vector<BitVector>& nonmortarBoundries) {
// init nonmortarBoundries
const auto dim = Vector::block_type::dimension;
auto& grids = nBodyAssembler_.getGrids();
nonmortarBoundries.resize(nBodyAssembler_.nGrids());
for (size_t bodyIdx=0; bodyIdx<nonmortarBoundries.size(); bodyIdx++) {
nonmortarBoundries[bodyIdx].resize(grids[bodyIdx]->size(dim));
nonmortarBoundries[bodyIdx].unsetAll();
}
for (size_t i=0; i<nBodyAssembler_.nCouplings(); i++) {
const auto& contactCoupling = nBodyAssembler_.getContactCouplings()[i]; // dual mortar object holding boundary patches
const auto nonmortarIdx = nBodyAssembler_.getCoupling(i).gridIdx_[0];
const auto& nmBoundaryVertices = *(contactCoupling->nonmortarBoundary().getVertices());
/*const auto& hasObstacle = *(contactCoupling->hasObstacle());
print(hasObstacle, "hasObstacle: ");*/
auto& nmBoundary = nonmortarBoundries[nonmortarIdx];
for (size_t j=0; j<nmBoundaryVertices.size(); j++) {
if (nmBoundaryVertices[j][0]) {
nmBoundary[j][0] = true;
}
}
}
}
#include "coupledtimestepper_tmpl.cc"
......@@ -34,6 +34,9 @@ class CoupledTimeStepper {
template <class LinearSolver>
FixedPointIterationCounter step(std::shared_ptr<LinearSolver>& linearSolver, double relativeTime, double relativeTau);
private:
void getNonmortarBoundaries(std::vector<BitVector>& nonmortarBoundries);
private:
double finalTime_;
Dune::ParameterTree const &parset_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment