diff --git a/src/spatial-solving/fixedpointiterator.cc b/src/spatial-solving/fixedpointiterator.cc index e4b62db5b2592eec139acf4171f5a538333a20d4..7b70ca59b11540d794282b136a344d03be313d8c 100644 --- a/src/spatial-solving/fixedpointiterator.cc +++ b/src/spatial-solving/fixedpointiterator.cc @@ -119,8 +119,14 @@ std::ostream &operator<<(std::ostream &stream, template <class Factory, class Updaters, class ErrorNorm> void FixedPointIterator<Factory, Updaters, ErrorNorm>::relativeVelocities(std::vector<Vector>& v_m) const { + // needs assemblers to obtain basis + std::vector<std::shared_ptr<MyAssembler>> assemblers(bodyCount); + using field_type = typename Factory::Matrix::field_type; + + + // adaptation of DualMortarCoupling::setup() const size_t dim = DeformedGrid::dimension; @@ -134,11 +140,11 @@ void FixedPointIterator<Factory, Updaters, ErrorNorm>::relativeVelocities(std::v using DualCache = Dune::Contact::DualBasisAdapter<GridView, field_type>; std::unique_ptr<DualCache> dualCache; dualCache = std::make_unique< Dune::Contact::DualBasisAdapterGlobal<GridView, field_type> >(); -/* + // define FE grid functions - std::vector<BasisGridFunction<> > gridFunctions(nBodyAssembler_.nGrids()); + std::vector<BasisGridFunction<VertexBasis, Vector>* > gridFunctions(v_m.size()); for (size_t i=0; i<gridFunctions.size(); i++) { - + gridFunctions[i] = new BasisGridFunction<MyAssembler::VertexBasis, Vector>(assemblers[i]->vertexBasis, v_m[i]); } const auto& contactCouplings = nBodyAssembler_.getContactCouplings(); @@ -245,63 +251,6 @@ void FixedPointIterator<Factory, Updaters, ErrorNorm>::relativeVelocities(std::v } - /////////////////////////////////// - // reducing nonmortar boundary - ///////////////////////////////// - - // Get all fine grid boundary segments that are totally covered by the grid-glue segments - typedef std::pair<int,int> Pair; - std::map<Pair,ctype> coveredArea, fullArea; - - // initialize with area of boundary faces - for (const auto& bIt : nonmortarBoundary_) { - const Pair p(indexSet0.index(bIt.inside()),bIt.indexInInside()); - fullArea[p] = bIt.geometry().volume(); - coveredArea[p] = 0; - } - - // sum up the remote intersection areas to find out which are totally covered - for (const auto& rIs : intersections(glue)) - coveredArea[Pair(indexSet0.index(rIs.inside()),rIs.indexInInside())] += rIs.geometry().volume(); - - // add all fine grid faces that are totally covered by the contact mapping - for (const auto& bIt : nonmortarBoundary_) { - const auto& inside = bIt.inside(); - if(coveredArea[Pair(indexSet0.index(inside),bIt.indexInInside())]/ - fullArea[Pair(indexSet0.index(inside),bIt.indexInInside())] >= coveredArea_) - boundaryWithMapping.addFace(inside, bIt.indexInInside()); - } - - //writeBoundary(boundaryWithMapping,debugPath_ + "relevantNonmortar"); - - - // \todo replace by all fine grid segments which are totally covered by the RemoteIntersections. - //for (const auto& rIs : intersections(glue)) - // boundaryWithMapping.addFace(rIs.inside(),rIs.indexInInside()); - - printf("contact mapping could be built for %d of %d boundary segments.\n", - boundaryWithMapping.numFaces(), nonmortarBoundary_.numFaces()); - - nonmortarBoundary_ = boundaryWithMapping; - mortarBoundary_.setup(gridView1); - for (const auto& rIs : intersections(glue)) - if (nonmortarBoundary_.contains(rIs.inside(),rIs.indexInInside())) - mortarBoundary_.addFace(rIs.outside(),rIs.indexInOutside()); - - - // Assemble the diagonal matrix coupling the nonmortar side with the lagrange multiplyers there - assembleNonmortarLagrangeMatrix(); - - // The weak obstacle vector - weakObstacle_.resize(nonmortarBoundary_.numVertices()); - weakObstacle_ = 0; - - // /////////////////////////////////////////////////////////// - // Get the occupation structure for the mortar matrix - // /////////////////////////////////////////////////////////// - - // todo Also restrict mortar indices and don't use the whole grid level. - Dune::MatrixIndexSet mortarIndices(nonmortarBoundary_.numVertices(), grid1_->size(dim)); // Create mapping from the global set of block dofs to the ones on the contact boundary std::vector<int> globalToLocal; @@ -340,46 +289,7 @@ void FixedPointIterator<Factory, Updaters, ErrorNorm>::relativeVelocities(std::v } } - mortarIndices.exportIdx(mortarLagrangeMatrix_); - - // Clear it - mortarLagrangeMatrix_ = 0; - - - //cache of local bases - FiniteElementCache1 cache1; - - std::unique_ptr<DualCache> dualCache; - dualCache = std::make_unique< Dune::Contact::DualBasisAdapterGlobal<GridView0, field_type> >(); - - std::vector<Dune::FieldVector<ctype,dim> > avNormals; - avNormals = nonmortarBoundary_.getNormals(); - - - } - - // /////////////////////////////////////// - // Compute M = D^{-1} \hat{M} - // /////////////////////////////////////// - - Dune::BCRSMatrix<MatrixBlock>& M = mortarLagrangeMatrix_; - Dune::BDMatrix<MatrixBlock>& D = nonmortarLagrangeMatrix_; - - // First compute D^{-1} - D.invert(); - - // Then the matrix product D^{-1} \hat{M} - for (auto rowIt = M.begin(); rowIt != M.end(); ++rowIt) { - const auto rowIndex = rowIt.index(); - for (auto& entry : *rowIt) - entry.leftmultiply(D[rowIndex][rowIndex]); - } - - // weakObstacles in transformed basis = D^{-1}*weakObstacle_ - for(size_t rowIdx=0; rowIdx<weakObstacle_.size(); rowIdx++) - weakObstacle_[rowIdx] *= D[rowIdx][rowIdx][0][0]; - gridGlueBackend_->clear(); */ } #include "fixedpointiterator_tmpl.cc"