Skip to content

Commit ef7bf27

Browse files
Merge pull request #1610 from int-ptr-ptr/flux-scheme-macro
Flux Scheme Macros
2 parents 64e69fe + 6b4d70a commit ef7bf27

File tree

5 files changed

+114
-5
lines changed

5 files changed

+114
-5
lines changed

core/specfem/kokkos_kernels/domain_kernels.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,17 @@ class domain_kernels {
7878
(DIMENSION_TAG(DIM2), CONNECTION_TAG(WEAKLY_CONFORMING, NONCONFORMING),
7979
INTERFACE_TAG(ELASTIC_ACOUSTIC, ACOUSTIC_ELASTIC),
8080
BOUNDARY_TAG(NONE, ACOUSTIC_FREE_SURFACE, STACEY,
81-
COMPOSITE_STACEY_DIRICHLET)),
81+
COMPOSITE_STACEY_DIRICHLET),
82+
FLUX_SCHEME_TAG(NATURAL)),
8283
{
8384
constexpr auto self_medium =
8485
specfem::interface::attributes<_dimension_tag_,
8586
_interface_tag_>::self_medium();
8687
if constexpr (dimension_tag == _dimension_tag_ &&
8788
self_medium == medium) {
88-
impl::compute_coupling<
89-
_dimension_tag_, _connection_tag_, wavefield, ngll, ngll,
90-
_interface_tag_, _boundary_tag_,
91-
specfem::interface::flux_scheme_tag::natural>(assembly);
89+
impl::compute_coupling<_dimension_tag_, _connection_tag_, wavefield,
90+
ngll, ngll, _interface_tag_, _boundary_tag_,
91+
_flux_scheme_tag_>(assembly);
9292
// second ngll is the number of quadrature points on the mortar.
9393
}
9494
})

core/specfem/macros/enum_tags.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,12 @@
5454
*/
5555
#define _ENUM_ID_INTERFACE_TAG 5
5656

57+
/**
58+
* @brief ID for flux scheme tags
59+
*
60+
* Used to identify flux scheme tags in interface definitions.
61+
* See @ref interface_iterator_macros.
62+
*/
63+
#define _ENUM_ID_FLUX_SCHEME_TAG 6
64+
5765
/** @} */ // end of material_iterator_enum_tags

core/specfem/macros/interface_iterators.hpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,26 @@
6464
_ENUM_ID_INTERFACE_TAG)
6565
/** @} */
6666

67+
/**
68+
* @defgroup flux_scheme_tag_macros Flux Scheme Tag Macros
69+
* @brief Macros for flux schemes.
70+
* @{
71+
*/
72+
/**
73+
* @brief Natural flux scheme tag
74+
*/
75+
#define FLUX_SCHEME_TAG_NATURAL \
76+
(0, specfem::interface::flux_scheme_tag::natural, natural, \
77+
_ENUM_ID_FLUX_SCHEME_TAG)
78+
79+
/**
80+
* @brief Symmetric interior penalty flux scheme tag
81+
*/
82+
#define FLUX_SCHEME_TAG_SYMMETRIC_INTERIOR_PENALTY \
83+
(1, specfem::interface::flux_scheme_tag::symmetric_interior_penalty, \
84+
symmetric_interior_penalty, _ENUM_ID_FLUX_SCHEME_TAG)
85+
/** @} */
86+
6787
/// \cond
6888
#define _MAKE_INTERFACE_TUPLE(r, product) BOOST_PP_SEQ_TO_TUPLE(product)
6989

@@ -84,12 +104,20 @@
84104
BOOST_PP_SEQ_TRANSFORM(_TRANSFORM_TAGS, CONNECTION_TAG_, \
85105
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
86106

107+
/**
108+
* @brief Converts flux scheme tag arguments to a sequence of tag tuples
109+
*/
110+
#define FLUX_SCHEME_TAG(...) \
111+
BOOST_PP_SEQ_TRANSFORM(_TRANSFORM_TAGS, FLUX_SCHEME_TAG_, \
112+
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
113+
87114
/**
88115
* @brief Tag getters. The macros are intended to be used only in @ref DECLARE
89116
* and @ref INSTANTIATE.
90117
*/
91118
#define _CONNECTION_TAG_ BOOST_PP_SEQ_TO_LIST((1))
92119
#define _INTERFACE_TAG_ BOOST_PP_SEQ_TO_LIST((2))
120+
#define _FLUX_SCHEME_TAG_ BOOST_PP_SEQ_TO_LIST((4))
93121

94122
/**
95123
* @brief List of interface systems
@@ -131,5 +159,46 @@
131159
INTERFACE_TAG_ACOUSTIC_ELASTIC, \
132160
BOUNDARY_TAG_COMPOSITE_STACEY_DIRICHLET))
133161

162+
/**
163+
* @brief List of edges with interfaces and flux scheme tag
164+
*/
165+
#define EDGES_AND_FLUX_SCHEME \
166+
((DIMENSION_TAG_DIM2, CONNECTION_TAG_WEAKLY_CONFORMING, \
167+
INTERFACE_TAG_ELASTIC_ACOUSTIC, BOUNDARY_TAG_NONE, \
168+
FLUX_SCHEME_TAG_NATURAL))((DIMENSION_TAG_DIM2, \
169+
CONNECTION_TAG_WEAKLY_CONFORMING, \
170+
INTERFACE_TAG_ELASTIC_ACOUSTIC, \
171+
BOUNDARY_TAG_STACEY, FLUX_SCHEME_TAG_NATURAL))( \
172+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_WEAKLY_CONFORMING, \
173+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_NONE, \
174+
FLUX_SCHEME_TAG_NATURAL))( \
175+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_WEAKLY_CONFORMING, \
176+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_STACEY, \
177+
FLUX_SCHEME_TAG_NATURAL))( \
178+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_WEAKLY_CONFORMING, \
179+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_ACOUSTIC_FREE_SURFACE, \
180+
FLUX_SCHEME_TAG_NATURAL))( \
181+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_WEAKLY_CONFORMING, \
182+
INTERFACE_TAG_ACOUSTIC_ELASTIC, \
183+
BOUNDARY_TAG_COMPOSITE_STACEY_DIRICHLET, FLUX_SCHEME_TAG_NATURAL))( \
184+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
185+
INTERFACE_TAG_ELASTIC_ACOUSTIC, BOUNDARY_TAG_NONE, \
186+
FLUX_SCHEME_TAG_NATURAL))( \
187+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
188+
INTERFACE_TAG_ELASTIC_ACOUSTIC, BOUNDARY_TAG_STACEY, \
189+
FLUX_SCHEME_TAG_NATURAL))( \
190+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
191+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_NONE, \
192+
FLUX_SCHEME_TAG_NATURAL))( \
193+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
194+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_STACEY, \
195+
FLUX_SCHEME_TAG_NATURAL))( \
196+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
197+
INTERFACE_TAG_ACOUSTIC_ELASTIC, BOUNDARY_TAG_ACOUSTIC_FREE_SURFACE, \
198+
FLUX_SCHEME_TAG_NATURAL))( \
199+
(DIMENSION_TAG_DIM2, CONNECTION_TAG_NONCONFORMING, \
200+
INTERFACE_TAG_ACOUSTIC_ELASTIC, \
201+
BOUNDARY_TAG_COMPOSITE_STACEY_DIRICHLET, FLUX_SCHEME_TAG_NATURAL))
202+
134203
/// \endcond
135204
/** @} */

