Nci3d - #2069
Conversation
Nonconforming container + kernel in 3D
There was a problem hiding this comment.
Pull request overview
This PR extends SPECFEM++’s nonconforming coupling support into 3D by introducing dim3 nonconforming-interface containers (face-based) and updating coupling/accessor plumbing to use chunk-face parallelism and pointwise dim3 interface accessors.
Changes:
- Add a new dim3
assembly::nonconforming_interfacesimplementation (containers + data access) for face-based nonconforming interfaces. - Update nonconforming coupling compute path to support dim3 via
default_chunk_face_configand pointwise coupling handling. - Generalize field loading to support chunk-face indices and adjust a few tag/dispatch and locate-point details for dim3.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| core/specfem/tag_dispatch/is_valid.hpp | Broadens valid dim3 edge/boundary combinations to support new dim3 nonconforming paths. |
| core/specfem/element_coupling/accessor.hpp | Switches dim3 nonconforming coupling terms to a pointwise interface accessor; adds dim3 intersection-factor placeholder type. |
| core/specfem/data_access/accessor.hpp | Introduces EmptyAccessor placeholder accessor used for conditional scratch/data requirements. |
| core/specfem/compute/impl/compute_coupling.tpp | Updates coupling kernels to select edge vs face parallel configs and adds dim3 pointwise nonconforming coupling flow. |
| core/specfem/assembly/nonconforming_interfaces/dim3/nonconforming_interfaces.hpp | New dim3 nonconforming interface container facade and typed storage dispatch. |
| core/specfem/assembly/nonconforming_interfaces/dim3/nonconforming_interfaces.cpp | New dim3 nonconforming interface container construction/initialization. |
| core/specfem/assembly/nonconforming_interfaces/dim3/impl/interface_container.hpp | New dim3 interface-container storage and point-load implementation for face factors/normals/coupled coords. |
| core/specfem/assembly/nonconforming_interfaces/dim3/impl/interface_container.tpp | New host-side initialization logic computing coupled local coordinates and face quadrature factors/normals. |
| core/specfem/assembly/nonconforming_interfaces/dim3/data_access/load.hpp | New dim3 load helpers (load_on_host / load_on_device) for nonconforming interface containers. |
| core/specfem/assembly/nonconforming_interfaces/dim2/nonconforming_interfaces.hpp | Adds forward declaration for nonconforming_interfaces template to support new include organization. |
| core/specfem/assembly/nonconforming_interfaces/dim2/impl/interface_container.hpp | Minor cleanup/forward declarations and formatting tweaks in dim2 nonconforming container impl. |
| core/specfem/assembly/nonconforming_interfaces.hpp | Makes dim3 nonconforming interfaces available via the top-level nonconforming interfaces header. |
| core/specfem/assembly/fields/data_access/load_on_device.hpp | Extends device field loading support to chunk-face index types. |
| core/specfem/assembly/fields/data_access/impl/load_access_functions.hpp | Adds non-SIMD chunk-face load implementation for field accessors. |
| core/specfem/assembly/element_intersections/dim3/element_intersections.cpp | Minor include and formatting updates for dim3 intersections collection. |
| core/specfem/assembly/assembly/dim3/assembly.hpp | Adds dim3 nonconforming_interfaces member to the assembly. |
| core/specfem/assembly/assembly/dim3/assembly.cpp | Initializes dim3 nonconforming_interfaces during assembly construction. |
| core/specfem/algorithms/locate_point/dim3/locate_point_impl.cpp | Fixes dim3 control-node coordinate indexing order for face point-location. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| const auto &nonconforming_interfaces = assembly.nonconforming_interfaces; | ||
| const auto &boundaries = assembly.boundaries; | ||
|
|
| struct coupling_terms_pack< | ||
| DimensionTag, InterfaceTag, BoundaryTag, FluxSchemeTag, NumberElements, | ||
| NQuadIntersection, NQuadElement, std::tuple<KokkosViewArgs...>, | ||
| std::enable_if_t<DimensionTag == specfem::element::dimension_tag::dim3>> { | ||
| using type = specfem::chunk_face::NonconformingAccessorPack< | ||
| specfem::chunk_face::coupled_coordinates< | ||
| DimensionTag, NumberElements, NQuadElement, InterfaceTag, BoundaryTag, | ||
| FluxSchemeTag, KokkosViewArgs...>, | ||
| specfem::chunk_face::intersection_normal< | ||
| DimensionTag, InterfaceTag, BoundaryTag, FluxSchemeTag, | ||
| NumberElements, NQuadElement, KokkosViewArgs...>>; | ||
| using type = specfem::point::nonconforming_interface< |
| struct EmptyAccessor { | ||
|
|
||
| /** | ||
| * @brief Capture any constructor configuration. Should do nothing. | ||
| */ | ||
| template <typename... Args> EmptyAccessor(Args...){}; | ||
| /** | ||
| * @brief Get shared memory size requirement | ||
| * @return Size in bytes needed for scratch memory | ||
| */ | ||
| constexpr static int shmem_size() { return 0; } | ||
| }; |
| #include "specfem/element_coupling/flux_scheme_configuration.hpp" | ||
| #include "specfem/element_coupling/tags.hpp" | ||
| #include "specfem/enums.hpp" | ||
| #include "specfem/execution.hpp" |
| static_assert( | ||
| specfem::data_access::is_nonconforming_interface<PointType>::value, | ||
| "impl_load requires conforming interface point type for PointType"); |
| #pragma once | ||
|
|
||
| #include "interface_container.hpp" | ||
| #include "specfem/algorithms/locate_point.hpp" | ||
| #include "specfem/point/global_coordinates.hpp" | ||
| #include <cmath> |
| const auto &num_faces = self_faces.N; | ||
| const auto &weights = mesh.h_weights; | ||
|
|
| nonconforming_interfaces( | ||
| const int &ngllz, const int &nglly, const int &ngllx, | ||
| const specfem::assembly::element_intersections<dimension_tag> | ||
| &element_intersections, | ||
| const specfem::assembly::jacobian_matrix<dimension_tag> &jacobian_matrix, | ||
| const specfem::assembly::mesh<dimension_tag> &mesh, | ||
| const specfem::element_coupling::flux_scheme_configuration | ||
| &flux_scheme_config = {}); |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## devel #2069 +/- ##
==========================================
- Coverage 62.85% 62.45% -0.41%
==========================================
Files 489 494 +5
Lines 20127 20259 +132
Branches 2615 2634 +19
==========================================
+ Hits 12651 12652 +1
- Misses 6621 6752 +131
Partials 855 855 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Description
Please describe the changes/features in this pull request.
Issue Number
If there is an issue created for these changes, link it here
Checklist
Please make sure to check developer documentation on specfem docs.