Skip to content
Snippets Groups Projects
assemblers.hh 3.77 KiB
Newer Older
#ifndef SRC_ASSEMBLERS_HH
#define SRC_ASSEMBLERS_HH

#include <dune/common/bitsetvector.hh>
#include <dune/common/function.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/bvector.hh>

#include <dune/fufem/assemblers/assembler.hh>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wsign-compare"
#include <dune/fufem/functionspacebases/p0basis.hh>
#pragma clang diagnostic pop
#include <dune/fufem/functionspacebases/p1nodalbasis.hh>
podlesny's avatar
.  
podlesny committed
#include <dune/fufem/boundarypatch.hh>
#include <dune/tectonic/globalfriction.hh>
#include <dune/tectonic/globalfrictiondata.hh>
podlesny's avatar
podlesny committed
#include "data-structures/enums.hh"
podlesny's avatar
.  
podlesny committed
template <class GridView, int dimension>
class MyAssembler {
podlesny's avatar
.  
podlesny committed
    using ScalarMatrix = Dune::BCRSMatrix<Dune::FieldMatrix<double, 1, 1>>;
    using Matrix =
      Dune::BCRSMatrix<Dune::FieldMatrix<double, dimension, dimension>>;
podlesny's avatar
.  
podlesny committed
    using ScalarVector = Dune::BlockVector<Dune::FieldVector<double, 1>>;
    using Vector = Dune::BlockVector<Dune::FieldVector<double, dimension>>;
podlesny's avatar
.  
podlesny committed
    using CellBasis = P0Basis<GridView, double>;
    using VertexBasis = P1NodalBasis<GridView, double>;
podlesny's avatar
.  
podlesny committed
    CellBasis const cellBasis;
    VertexBasis const vertexBasis;
    GridView const &gridView;
podlesny's avatar
.  
podlesny committed
    using Grid = typename GridView::Grid;
    using LocalVector = typename Vector::block_type;
    using LocalScalarVector = typename ScalarVector::block_type;
podlesny's avatar
.  
podlesny committed
    using LocalCellBasis = typename CellBasis::LocalFiniteElement;
    using LocalVertexBasis = typename VertexBasis::LocalFiniteElement;
podlesny's avatar
.  
podlesny committed
    Assembler<CellBasis, CellBasis> cellAssembler;
    Assembler<VertexBasis, VertexBasis> vertexAssembler;
podlesny's avatar
.  
podlesny committed
    MyAssembler(GridView const &gridView);

podlesny's avatar
.  
podlesny committed
    template <class LocalBoundaryFunctionalAssemblerType, class GlobalVectorType>
    void assembleBoundaryFunctional(LocalBoundaryFunctionalAssemblerType& localAssembler,
                                    GlobalVectorType& b,
                                    const BoundaryPatch<GridView>& boundaryPatch,
                                    bool initializeVector=true) const;

podlesny's avatar
.  
podlesny committed
    void assembleFrictionalBoundaryMass(
            BoundaryPatch<GridView> const &frictionalBoundary,
            ScalarMatrix &frictionalBoundaryMass) const;

    void assembleMass(
            Dune::VirtualFunction<
            LocalVector, LocalScalarVector> const &densityFunction,
            Matrix &M) const;

    void assembleElasticity(
            double E,
            double nu,
            Matrix &A) const;

    void assembleViscosity(
            Dune::VirtualFunction<LocalVector, LocalScalarVector> const & shearViscosity,
            Dune::VirtualFunction<LocalVector, LocalScalarVector> const & bulkViscosity,
            Matrix &C) const;

    void assembleBodyForce(
            Dune::VirtualFunction<LocalVector, LocalVector> const &gravityField,
            Vector &f) const;

    void assembleNeumann(
            BoundaryPatch<GridView> const &neumannBoundary,
            Vector &f,
            Dune::VirtualFunction<double, double> const &neumann,
            double relativeTime) const;

    void assembleWeightedNormalStress(
            BoundaryPatch<GridView> const &frictionalBoundary,
            ScalarVector &weightedNormalStress,
            double youngModulus,
            double poissonRatio,
            Vector const &displacement) const;

    auto assembleFrictionNonlinearity(
            Config::FrictionModel frictionModel,
            BoundaryPatch<GridView> const &frictionalBoundary,
            GlobalFrictionData<dimension> const &frictionInfo,
            ScalarVector const &weightedNormalStress) const
    -> std::shared_ptr<GlobalFriction<Matrix, Vector>>;

    void assembleVonMisesStress(
            double youngModulus,
            double poissonRatio,
            Vector const &u,
            ScalarVector &stress) const;