Skip to content
Snippets Groups Projects
Select Git revision
  • feature/variational-hydro
  • feature/reconstruction
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/composite-scheme
  • stage/seraillec
  • develop default protected
  • hyperplastic
  • feature/local-dt-fsi
  • feature/kinetic-schemes
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • feature/escobar-smoother
  • feature/hypoelasticity-clean
  • feature/hypoelasticity
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
32 results

PartitionerOptions.hpp

Blame
  • PartitionerOptions.hpp 1.99 KiB
    #ifndef PARTITIONER_OPTIONS_HPP
    #define PARTITIONER_OPTIONS_HPP
    
    #include <utils/Exceptions.hpp>
    #include <utils/pugs_config.hpp>
    
    #include <iostream>
    
    enum class PartitionerLibrary : int8_t
    {
      PT__begin = 0,
      //
      parmetis = PT__begin,
      ptscotch,
      //
      PT__end
    };
    
    inline std::string
    name(const PartitionerLibrary library)
    {
      switch (library) {
      case PartitionerLibrary::parmetis: {
        return "ParMETIS";
      }
      case PartitionerLibrary::ptscotch: {
        return "PTScotch";
      }
      case PartitionerLibrary::PT__end: {
      }
      }
      throw UnexpectedError("Linear system library name is not defined!");
    }
    
    template <typename PartitionerEnumType>
    inline PartitionerEnumType
    getPartitionerEnumFromName(const std::string& enum_name)
    {
      using BaseT = std::underlying_type_t<PartitionerEnumType>;
      for (BaseT enum_value = static_cast<BaseT>(PartitionerEnumType::PT__begin);
           enum_value < static_cast<BaseT>(PartitionerEnumType::PT__end); ++enum_value) {
        if (name(PartitionerEnumType{enum_value}) == enum_name) {
          return PartitionerEnumType{enum_value};
        }
      }
      throw NormalError(std::string{"could not find '"} + enum_name + "' associate type!");
    }
    
    class PartitionerOptions
    {
     private:
      PartitionerLibrary m_library = []() {
    #if !defined(PUGS_HAS_PARMETIS) && defined(PUGS_HAS_PTSCOTCH)
        return PartitionerLibrary::ptscotch;
    #else   // sets parmetis as default if no alternative is available
        return PartitionerLibrary::parmetis;
    #endif
      }();
    
     public:
      static PartitionerOptions default_options;
    
      friend std::ostream& operator<<(std::ostream& os, const PartitionerOptions& options);
    
      PartitionerLibrary&
      library()
      {
        return m_library;
      }
    
      PartitionerLibrary
      library() const
      {
        return m_library;
      }
    
      PartitionerOptions(const PartitionerOptions&) = default;
      PartitionerOptions(PartitionerOptions&&)      = default;
    
      PartitionerOptions()  = default;
      ~PartitionerOptions() = default;
    };
    
    inline PartitionerOptions PartitionerOptions::default_options;
    
    #endif   // PARTITIONER_OPTIONS_HPP