15#define DOCTEST_CONFIG_IMPLEMENT
27int main(
int argc,
char **argv)
29 MPI_Init(&argc, &argv);
31 ctx.applyCommandLine(argc, argv);
50static std::vector<DNDS::index> pullFirstNFromOthers(
55 std::vector<DNDS::index> idx;
62 idx.push_back(base + i);
79 a(i, j) = mpi.rank * 1000.0 + i * 10.0 + j;
83 SUBCASE(
"globalSize is consistent")
86 CHECK(gs == 10 * mpi.size);
89 SUBCASE(
"AssertConsistent does not throw")
94 SUBCASE(
"local data unchanged after mapping")
98 CHECK(a(i, j) == doctest::Approx(mpi.rank * 1000.0 + i * 10.0 + j));
109 auto father = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
113 father->createGlobalMapping();
120 auto son = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
123 trans.createFatherGlobalMapping();
124 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, 5);
125 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
126 trans.createMPITypes();
148TEST_CASE(
"ArrayTransformer pull - TABLE_Fixed (DynamicSize)")
154 auto father = std::make_shared<ParArray<DNDS::real, DynamicSize>>(mpi);
161 (*
father)(i, j) = (
gOff + i) * 0.1 + j * 0.001;
168 auto son = std::make_shared<ParArray<DNDS::real, DynamicSize>>(mpi);
195 auto father = std::make_shared<ParArray<DNDS::real, NonUniformSize, NonUniformSize>>(mpi);
201 father->createGlobalMapping();
208 auto son = std::make_shared<ParArray<DNDS::real, NonUniformSize, NonUniformSize>>(mpi);
211 trans.createFatherGlobalMapping();
212 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, 3);
213 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
214 trans.createMPITypes();
226 bool found =
trans.pLGlobalMapping->search(ghostGlobal, srcRank, srcLoc);
230 CHECK(
son->RowSize(g) == expectedRowSize);
233 CHECK((*
son)(g, j) == doctest::Approx(ghostGlobal * 100.0 + j));
241 using Arr9 = std::array<DNDS::real, 9>;
244 auto father = std::make_shared<ParArray<Arr9, DynamicSize>>(mpi);
247 father->createGlobalMapping();
252 for (
int k = 0; k < 9; k++)
254 (*father)(i, 0) = val;
257 auto son = std::make_shared<ParArray<Arr9, DynamicSize>>(mpi);
260 trans.createFatherGlobalMapping();
263 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, 4);
264 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
265 trans.createMPITypes();
273 Arr9 got = (*son)(g, 0);
274 for (
int k = 0; k < 9; k++)
289 auto father = std::make_shared<ParArray<DNDS::real, DynamicSize>>(mpi);
292 father->createGlobalMapping();
299 (*
father)(i, j) = (
gOff + i) + j * 0.01 + offset;
304 auto son = std::make_shared<ParArray<DNDS::real, DynamicSize>>(mpi);
307 trans.createFatherGlobalMapping();
309 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, 5);
310 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
311 trans.createMPITypes();
314 trans.initPersistentPull();
315 trans.startPersistentPull();
316 trans.waitPersistentPull();
324 CHECK((*
son)(g, j) == doctest::Approx(ghostGlobal + j * 0.01 + 0.0));
329 trans.startPersistentPull();
330 trans.waitPersistentPull();
336 CHECK((*
son)(g, j) == doctest::Approx(ghostGlobal + j * 0.01 + 1000.0));
339 trans.clearPersistentPull();
350 auto father1 = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
353 father1->createGlobalMapping();
357 (*father1)(i, j) = (
gOff + i) * 10.0 + j;
359 auto son1 = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
362 trans1.createFatherGlobalMapping();
364 auto pullIdx = pullFirstNFromOthers(mpi, *trans1.pLGlobalMapping, 8);
365 trans1.createGhostMapping(std::vector<DNDS::index>(pullIdx));
366 trans1.createMPITypes();
370 auto father2 = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
372 father2->createGlobalMapping();
375 (*father2)(i, j) = (
gOff + i) * -1.0 + j * 0.5;
377 auto son2 = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
380 trans2.BorrowGGIndexing(trans1);
381 trans2.createMPITypes();
384 CHECK(son2->Size() == son1->Size());
388 DNDS::index ghostGlobal = trans2.pLGhostMapping->ghostIndex[g];
390 CHECK((*son2)(g, j) == doctest::Approx(ghostGlobal * -1.0 + j * 0.5));
402 auto father = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
408 father->createGlobalMapping();
411 auto son = std::make_shared<ParArray<DNDS::real, cols>>(mpi);
414 trans.createFatherGlobalMapping();
417 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, 5);
418 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
419 trans.createMPITypes();
425 (*
son)(g, j) = 9999.0 + g + j * 0.1;
443 bool anyNonZero =
false;
446 if ((*
father)(i, j) != 0.0)
483template <
class T,
class Layout, DNDS::rowsize RS>
491#define TRANS_TAG_STR(T, L, RS) TYPE_TO_STRING(TransTag<T, L, RS>)
528#define TRANS_ALL_TAGS \
529 TransTag<DNDS::real, LayoutStaticFixed, 1>, \
530 TransTag<DNDS::real, LayoutStaticFixed, 3>, \
531 TransTag<DNDS::real, LayoutStaticFixed, 7>, \
532 TransTag<DNDS::real, LayoutDynamic, 1>, \
533 TransTag<DNDS::real, LayoutDynamic, 3>, \
534 TransTag<DNDS::real, LayoutDynamic, 7>, \
535 TransTag<DNDS::real, LayoutCSR, 0>, \
536 TransTag<DNDS::index, LayoutStaticFixed, 1>, \
537 TransTag<DNDS::index, LayoutStaticFixed, 3>, \
538 TransTag<DNDS::index, LayoutStaticFixed, 7>, \
539 TransTag<DNDS::index, LayoutDynamic, 1>, \
540 TransTag<DNDS::index, LayoutDynamic, 3>, \
541 TransTag<DNDS::index, LayoutDynamic, 7>, \
542 TransTag<DNDS::index, LayoutCSR, 0>, \
543 TransTag<uint16_t, LayoutStaticFixed, 1>, \
544 TransTag<uint16_t, LayoutStaticFixed, 3>, \
545 TransTag<uint16_t, LayoutStaticFixed, 7>, \
546 TransTag<uint16_t, LayoutDynamic, 1>, \
547 TransTag<uint16_t, LayoutDynamic, 3>, \
548 TransTag<uint16_t, LayoutDynamic, 7>, \
549 TransTag<uint16_t, LayoutCSR, 0>, \
550 TransTag<int32_t, LayoutStaticFixed, 1>, \
551 TransTag<int32_t, LayoutStaticFixed, 3>, \
552 TransTag<int32_t, LayoutStaticFixed, 7>, \
553 TransTag<int32_t, LayoutDynamic, 1>, \
554 TransTag<int32_t, LayoutDynamic, 3>, \
555 TransTag<int32_t, LayoutDynamic, 7>, \
556 TransTag<int32_t, LayoutCSR, 0>
560 using T =
typename Tag::type;
561 using L =
typename Tag::layout;
571 if constexpr (std::is_same_v<L, LayoutStaticFixed>)
573 auto father = std::make_shared<ParArray<T, RS>>(mpi);
576 father->createGlobalMapping();
580 (*
father)(i, j) =
static_cast<T
>((
gOff + i) * 100 + j);
582 auto son = std::make_shared<ParArray<T, RS>>(mpi);
585 trans.createFatherGlobalMapping();
586 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, nGhostPerRank);
587 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
588 trans.createMPITypes();
597 CHECK((*
son)(g, j) ==
static_cast<T
>(ghostGlobal * 100 + j));
600 else if constexpr (std::is_same_v<L, LayoutDynamic>)
602 auto father = std::make_shared<ParArray<T, DynamicSize>>(mpi);
605 father->createGlobalMapping();
609 (*
father)(i, j) =
static_cast<T
>((
gOff + i) * 100 + j);
611 auto son = std::make_shared<ParArray<T, DynamicSize>>(mpi);
614 trans.createFatherGlobalMapping();
615 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, nGhostPerRank);
616 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
617 trans.createMPITypes();
626 CHECK((*
son)(g, j) ==
static_cast<T
>(ghostGlobal * 100 + j));
631 auto father = std::make_shared<ParArray<T, NonUniformSize, NonUniformSize>>(mpi);
636 father->createGlobalMapping();
640 (*
father)(i, j) =
static_cast<T
>((
gOff + i) * 100 + j);
642 auto son = std::make_shared<ParArray<T, NonUniformSize, NonUniformSize>>(mpi);
645 trans.createFatherGlobalMapping();
646 auto pullIdx = pullFirstNFromOthers(mpi, *
trans.pLGlobalMapping, nGhostPerRank);
647 trans.createGhostMapping(std::vector<DNDS::index>(pullIdx));
648 trans.createMPITypes();
658 bool found =
trans.pLGlobalMapping->search(ghostGlobal, srcRank, srcLoc);
662 CHECK(
son->RowSize(g) == expectedRowSize);
665 CHECK((*
son)(g, j) ==
static_cast<T
>(ghostGlobal * 100 + j));
Core 2D variable-length array container with five data layouts.
void Resize(index nSize, rowsize nRow_size_dynamic)
Resize the array, setting a uniform or maximum row width.
index Size() const
Number of rows currently stored. O(1).
Table mapping rank-local row indices to the global index space.
MPI-aware Array: adds a communicator, rank, and global index mapping.
void setMPI(const MPIInfo &n_mpi)
Install the MPI context after default construction.
index globalSize() const
Returns the total global size (sum of sizes across all ranks).
bool AssertConsistent()
Check array consistency across all ranks.
void createGlobalMapping()
Collective: build the global offsets table.
the host side operators are provided as implemented
int32_t rowsize
Row-width / per-row element-count type (signed 32-bit).
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
int MPI_int
MPI counterpart type for MPI_int (= C int). Used for counts and ranks in MPI calls.
Lightweight bundle of an MPI communicator and the calling rank's coordinates.
static constexpr DNDS::rowsize rs
TEST_CASE("3D: VFV P2 HQM error < P1 on sinCos3D")