Skip to content
Snippets Groups Projects
Select Git revision
  • e4479b29e232d322bf7ac7b24e93608259f73479
  • 2016-PippingKornhuberRosenauOncken default
  • 2022-Strikeslip-Benchmark
  • 2021-GraeserKornhuberPodlesny
  • Dissertation2021 protected
  • separate-deformation
  • AverageCrosspoints
  • old_solver_new_datastructure
  • last_working
  • 2014-Dissertation-Pipping
  • 2013-PippingSanderKornhuber
11 results

assemblers.cc

Blame
  • Forked from agnumpde / dune-tectonic
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    assemblers.cc 4.29 KiB
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    #include <dune/fufem/boundarypatch.hh>
    #include <dune/fufem/functions/constantfunction.hh>
    #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
    #include <dune/fufem/assemblers/boundaryfunctionalassembler.hh>
    
    #include <dune/tectonic/globallaursennonlinearity.hh>
    #include <dune/tectonic/globalruinanonlinearity.hh>
    
    #include "assemblers.hh"
    
    // Assembles Neumann boundary term in f
    template <class GridType, class GridView, class LocalVectorType, class FEBasis>
    void assemble_neumann(GridView const &gridView, FEBasis const &feBasis,
                          Dune::BitSetVector<1> const &neumannNodes,
                          Dune::BlockVector<LocalVectorType> &f,
                          Dune::VirtualFunction<double, double> const &neumann,
                          double time) { // constant sample function on neumann
                                         // boundary
      BoundaryPatch<GridView> const neumannBoundary(gridView, neumannNodes);
      LocalVectorType SampleVector(0);
      neumann.evaluate(time, SampleVector[0]);
      SampleVector[1] = 0;
      ConstantFunction<LocalVectorType, LocalVectorType> const fNeumann(
          SampleVector);
      NeumannBoundaryAssembler<GridType, LocalVectorType> neumannBoundaryAssembler(
          fNeumann);
    
      BoundaryFunctionalAssembler<FEBasis>(feBasis, neumannBoundary).assemble(
          neumannBoundaryAssembler, f, true); // resize and zero output vector
    }
    
    // Assembles constant 1-function on frictional boundary in nodalIntegrals
    template <class GridType, class GridView, class LocalVectorType, class FEBasis>
    Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
    assemble_frictional(GridView const &gridView, FEBasis const &feBasis,
                        Dune::BitSetVector<1> const &frictionalNodes) {
      typedef Dune::FieldVector<double, 1> Singleton;
      BoundaryPatch<GridView> const frictionalBoundary(gridView, frictionalNodes);
      ConstantFunction<LocalVectorType, Singleton> const constantOneFunction(1);
      NeumannBoundaryAssembler<GridType, Singleton> frictionalBoundaryAssembler(
          constantOneFunction);
    
      auto const nodalIntegrals = Dune::make_shared<Dune::BlockVector<Singleton>>();
      BoundaryFunctionalAssembler<FEBasis>(feBasis, frictionalBoundary)
          .assemble(frictionalBoundaryAssembler, *nodalIntegrals,
                    true); // resize and zero output vector
      return nodalIntegrals;
    }
    
    template <class VectorType, class MatrixType>
    Dune::shared_ptr<Dune::GlobalNonlinearity<VectorType, MatrixType> const>
    assemble_nonlinearity(
        int size, Dune::ParameterTree const &parset,
        Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
            nodalIntegrals,
        Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>> state,
        double h) {
      typedef Dune::BlockVector<Dune::FieldVector<double, 1>> SingletonVectorType;
      // {{{ Assemble terms for the nonlinearity
      auto mu = Dune::make_shared<SingletonVectorType>(size);
      *mu = parset.get<double>("boundary.friction.mu");
    
      auto normalStress = Dune::make_shared<SingletonVectorType>(size);
      *normalStress = parset.get<double>("boundary.friction.normalstress");
    
      std::string const friction_model =
          parset.get<std::string>("boundary.friction.model");
      if (friction_model == std::string("Ruina")) {
        auto a = Dune::make_shared<SingletonVectorType>(size);
        *a = parset.get<double>("boundary.friction.ruina.a");
    
        auto eta = Dune::make_shared<SingletonVectorType>(size);
        *eta = parset.get<double>("boundary.friction.eta");
    
        auto b = Dune::make_shared<SingletonVectorType>(size);
        *b = parset.get<double>("boundary.friction.ruina.b");
    
        auto L = Dune::make_shared<SingletonVectorType>(size);
        *L = parset.get<double>("boundary.friction.ruina.L");
    
        return Dune::make_shared<
            Dune::GlobalRuinaNonlinearity<VectorType, MatrixType> const>(
            nodalIntegrals, a, mu, eta, normalStress, b, state, L, h);
      } else if (friction_model == std::string("Laursen")) {
        return
            // TODO: take state and h into account
            Dune::make_shared<
                Dune::GlobalLaursenNonlinearity<Dune::LinearFunction, VectorType,
                                                MatrixType> const>(mu, normalStress,
                                                                   nodalIntegrals);
      } else {
        assert(false);
      }
    }
    
    #include "assemblers_tmpl.cc"