core/specfem/macros/macros_impl/array.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
_GET_TAG(BOOST_PP_TUPLE_ELEM(1, elem)), \
2828
_GET_TAG(BOOST_PP_TUPLE_ELEM(2, elem)), \
2929
_GET_TAG(BOOST_PP_TUPLE_ELEM(3, elem)))
30+
#define _MAKE_ARRAY_5(elem) \
31+
std::make_tuple(_GET_TAG(BOOST_PP_TUPLE_ELEM(0, elem)), \
32+
_GET_TAG(BOOST_PP_TUPLE_ELEM(1, elem)), \
33+
_GET_TAG(BOOST_PP_TUPLE_ELEM(2, elem)), \
34+
_GET_TAG(BOOST_PP_TUPLE_ELEM(3, elem)), \
35+
_GET_TAG(BOOST_PP_TUPLE_ELEM(4, elem)))
3036

3137
/**
3238
* @brief Macro to create a constexpr array from a sequence

core/specfem/macros/macros_impl/utils.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
#define _SEQ_FOR_TAGS_4 ELEMENT_TYPES EDGES
4444

45+
#define _SEQ_FOR_TAGS_5 EDGES_AND_FLUX_SCHEME
46+
4547
/**
4648
* @brief Declare a variable or instantiante a template based on the type
4749
* declaration tuple.
@@ -165,6 +167,7 @@
165167
#define _WRITE_TAGS_2(data) _WRITE_TAGS_1(data) _WRITE_TAG(_medium_tag_, data, 1) _WRITE_TAG(_connection_tag_, data, 1)
166168
#define _WRITE_TAGS_3(data) _WRITE_TAGS_2(data) _WRITE_TAG(_property_tag_, data, 2) _WRITE_TAG(_interface_tag_, data, 2)
167169
#define _WRITE_TAGS_4(data) _WRITE_TAGS_3(data) _WRITE_TAG(_boundary_tag_, data, 3)
170+
#define _WRITE_TAGS_5(data) _WRITE_TAGS_4(data) _WRITE_TAG(_flux_scheme_tag_, data, 4)
168171
// clang-format on
169172

170173
/**
@@ -256,6 +259,29 @@
256259
0), \
257260
0)
258261

262+
#define _TYPE_MATCH_5(elem, seq) \
263+
BOOST_PP_IF( \
264+
BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(seq), 5), \
265+
BOOST_PP_IF( \
266+
_TAG_IN_SEQ(BOOST_PP_TUPLE_ELEM(0, elem), \
267+
BOOST_PP_TUPLE_ELEM(0, seq)), \
268+
BOOST_PP_IF( \
269+
_TAG_IN_SEQ(BOOST_PP_TUPLE_ELEM(1, elem), \
270+
BOOST_PP_TUPLE_ELEM(1, seq)), \
271+
BOOST_PP_IF( \
272+
_TAG_IN_SEQ(BOOST_PP_TUPLE_ELEM(2, elem), \
273+
BOOST_PP_TUPLE_ELEM(2, seq)), \
274+
BOOST_PP_IF( \
275+
_TAG_IN_SEQ(BOOST_PP_TUPLE_ELEM(3, elem), \
276+
BOOST_PP_TUPLE_ELEM(3, seq)), \
277+
BOOST_PP_IF(_TAG_IN_SEQ(BOOST_PP_TUPLE_ELEM(4, elem), \
278+
BOOST_PP_TUPLE_ELEM(4, seq)), \
279+
1, 0), \
280+
0), \
281+
0), \
282+
0), \
283+
0), \
284+
0)
259285
/**
260286
* @brief Check if a given tag sequence is in the list of available tag
261287
* sequences.

0 commit comments

Comments
 (0)