Skip to content
Snippets Groups Projects
Select Git revision
  • 0f5f99db9e69d22a8ed7d45787c14dfe3ea8b67d
  • develop default protected
  • feature/variational-hydro
  • origin/stage/bouguettaia
  • feature/gmsh-reader
  • feature/reconstruction
  • save_clemence
  • feature/kinetic-schemes
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • 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
33 results

ResumeUtils.hpp

Blame
  • ResumeUtils.hpp 4.31 KiB
    #ifndef RESUME_UTILS_HPP
    #define RESUME_UTILS_HPP
    
    #include <utils/HighFivePugsUtils.hpp>
    
    #include <language/utils/SymbolTable.hpp>
    #include <mesh/CellType.hpp>
    #include <mesh/ItemArray.hpp>
    #include <mesh/ItemValue.hpp>
    #include <utils/Messenger.hpp>
    
    template <typename DataType>
    PUGS_INLINE Array<DataType>
    readArray(const HighFive::Group& group, const std::string& name)
    {
      auto get_address = [](auto& x) { return (x.size() > 0) ? &(x[0]) : nullptr; };
    
      using data_type = std::remove_const_t<DataType>;
    
      auto dataset = group.getDataSet(name);
    
      std::vector<size_t> size_per_rank = dataset.getAttribute("size_per_rank").read<std::vector<size_t>>();
    
      if (size_per_rank.size() != parallel::size()) {
        throw NormalError("cannot change number of processes");
      }
    
      std::vector<size_t> offset{0, 0ul};
      for (size_t i = 0; i < parallel::rank(); ++i) {
        offset[0] += size_per_rank[i];
      }
      std::vector<size_t> count{size_per_rank[parallel::rank()]};
    
      Array<DataType> array(size_per_rank[parallel::rank()]);
      if constexpr (std::is_same_v<CellType, data_type>) {
        using base_type = std::underlying_type_t<CellType>;
        dataset.select(offset, count).read_raw(reinterpret_cast<base_type*>(get_address(array)));
      } else if constexpr ((std::is_same_v<CellId, data_type>) or (std::is_same_v<FaceId, data_type>) or
                           (std::is_same_v<EdgeId, data_type>) or (std::is_same_v<NodeId, data_type>)) {
        using base_type = typename data_type::base_type;
        dataset.select(offset, count).read_raw(reinterpret_cast<base_type*>(get_address(array)));
      } else {
        dataset.select(offset, count).read_raw(get_address(array));
      }
    
      return array;
    }
    
    template <typename DataType>
    PUGS_INLINE Table<DataType>
    readTable(const HighFive::Group& group, const std::string& name)
    {
      auto get_address = [](auto& t) { return (t.numberOfRows() * t.numberOfColumns() > 0) ? &(t(0, 0)) : nullptr; };
    
      using data_type = std::remove_const_t<DataType>;
    
      auto dataset = group.getDataSet(name);
    
      const size_t number_of_columns = dataset.getAttribute("number_of_columns").read<size_t>();
      const std::vector<size_t> number_of_rows_per_rank =
        dataset.getAttribute("number_of_rows_per_rank").read<std::vector<size_t>>();
    
      std::vector<size_t> offset{0, 0ul};
      for (size_t i = 0; i < parallel::rank(); ++i) {
        offset[0] += number_of_rows_per_rank[i] * number_of_columns;
      }
      std::vector<size_t> count{number_of_rows_per_rank[parallel::rank()]};
    
      Table<DataType> table(number_of_rows_per_rank[parallel::rank()], number_of_columns);
      if constexpr (std::is_same_v<CellType, data_type>) {
        using base_type = std::underlying_type_t<CellType>;
        dataset.select(offset, count).read_raw(reinterpret_cast<base_type*>(get_address(table)));
      } else if constexpr ((std::is_same_v<CellId, data_type>) or (std::is_same_v<FaceId, data_type>) or
                           (std::is_same_v<EdgeId, data_type>) or (std::is_same_v<NodeId, data_type>)) {
        using base_type = typename data_type::base_type;
        dataset.select(offset, count).read_raw<base_type>(reinterpret_cast<base_type*>(get_address(table)));
      } else {
        dataset.select(offset, count).read_raw<data_type>(get_address(table));
      }
    
      return table;
    }
    
    EmbeddedData readDiscreteFunctionVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readIBoundaryConditionDescriptor(const std::string& symbol_name,
                                                  const HighFive::Group& symbol_table_group);
    EmbeddedData readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readIDiscreteFunctionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    EmbeddedData readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
    
    #endif   // RESUME_UTILS_HPP