Skip to content
Snippets Groups Projects
Commit 95f2c6f0 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add regular Cartesian mesh generation

The mesh is defined by two opposite corners and the number of cells in
each direction.
parent f4bccbcc
No related branches found
No related tags found
1 merge request!37Feature/language
...@@ -397,6 +397,7 @@ target_link_libraries( ...@@ -397,6 +397,7 @@ target_link_libraries(
PugsLanguage PugsLanguage
PugsLanguageAST PugsLanguageAST
PugsLanguageModules PugsLanguageModules
PugsMesh
PugsLanguageUtils PugsLanguageUtils
kokkos kokkos
${PARMETIS_LIBRARIES} ${PARMETIS_LIBRARIES}
......
#include <language/modules/MeshModule.hpp> #include <language/modules/MeshModule.hpp>
#include <algebra/TinyVector.hpp>
#include <language/node_processor/ExecutionPolicy.hpp> #include <language/node_processor/ExecutionPolicy.hpp>
#include <language/utils/BuiltinFunctionEmbedder.hpp> #include <language/utils/BuiltinFunctionEmbedder.hpp>
#include <language/utils/FunctionTable.hpp> #include <language/utils/FunctionTable.hpp>
#include <language/utils/PugsFunctionAdapter.hpp> #include <language/utils/PugsFunctionAdapter.hpp>
#include <language/utils/SymbolTable.hpp> #include <language/utils/SymbolTable.hpp>
#include <language/utils/TypeDescriptor.hpp> #include <language/utils/TypeDescriptor.hpp>
#include <mesh/CartesianMeshBuilder.hpp>
#include <mesh/Connectivity.hpp> #include <mesh/Connectivity.hpp>
#include <mesh/GmshReader.hpp> #include <mesh/GmshReader.hpp>
#include <mesh/Mesh.hpp> #include <mesh/Mesh.hpp>
...@@ -104,6 +106,66 @@ MeshModule::MeshModule() ...@@ -104,6 +106,66 @@ MeshModule::MeshModule()
)); ));
this->_addBuiltinFunction("cartesian1dMesh",
std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>, TinyVector<1>,
TinyVector<1>, std::vector<uint64_t>>>(
std::function<std::shared_ptr<const IMesh>(TinyVector<1>, TinyVector<1>,
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>, TinyVector<2>,
TinyVector<2>, std::vector<uint64_t>>>(
std::function<std::shared_ptr<const IMesh>(TinyVector<2>, TinyVector<2>,
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", this->_addBuiltinFunction("cartesian3dMesh",
std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>, TinyVector<3>, std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>, TinyVector<3>,
TinyVector<3>, std::vector<uint64_t>>>( TinyVector<3>, std::vector<uint64_t>>>(
...@@ -111,14 +173,25 @@ MeshModule::MeshModule() ...@@ -111,14 +173,25 @@ MeshModule::MeshModule()
std::function<std::shared_ptr<const IMesh>(TinyVector<3>, TinyVector<3>, std::function<std::shared_ptr<const IMesh>(TinyVector<3>, TinyVector<3>,
std::vector<uint64_t>)>{ std::vector<uint64_t>)>{
[](const TinyVector<3>& a, const TinyVector<3>& b, [&](const TinyVector<3>& a, const TinyVector<3>& b,
const std::vector<uint64_t>& box_sizes) -> std::shared_ptr<const IMesh> { const std::vector<uint64_t>& box_sizes) -> std::shared_ptr<const IMesh> {
std::cout << a << " -> " << b << " "; constexpr uint64_t dimension = 3;
for (auto i : box_sizes) {
std::cout << i << ' '; if (box_sizes.size() != dimension) {
throw NormalError("expecting " + std::to_string(dimension) +
" dimensions, provided " + std::to_string(box_sizes.size()));
} }
std::cout << '\n';
return nullptr; 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();
}} }}
)); ));
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
add_library( add_library(
PugsMesh PugsMesh
CartesianMeshBuilder.cpp
Connectivity.cpp Connectivity.cpp
ConnectivityComputer.cpp ConnectivityComputer.cpp
ConnectivityDispatcher.cpp ConnectivityDispatcher.cpp
......
This diff is collapsed.
#ifndef CARTESIAN_MESH_BUILDER_HPP
#define CARTESIAN_MESH_BUILDER_HPP
#include <algebra/TinyVector.hpp>
#include <mesh/Mesh.hpp>
#include <mesh/MeshBuilderBase.hpp>
#include <memory>
class CartesianMeshBuilder : public MeshBuilderBase
{
private:
template <size_t Dimension>
void _buildBoundaryNodeList(const TinyVector<Dimension, uint64_t>& cell_size, ConnectivityDescriptor& descriptor);
template <size_t Dimension>
void _buildBoundaryFaceList(const TinyVector<Dimension, uint64_t>& cell_size, ConnectivityDescriptor& descriptor);
template <size_t Dimension>
void _buildCartesianMesh(const TinyVector<Dimension>& a,
const TinyVector<Dimension>& b,
const TinyVector<Dimension, uint64_t>& size);
public:
template <size_t Dimension>
CartesianMeshBuilder(const TinyVector<Dimension>& a,
const TinyVector<Dimension>& b,
const TinyVector<Dimension, uint64_t>& size);
~CartesianMeshBuilder() = default;
};
#endif // CARTESIAN_MESH_BUILDER_HPP
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment