SimiLie
Loading...
Searching...
No Matches
mesher.hpp
1// SPDX-FileCopyrightText: 2024 Baptiste Legouix
2// SPDX-License-Identifier: MIT
3
4#pragma once
5
6#include <ddc/ddc.hpp>
7#include <ddc/kernels/splines.hpp>
8
9namespace sil {
10
11namespace mesher {
12
13namespace detail {
14
15// 1D Mesher
16template <std::size_t D, class CDim>
17class Mesher1D
18{
19public:
20 static constexpr ddc::BoundCond BoundCond = ddc::BoundCond::GREVILLE;
21
22 using bsplines_type = ddc::UniformBSplines<CDim, D>;
23
24private:
25 template <class T>
26 using greville_points_type = ddc::GrevilleInterpolationPoints<T, BoundCond, BoundCond>;
27
28public:
29 using discrete_dimension_type =
30 typename greville_points_type<bsplines_type>::interpolation_discrete_dimension_type;
31
32 template <
33 std::derived_from<discrete_dimension_type> DDim,
34 std::derived_from<bsplines_type> BSplines>
35 constexpr ddc::DiscreteDomain<DDim> mesh(
36 ddc::Coordinate<CDim> lower_boundary,
37 ddc::Coordinate<CDim> upper_boundary,
38 ddc::DiscreteVector<DDim> nb_cells)
39 {
40 ddc::init_discrete_space<BSplines>(lower_boundary, upper_boundary, nb_cells);
41 ddc::init_discrete_space<DDim>(
42 greville_points_type<BSplines>::template get_sampling<DDim>());
43 return greville_points_type<BSplines>::template get_domain<DDim>();
44 }
45};
46
47} // namespace detail
48
49// ND Mesher
50template <std::size_t D, class... CDim>
51class Mesher
52{
53public:
54 static constexpr ddc::BoundCond BoundCond = ddc::BoundCond::GREVILLE;
55
56 template <class T>
57 using bsplines_type = ddc::UniformBSplines<T, D>;
58
59private:
60 template <class T>
61 using greville_points_type = ddc::GrevilleInterpolationPoints<T, BoundCond, BoundCond>;
62
63public:
64 template <class T>
66 typename greville_points_type<typename Mesher<D, CDim...>::template bsplines_type<T>>::
67 interpolation_discrete_dimension_type;
68
69 template <class TypeSeqDDim, class TypeSeqBSplines>
70 constexpr ddc::detail::convert_type_seq_to_discrete_domain_t<TypeSeqDDim> mesh(
71 ddc::Coordinate<CDim...> lower_boundaries,
72 ddc::Coordinate<CDim...> upper_boundaries,
73 ddc::detail::convert_type_seq_to_discrete_domain_t<TypeSeqDDim>::discrete_vector_type
74 nb_cells);
75};
76
77template <std::size_t D, class... CDim>
78template <class TypeSeqDDim, class TypeSeqBSplines>
79constexpr ddc::detail::convert_type_seq_to_discrete_domain_t<TypeSeqDDim> Mesher<D, CDim...>::mesh(
80 ddc::Coordinate<CDim...> lower_boundaries,
81 ddc::Coordinate<CDim...> upper_boundaries,
82 ddc::detail::convert_type_seq_to_discrete_domain_t<TypeSeqDDim>::discrete_vector_type
83 nb_cells)
84{
85 std::tuple<detail::Mesher1D<D, CDim>...> meshers;
86 std::tuple<ddc::DiscreteDomain<ddc::type_seq_element_t<
87 ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>,
88 TypeSeqDDim>>...>
89 meshs;
90
91 ((std ::get<ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>>(meshs)
92 = std ::get<ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>>(meshers)
93 .template mesh<
94 ddc::type_seq_element_t<
95 ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>,
96 TypeSeqDDim>,
97 ddc::type_seq_element_t<
98 ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>,
99 TypeSeqBSplines>>(
100 ddc::select<CDim>(lower_boundaries),
101 ddc::select<CDim>(upper_boundaries),
102 ddc::select<ddc::type_seq_element_t<
103 ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>,
104 TypeSeqDDim>>(nb_cells))),
105 ...);
106
107 return ddc::detail::convert_type_seq_to_discrete_domain_t<TypeSeqDDim>(
108 std::get<ddc::type_seq_rank_v<CDim, ddc::detail::TypeSeq<CDim...>>>(meshs)...);
109}
110
111} // namespace mesher
112
113} // namespace sil
ddc::UniformBSplines< T, D > bsplines_type
Definition mesher.hpp:57
typename greville_points_type< typename Mesher< D, CDim... >::template bsplines_type< T > >:: interpolation_discrete_dimension_type discrete_dimension_type
Definition mesher.hpp:65
static constexpr ddc::BoundCond BoundCond
Definition mesher.hpp:54
constexpr ddc::detail::convert_type_seq_to_discrete_domain_t< TypeSeqDDim > mesh(ddc::Coordinate< CDim... > lower_boundaries, ddc::Coordinate< CDim... > upper_boundaries, ddc::detail::convert_type_seq_to_discrete_domain_t< TypeSeqDDim >::discrete_vector_type nb_cells)
Definition mesher.hpp:79
The top-level namespace of SimiLie.
Definition csr.hpp:14