Skip to content
Snippets Groups Projects
Select Git revision
  • 1ff5fe3964197ab2a99a97ba6c3b3fccfe940e04
  • develop default protected
  • feature/gmsh-reader
  • origin/stage/bouguettaia
  • feature/kinetic-schemes
  • feature/reconstruction
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/variational-hydro
  • 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
  • feature/escobar-smoother
  • 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

MeshModule.cpp

Blame
  • MeshModule.cpp 8.41 KiB
    #include <language/modules/MeshModule.hpp>
    
    #include <algebra/TinyVector.hpp>
    #include <language/node_processor/ExecutionPolicy.hpp>
    #include <language/utils/BuiltinFunctionEmbedder.hpp>
    #include <language/utils/FunctionTable.hpp>
    #include <language/utils/PugsFunctionAdapter.hpp>
    #include <language/utils/SymbolTable.hpp>
    #include <language/utils/TypeDescriptor.hpp>
    #include <mesh/CartesianMeshBuilder.hpp>
    #include <mesh/Connectivity.hpp>
    #include <mesh/DiamondDualMeshManager.hpp>
    #include <mesh/GmshReader.hpp>
    #include <mesh/Mesh.hpp>
    #include <mesh/MeshInterpoler.hpp>
    #include <mesh/MeshTransformer.hpp>
    #include <utils/Exceptions.hpp>
    
    #include <Kokkos_Core.hpp>
    
    MeshModule::MeshModule()
    {
      this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const IMesh>>);
    
      this->_addBuiltinFunction("readGmsh",
                                std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>(const std::string&)>>(
    
                                  [](const std::string& file_name) -> std::shared_ptr<const IMesh> {
                                    GmshReader gmsh_reader(file_name);
                                    return gmsh_reader.mesh();
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("transform",
                                std::make_shared<BuiltinFunctionEmbedder<
                                  std::shared_ptr<const IMesh>(std::shared_ptr<const IMesh>, const FunctionSymbolId&)>>(
    
                                  [](std::shared_ptr<const IMesh> p_mesh,
                                     const FunctionSymbolId& function_id) -> std::shared_ptr<const IMesh> {
                                    return MeshTransformer{}.transform(function_id, p_mesh);
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("interpolate",
                                std::make_shared<BuiltinFunctionEmbedder<
                                  std::shared_ptr<const IMesh>(const std::shared_ptr<const IMesh>&,
                                                               const std::shared_ptr<const IMesh>&, const double&)>>(
    
                                  [](const std::shared_ptr<const IMesh>& source_mesh,
                                     const std::shared_ptr<const IMesh>& destination_mesh,
                                     const double& theta) -> std::shared_ptr<const IMesh> {
                                    return MeshInterpoler{}.interpolate(source_mesh, destination_mesh, theta);
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("cartesian1dMesh",
                                std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<
                                  const IMesh>(const TinyVector<1>, const TinyVector<1>, const std::vector<uint64_t>&)>>(
    
                                  [](const TinyVector<1> a, const TinyVector<1> b,
                                     const std::vector<uint64_t>& box_sizes) -> std::shared_ptr<const IMesh> {
                                    constexpr uint64_t dimension = 1;
    
                                    if (box_sizes.size() != dimension) {
                                      throw NormalError("expecting " + std::to_string(dimension) +
                                                        " dimensions, provided " + std::to_string(box_sizes.size()));
                                    }
    
                                    const TinyVector<dimension, uint64_t> sizes = [&]() {
                                      TinyVector<dimension, uint64_t> s;
                                      for (size_t i = 0; i < dimension; ++i) {
                                        s[i] = box_sizes[i];
                                      }
                                      return s;
                                    }();
    
                                    CartesianMeshBuilder builder{a, b, sizes};
                                    return builder.mesh();
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("cartesian2dMesh",
                                std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<
                                  const IMesh>(const TinyVector<2>, const TinyVector<2>, const std::vector<uint64_t>&)>>(
    
                                  [](const TinyVector<2> a, const TinyVector<2> b,
                                     const std::vector<uint64_t>& box_sizes) -> std::shared_ptr<const IMesh> {
                                    constexpr uint64_t dimension = 2;
    
                                    if (box_sizes.size() != dimension) {
                                      throw NormalError("expecting " + std::to_string(dimension) +
                                                        " dimensions, provided " + std::to_string(box_sizes.size()));
                                    }
    
                                    const TinyVector<dimension, uint64_t> sizes = [&]() {
                                      TinyVector<dimension, uint64_t> s;
                                      for (size_t i = 0; i < dimension; ++i) {
                                        s[i] = box_sizes[i];
                                      }
                                      return s;
                                    }();
    
                                    CartesianMeshBuilder builder{a, b, sizes};
                                    return builder.mesh();
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("cartesian3dMesh",
                                std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<
                                  const IMesh>(const TinyVector<3>&, const TinyVector<3>&, const std::vector<uint64_t>&)>>(
    
                                  [](const TinyVector<3>& a, const TinyVector<3>& b,
                                     const std::vector<uint64_t>& box_sizes) -> std::shared_ptr<const IMesh> {
                                    constexpr uint64_t dimension = 3;
    
                                    if (box_sizes.size() != dimension) {
                                      throw NormalError("expecting " + std::to_string(dimension) +
                                                        " dimensions, provided " + std::to_string(box_sizes.size()));
                                    }
    
                                    const TinyVector<dimension, uint64_t> sizes = [&]() {
                                      TinyVector<dimension, uint64_t> s;
                                      for (size_t i = 0; i < dimension; ++i) {
                                        s[i] = box_sizes[i];
                                      }
                                      return s;
                                    }();
    
                                    CartesianMeshBuilder builder{a, b, sizes};
                                    return builder.mesh();
                                  }
    
                                  ));
    
      this->_addBuiltinFunction("diamondDual",
                                std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>(
                                  const std::shared_ptr<const IMesh>&)>>(
    
                                  [](const std::shared_ptr<const IMesh>& i_mesh) -> std::shared_ptr<const IMesh> {
                                    switch (i_mesh->dimension()) {
                                    case 1: {
                                      using MeshType = Mesh<Connectivity<1>>;
    
                                      std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
                                      return DiamondDualMeshManager::instance().getDiamondDualMesh(p_mesh);
                                    }
                                    case 2: {
                                      using MeshType = Mesh<Connectivity<2>>;
    
                                      std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
                                      return DiamondDualMeshManager::instance().getDiamondDualMesh(p_mesh);
                                    }
                                    case 3: {
                                      using MeshType = Mesh<Connectivity<3>>;
    
                                      std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
                                      return DiamondDualMeshManager::instance().getDiamondDualMesh(p_mesh);
                                    }
                                    default: {
                                      throw UnexpectedError("invalid dimension");
                                    }
                                    }
                                  }
    
                                  ));
    }
    
    void
    MeshModule::registerOperators() const
    {}