Skip to content
Snippets Groups Projects
Forked from agnumpde / dune-tectonic
150 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
levelcontactnetwork.hh 3.73 KiB
#ifndef SRC_DATA_STRUCTURES_LEVELCONTACTNETWORK_HH
#define SRC_DATA_STRUCTURES_LEVELCONTACTNETWORK_HH

#include <dune/common/fvector.hh>
#include <dune/common/bitsetvector.hh>

#include <dune/istl/bvector.hh>

#include <dune/grid-glue/gridglue.hh>
#include <dune/grid-glue/extractors/codim1extractor.hh>
#include <dune/grid-glue/merging/merger.hh>

#include <dune/contact/common/deformedcontinuacomplex.hh>
#include <dune/contact/common/couplingpair.hh>
#include <dune/contact/assemblers/nbodyassembler.hh>
//#include <dune/contact/assemblers/dualmortarcoupling.hh>
#include <dune/contact/projections/normalprojection.hh>

#include <dune/fufem/boundarypatch.hh>

#include "../../assemblers.hh"
#include "../enums.hh"
#include "../matrices.hh"

#include "../body/body.hh"
#include "../body/bodydata.hh"
#include "../friction/frictioncouplingpair.hh"
#include "../friction/globalfriction.hh"
#include "../friction/globalfrictiondata.hh"

template <class GridTypeTEMPLATE, class FrictionCouplingPair, class field_type>
class LevelContactNetwork {
public:
    using GridType = GridTypeTEMPLATE;

    enum {dim = GridType::dimension};
    enum {dimworld = GridType::dimensionworld};

    using ctype = typename GridType::ctype;

    using GridView = typename GridType::LevelGridView;
    using Body = Body<GridView>;

    using Function = Dune::VirtualFunction<double, double>;

    using BoundaryFunctions = std::vector<typename Body::BoundaryFunctions>;
    using BoundaryNodes = std::vector<typename Body::BoundaryNodes>;
    using BoundaryPatchNodes = std::vector<typename Body::BoundaryPatchNodes>;
    using BoundaryPatches = std::vector<typename Body::BoundaryPatches>;
    using BoundaryPatch = BoundaryPatch<GridView>;

    using Extractor = Dune::GridGlue::Codim1Extractor<GridView>;
    using Glue = Dune::GridGlue::GridGlue<Extractor, Extractor>;

public:
    LevelContactNetwork(int nBodies, int nCouplings, int level = 0);

    void setBodies(const std::vector<std::shared_ptr<Body>> bodies);
    void setCouplings(const std::vector<std::shared_ptr<FrictionCouplingPair>> couplings);

    void constructBody(
            const std::shared_ptr<BodyData<dimworld>>& bodyData,
            const std::shared_ptr<GridType>& grid,
            const size_t level,
            std::shared_ptr<Body>& body) const;

    void build(field_type overlap = 1e-2);

    // getter
    void totalNodes(
            const std::string& tag,
            Dune::BitSetVector<dimworld>& totalNodes) const;
    void boundaryPatches(
            const std::string& tag,
            BoundaryPatches& patches) const;
    void boundaryPatchNodes(
            const std::string& tag,
            BoundaryPatchNodes& nodes) const;
    void boundaryNodes(
            const std::string& tag,
            BoundaryNodes& nodes) const;
    void boundaryFunctions(
            const std::string& tag,
            BoundaryFunctions& functions) const;

    auto level() const -> int;

    auto nBodies() const -> size_t;
    auto nCouplings() const -> size_t;

    auto body(int i) const -> const std::shared_ptr<Body>&;

    auto coupling(int i) const -> const std::shared_ptr<FrictionCouplingPair>&;
    auto couplings() const -> const std::vector<std::shared_ptr<FrictionCouplingPair>>&;

    auto glue(int i) const -> const std::shared_ptr<Glue>&;

private:
    void prolong(const BoundaryPatch& coarsePatch, BoundaryPatch& finePatch, const size_t fineLevel);

    const int level_;

    std::vector<std::shared_ptr<Body>> bodies_;
    std::vector<std::shared_ptr<FrictionCouplingPair>> couplings_;

    std::vector<BoundaryPatch> nonmortarPatches_;
    std::vector<BoundaryPatch> mortarPatches_;
    std::shared_ptr< Dune::GridGlue::Merger<field_type, dim-1, dim-1, dim> > gridGlueBackend_;
    std::vector<std::shared_ptr<Glue>> glues_;
};
#endif