Skip to content
Snippets Groups Projects
Select Git revision
  • 9c9e78c58385ddbb20f1013c20e37693b96c63be
  • master default
  • feature/update-ci
  • bugfix/test-memory-leak
  • releases/2.9
  • feature/thread-parallel-assembler
  • feature/exploit-tensor-quadrature
  • releases/2.8
  • work-matrixindexset
  • tobias-patches-membrane
  • releases/2.7
  • bugfix/any_hh-use_std_remove_const
  • tobias-patches
  • feature/handout-wrapped-functionsbasis
  • introduce-periodic-basis
  • test/use-default-ci-setup
  • feature/powerBasis
  • move-makefunction-to-namespace-dune-fufem
  • missing-include
  • releases/2.6-1
  • bugfix/matrix-size-in-dune-functions-assembler
  • subversion->git
22 results

dunefunctionsboundaryfunctionalassembler.hh

Blame
  • Lasse Hinrichsen's avatar
    lh1887 authored
    They were merged in upstream dune-functions and using the index sets is now deprecated.
    9c9e78c5
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    dunefunctionsboundaryfunctionalassembler.hh 2.47 KiB
    // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    // vi: set et ts=4 sw=2 sts=2:
    #ifndef DUNE_FUFEM_ASSEMBERS_DUNEFUNCTIONSBOUNDARYFUNCTIONALASSEMBLER_HH
    #define DUNE_FUFEM_ASSEMBERS_DUNEFUNCTIONSBOUNDARYFUNCTIONALASSEMBLER_HH
    
    #include <dune/istl/matrix.hh>
    #include <dune/istl/matrixindexset.hh>
    
    #include <dune/matrix-vector/axpy.hh>
    
    #include "dune/fufem/functionspacebases/functionspacebasis.hh"
    #include "dune/fufem/boundarypatch.hh"
    
    
    namespace Dune {
    namespace Fufem {
    
    
    //! Generic global assembler for functionals on a boundary
    template <class TrialBasis>
    class DuneFunctionsBoundaryFunctionalAssembler
    {
      using GridView = typename TrialBasis::GridView;
    
    public:
      //! create assembler for grid
      DuneFunctionsBoundaryFunctionalAssembler(const TrialBasis& tBasis, const BoundaryPatch<GridView>& boundaryPatch) :
          trialBasis_(tBasis),
          boundaryPatch_(boundaryPatch)
      {}
    
    
    
      template <class VectorBackend, class LocalAssembler>
      void assembleBulkEntries(VectorBackend&& vectorBackend, LocalAssembler&& localAssembler) const
      {
        auto trialLocalView     = trialBasis_.localView();
    
        using Field = std::decay_t<decltype(vectorBackend(trialLocalView.index(0)))>;
        using LocalVector = Dune::BlockVector<Dune::FieldVector<Field,1>>;
    
        auto localVector = LocalVector(trialLocalView.maxSize());
    
        // iterate over boundary
        for (auto it =boundaryPatch_.begin(); it!= boundaryPatch_.end(); ++it)
        {
          const auto& element = it->inside();
          trialLocalView.bind(element);
    
          localAssembler(it, localVector, trialLocalView);
    
          for (size_t localRow=0; localRow<trialLocalView.size(); ++localRow)
          {
            auto row = trialLocalView.index(localRow);
            vectorBackend(row) += localVector[localRow];
          }
        }
      }
    
      template <class VectorBackend, class LocalAssembler>
      void assembleBulk(VectorBackend&& vectorBackend, LocalAssembler&& localAssembler) const
      {
        vectorBackend.resize(trialBasis_);
        vectorBackend.vector() = 0.0;
        assembleBulkEntries(vectorBackend, std::forward<LocalAssembler>(localAssembler));
      }
    
    
    protected:
      const TrialBasis& trialBasis_;
      const BoundaryPatch<GridView>& boundaryPatch_;
    };
    
    
    /**
     * \brief Create DuneFunctionsBoundaryFunctionalAssembler
     */
    template <class TrialBasis, class BP>
    auto duneFunctionsBoundaryFunctionalAssembler(const TrialBasis& trialBasis, const BP& bp)
    {
      return DuneFunctionsBoundaryFunctionalAssembler<TrialBasis>(trialBasis, bp);
    }
    
    
    
    } // namespace Fufem
    } // namespace Dune
    
    
    #endif