#ifndef ASSEMBLERS_HH
#define ASSEMBLERS_HH

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

#include <dune/fufem/assemblers/assembler.hh>

#include <dune/tectonic/globalnonlinearity.hh>

template <class GridView, class LocalVectorType, class AssemblerType>
void assemble_neumann(GridView const &gridView, AssemblerType const &assembler,
                      Dune::BitSetVector<1> const &neumannNodes,
                      Dune::BlockVector<LocalVectorType> &f,
                      Dune::VirtualFunction<double, double> const &neumann,
                      double time);

template <class GridView, class LocalVectorType, class AssemblerType>
Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
assemble_frictional(GridView const &gridView, AssemblerType const &assembler,
                    Dune::BitSetVector<1> const &frictionalNodes);

template <class MatrixType, class VectorType>
Dune::shared_ptr<Dune::GlobalNonlinearity<MatrixType, VectorType>>
assemble_nonlinearity(
    Dune::BitSetVector<1> const &frictionalNodes,
    Dune::BlockVector<Dune::FieldVector<double, 1>> const &nodalIntegrals,
    FrictionData const &fd);
#endif