From 63f091350da9898216ed2bb305d836fe6d7d5fa1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:36:32 +0000 Subject: [PATCH 01/15] Bump actions/stale from 9.0.0 to 9.1.0 Bumps [actions/stale](https://github.com/actions/stale) from 9.0.0 to 9.1.0. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/28ca1036281a5e5922ead5184a1bbf96e5fc984e...5bef64f19d7facfb25b37b414482c7164d639639) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3fcfd0d5f391..7169550f6da9 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -26,7 +26,7 @@ jobs: pull-requests: write # for actions/stale to close stale PRs runs-on: ubuntu-latest steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 with: debug-only: false ascending: true From 8554ac041e5bc91c6f44116bf975b82122428ad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:36:40 +0000 Subject: [PATCH 02/15] Bump github/codeql-action from 3.28.1 to 3.28.6 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.1 to 3.28.6. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b6a472f63d85b9c78a3ac5e89422239fc15e9b3c...17a820bf2e43b47be2c72b39cc905417bc1ab6d0) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql.yml | 4 ++-- .github/workflows/scorecards.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0d3fa53c932a..b691b96996d0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -45,7 +45,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1 + uses: github/codeql-action/init@17a820bf2e43b47be2c72b39cc905417bc1ab6d0 # v3.28.6 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -108,6 +108,6 @@ jobs: ninja -j 16 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1 + uses: github/codeql-action/analyze@17a820bf2e43b47be2c72b39cc905417bc1ab6d0 # v3.28.6 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 0afed4574690..790aee6fcded 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -66,6 +66,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1 + uses: github/codeql-action/upload-sarif@17a820bf2e43b47be2c72b39cc905417bc1ab6d0 # v3.28.6 with: sarif_file: results.sarif From 722f50aa4b9235cb9731a40c0c1171f27a20a641 Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Tue, 28 Jan 2025 17:27:10 -0700 Subject: [PATCH 03/15] Stohos: Silence shadow warning Signed-off-by: Christian Glusa --- .../vector/KokkosExp_View_MP_Vector_Contiguous.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/stokhos/src/sacado/kokkos/vector/KokkosExp_View_MP_Vector_Contiguous.hpp b/packages/stokhos/src/sacado/kokkos/vector/KokkosExp_View_MP_Vector_Contiguous.hpp index b8bbc9652455..a0a99a251274 100644 --- a/packages/stokhos/src/sacado/kokkos/vector/KokkosExp_View_MP_Vector_Contiguous.hpp +++ b/packages/stokhos/src/sacado/kokkos/vector/KokkosExp_View_MP_Vector_Contiguous.hpp @@ -111,19 +111,19 @@ inline auto create_mirror( if constexpr ( ! std::is_same_v::array_layout, LayoutStride>) { return src.layout(); } else { - LayoutStride layout; + LayoutStride layout2; for (int idx = 0; idx <= 7; ++idx) { - layout.dimension[idx] = src.extent(idx); - layout.stride [idx] = src.stride(idx); + layout2.dimension[idx] = src.extent(idx); + layout2.stride [idx] = src.stride(idx); } - return layout; + return layout2; } }(); layout.dimension[src_type::rank] = dimension_scalar(src); - + const auto prop_copy = Impl::with_properties_if_unset( arg_prop, std::string(src.label()).append("_mirror")); From 95f6e5d70238b9ee4c837bf9c9be81864074bfd0 Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Wed, 29 Jan 2025 01:56:59 -0700 Subject: [PATCH 04/15] Amesos2 : fix out-of-bound access in matrix-gather Signed-off-by: iyamazaki --- ...sos2_TpetraCrsMatrix_MatrixAdapter_def.hpp | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp b/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp index 770a937246e0..9e331f921cd2 100644 --- a/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp @@ -122,7 +122,7 @@ namespace Amesos2 { // Create new GID list for RowMap Kokkos::View rowIndexList ("indexList", nRows); for (local_ordinal_t k = 0; k < nRows; k++) { - rowIndexList(k) = frow+k; + rowIndexList(k) = frow+k; // based on index-base of rowMap } // Create new GID list for ColMap Kokkos::View colIndexList ("indexList", nCols); @@ -138,10 +138,11 @@ namespace Amesos2 { RCP importer = rcp (new import_t (rowMap, colMap)); col_mv.doImport (row_mv, *importer, Tpetra::INSERT); { + // col_mv is imported from rowIndexList, which is based on index-base of rowMap auto col_view = col_mv.getLocalViewHost(Tpetra::Access::ReadOnly); for(int i=0; i gatherTime = Teuchos::TimeMonitor::getNewCounter ("Amesos2::gather"); @@ -186,7 +187,6 @@ namespace Amesos2 { auto nRanks = comm->getSize(); auto myRank = comm->getRank(); - global_ordinal_t indexBase = rowMap->getIndexBase(); global_ordinal_t nRows = this->mat_->getGlobalNumRows(); auto lclMatrix = this->mat_->getLocalMatrixDevice(); @@ -200,6 +200,9 @@ namespace Amesos2 { Kokkos::deep_copy(lclRowptr, lclRowptr_d); Kokkos::deep_copy(lclColind, lclColind_d); + // index-bases + global_ordinal_t rowIndexBase = rowMap->getIndexBase(); + global_ordinal_t colIndexBase = colMap->getIndexBase(); // map from global to local host_ordinal_type_array perm_g2l; // workspace to transpose @@ -244,12 +247,12 @@ namespace Amesos2 { for (int i=0; i < myNRows; i++) { lclMap(i) = rowMap->getGlobalElement(i); } - Teuchos::gatherv (lclMap.data(), myNRows, perm_g2l.data(), + Teuchos::gatherv (lclMap.data(), myNRows, perm_g2l.data(), recvCounts.data(), recvDispls.data(), 0, *comm); if (myRank == 0) { for (int i=0; i < nRows; i++) { - perm_g2l(i) -= indexBase; + perm_g2l(i) -= rowIndexBase; if (i != perm_g2l(i)) need_to_perm = true; } } @@ -263,11 +266,11 @@ namespace Amesos2 { } else if (myRank != 0) { Kokkos::resize(pointers_t, 2); } + LocalOrdinal sendIdx = (myNRows > 0 ? 1 : 0); // To skip sending the first rowptr entry (note: 0, if local matrix is empty) LocalOrdinal *pointers_ = ((myRank != 0 || (column_major || need_to_perm)) ? pointers_t.data() : pointers.data()); - Teuchos::gatherv (&lclRowptr_(1), myNRows, &pointers_[1], + Teuchos::gatherv (&lclRowptr_(sendIdx), myNRows, &pointers_[1], recvCounts.data(), recvDispls.data(), 0, *comm); - if (myRank == 0) { // shift to global pointers pointers_[0] = 0; @@ -275,8 +278,8 @@ namespace Amesos2 { LocalOrdinal displs = recvCounts(0); for (int p = 1; p < nRanks; p++) { // skip "Empty" submatrix (no rows) - // recvCounts(p) is zero, while pointers_[recvDispls(p+1)] now contains nnz from p-1 - if (recvDispls(p+1) > recvDispls(p)) { + // recvCounts(p) is zero, while pointers_[recvDispls(p+1)] now contains nnz from p-1 + if (recvDispls(p+1) > recvDispls(p)) { // save recvCounts from pth MPI recvCounts(p) = pointers_[recvDispls(p+1)]; // shift pointers for pth MPI to global @@ -284,7 +287,7 @@ namespace Amesos2 { pointers_[i] += displs; } displs += recvCounts(p); - } + } } ret = pointers_[nRows]; } @@ -303,14 +306,14 @@ namespace Amesos2 { } // -- convert to global colids & convert to 0-base KV_GO lclColind_ ("localColind_", lclColind.extent(0)); - for (int i = 0; i < int(lclColind.extent(0)); i++) lclColind_(i) = (colMap->getGlobalElement((lclColind(i))) - indexBase); + for (int i = 0; i < int(lclColind.extent(0)); i++) lclColind_(i) = (colMap->getGlobalElement((lclColind(i))) - colIndexBase); if (column_major || need_to_perm) { Kokkos::resize(indices_t, indices.extent(0)); - Teuchos::gatherv (lclColind_.data(), lclColind_.extent(0), indices_t.data(), + Teuchos::gatherv (lclColind_.data(), lclColind_.extent(0), indices_t.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } else { - Teuchos::gatherv (lclColind_.data(), lclColind_.extent(0), indices.data(), + Teuchos::gatherv (lclColind_.data(), lclColind_.extent(0), indices.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } From cd92dd73807c1f3a9b70661a2fe18e8a27c453ec Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Wed, 29 Jan 2025 02:42:26 -0700 Subject: [PATCH 05/15] Amesos2 : gather-matrix with sort Signed-off-by: iyamazaki --- .../src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp b/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp index 9e331f921cd2..3a3fa27547f4 100644 --- a/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_TpetraCrsMatrix_MatrixAdapter_def.hpp @@ -205,6 +205,7 @@ namespace Amesos2 { global_ordinal_t colIndexBase = colMap->getIndexBase(); // map from global to local host_ordinal_type_array perm_g2l; + host_ordinal_type_array perm_l2g; // workspace to transpose KV_GS pointers_t; KV_GO indices_t; @@ -241,6 +242,7 @@ namespace Amesos2 { Kokkos::resize(lclMap, myNRows); if (myRank == 0) { Kokkos::resize(perm_g2l, nRows); + Kokkos::resize(perm_l2g, nRows); } else { Kokkos::resize(perm_g2l, 1); } @@ -253,6 +255,7 @@ namespace Amesos2 { if (myRank == 0) { for (int i=0; i < nRows; i++) { perm_g2l(i) -= rowIndexBase; + perm_l2g(perm_g2l(i)) = i; if (i != perm_g2l(i)) need_to_perm = true; } } @@ -339,8 +342,9 @@ namespace Amesos2 { for (int i=1; i < nRows; i++) { pointers(i+1) += pointers(i); } - for (int i=0; i Date: Wed, 29 Jan 2025 02:42:58 -0700 Subject: [PATCH 06/15] Amesos2 : update matrix-gather with Epetra Signed-off-by: iyamazaki --- ...os2_EpetraCrsMatrix_MatrixAdapter_decl.hpp | 150 +++++++++++++----- 1 file changed, 108 insertions(+), 42 deletions(-) diff --git a/packages/amesos2/src/Amesos2_EpetraCrsMatrix_MatrixAdapter_decl.hpp b/packages/amesos2/src/Amesos2_EpetraCrsMatrix_MatrixAdapter_decl.hpp index 59aa203dddc0..c68aff8efb58 100644 --- a/packages/amesos2/src/Amesos2_EpetraCrsMatrix_MatrixAdapter_decl.hpp +++ b/packages/amesos2/src/Amesos2_EpetraCrsMatrix_MatrixAdapter_decl.hpp @@ -113,13 +113,20 @@ namespace Amesos2 { int myNRows = this->mat_->NumMyRows(); int myNnz = this->mat_->NumMyNonzeros(); if(current_phase == PREORDERING || current_phase == SYMBFACT) { - // workspace for column major - KV_GS pointers_t; - KV_GO indices_t; - // gether rowptr Kokkos::resize(recvCounts, nRanks); Kokkos::resize(recvDispls, nRanks+1); + + // index-bases + global_ordinal_t rowIndexBase = rowMap->getIndexBase(); + global_ordinal_t colIndexBase = colMap->getIndexBase(); + // map from global to local + host_ordinal_type_array perm_g2l; + host_ordinal_type_array perm_l2g; + // workspace for column major + KV_GS pointers_t; + KV_GO indices_t; + bool need_to_perm = false; { #ifdef HAVE_AMESOS2_TIMERS Teuchos::RCP< Teuchos::Time > gatherTime = Teuchos::TimeMonitor::getNewCounter ("Amesos2::gather(rowptr)"); @@ -142,13 +149,38 @@ namespace Amesos2 { } recvDispls(nRanks) = 0; } - if (myRank == 0 && column_major) { + // gether g2l perm (convert to 0-base) + { + host_ordinal_type_array lclMap; + Kokkos::resize(lclMap, myNRows); + if (myRank == 0) { + Kokkos::resize(perm_g2l, nRows); + Kokkos::resize(perm_l2g, nRows); + } else { + Kokkos::resize(perm_g2l, 1); + } + for (int i=0; i < myNRows; i++) { + lclMap(i) = rowMap->getGlobalElement(i); + } + Teuchos::gatherv (lclMap.data(), myNRows, perm_g2l.data(), + recvCounts.data(), recvDispls.data(), + 0, *comm); + if (myRank == 0) { + for (int i=0; i < nRows; i++) { + perm_g2l(i) -= rowIndexBase; + perm_l2g(perm_g2l(i)) = i; + if (i != perm_g2l(i)) need_to_perm = true; + } + } + } + if (myRank == 0 && (column_major || need_to_perm)) { Kokkos::resize(pointers_t, nRows+1); } else if (myRank != 0) { Kokkos::resize(pointers_t, 2); } - int *pointers_ = (myRank != 0 || column_major ? pointers_t.data() : pointers.data()); - Teuchos::gatherv (&lclRowptr[1], myNRows, &pointers_[1], + local_ordinal_t sendIdx = (myNRows > 0 ? 1 : 0); // To skip sending the first rowptr entry (note: 0, if local matrix is empty) + local_ordinal_t *pointers_ = ((myRank != 0 || (column_major || need_to_perm)) ? pointers_t.data() : pointers.data()); + Teuchos::gatherv (&lclRowptr[sendIdx], myNRows, &pointers_[1], recvCounts.data(), recvDispls.data(), 0, *comm); if (myRank == 0) { @@ -157,13 +189,17 @@ namespace Amesos2 { recvCounts(0) = pointers_[recvDispls(1)]; local_ordinal_t displs = recvCounts(0); for (int p = 1; p < nRanks; p++) { - // save recvCounts from pth MPI - recvCounts(p) = pointers_[recvDispls(p+1)]; - // shift pointers for pth MPI to global - for (int i = 1+recvDispls(p); i <= recvDispls(p+1); i++) { - pointers_[i] += displs; + // skip "Empty" submatrix (no rows) + // recvCounts(p) is zero, while pointers_[recvDispls(p+1)] now contains nnz from p-1 + if (recvDispls(p+1) > recvDispls(p)) { + // save recvCounts from pth MPI + recvCounts(p) = pointers_[recvDispls(p+1)]; + // shift pointers for pth MPI to global + for (int i = 1+recvDispls(p); i <= recvDispls(p+1); i++) { + pointers_[i] += displs; + } + displs += recvCounts(p); } - displs += recvCounts(p); } ret = pointers_[nRows]; } @@ -182,43 +218,70 @@ namespace Amesos2 { } // -- convert to global colids KV_GO lclColind_ ("localColind_", myNnz); - for (int i = 0; i < int(myNnz); i++) lclColind_(i) = colMap->getGlobalElement((lclColind[i])); - if (column_major) { + for (int i = 0; i < int(myNnz); i++) lclColind_(i) = (colMap->getGlobalElement((lclColind[i])) - colIndexBase); + if (column_major || need_to_perm) { Kokkos::resize(indices_t, indices.extent(0)); - Teuchos::gatherv (lclColind_.data(), myNnz, indices_t.data(), + Teuchos::gatherv (lclColind_.data(), myNnz, indices_t.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } else { - Teuchos::gatherv (lclColind_.data(), myNnz, indices.data(), + Teuchos::gatherv (lclColind_.data(), myNnz, indices.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } } - if (myRank == 0 && column_major) { + if (myRank == 0) { #ifdef HAVE_AMESOS2_TIMERS Teuchos::RCP< Teuchos::Time > gatherTime = Teuchos::TimeMonitor::getNewCounter ("Amesos2::gather(transpose index)"); Teuchos::TimeMonitor GatherTimer(*gatherTime); #endif - // Map to transpose - Kokkos::resize(transpose_map, ret); - // Transopose to convert to CSC - for (int i=0; i<=nRows; i++) { - pointers(i) = 0; - } - for (int k=0; k gatherTime = Teuchos::TimeMonitor::getNewCounter ("Amesos2::gather(nzvals)"); Teuchos::TimeMonitor GatherTimer(*gatherTime); #endif - if (column_major) { + // gather nzvals + if (transpose_map.extent(0) > 0) { Kokkos::resize(nzvals_t, nzvals.extent(0)); - Teuchos::gatherv (lclNzvals, myNnz, nzvals_t.data(), + Teuchos::gatherv (lclNzvals, myNnz, nzvals_t.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } else { - Teuchos::gatherv (lclNzvals, myNnz, nzvals.data(), + Teuchos::gatherv (lclNzvals, myNnz, nzvals.data(), recvCounts.data(), recvDispls.data(), 0, *comm); } } - if (myRank == 0 && column_major) { + if (myRank == 0) { // Insert Numerical values to transopose matrix ret = pointers(nRows); - for (int k=0; k 0) { + for (int k=0; k Date: Wed, 29 Jan 2025 10:14:50 -0700 Subject: [PATCH 07/15] Fix Amesos2 + SuperLU issue coming from EMPTY macro Signed-off-by: malphil --- packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp | 2 ++ packages/amesos2/src/Amesos2_Superludist_TypeMap.hpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp b/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp index 8ebeb9b57dbe..ae54c3bc591b 100644 --- a/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp @@ -45,6 +45,8 @@ namespace SLU { #include "slu_util.h" #include "superlu_enum_consts.h" +#undef EMPTY + void at_plus_a( const int n, /* number of columns in matrix A. */ diff --git a/packages/amesos2/src/Amesos2_Superludist_TypeMap.hpp b/packages/amesos2/src/Amesos2_Superludist_TypeMap.hpp index cc62ecc204c1..8f5312732924 100644 --- a/packages/amesos2/src/Amesos2_Superludist_TypeMap.hpp +++ b/packages/amesos2/src/Amesos2_Superludist_TypeMap.hpp @@ -77,6 +77,8 @@ namespace SLUD { } #endif // HAVE_TEUCHOS_COMPLEX +#undef EMPTY + // multiplication of SLUD types template struct slu_dist_mult {}; From 58b47cf13ac62e8731755ed1b5b8cfaebe847be1 Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Wed, 29 Jan 2025 13:01:18 -0700 Subject: [PATCH 08/15] Tacho : variant-3 solve with OpenMP Signed-off-by: iyamazaki --- .../tacho/src/impl/Tacho_Driver_Impl.hpp | 5 --- .../src/impl/Tacho_NumericTools_Factory.hpp | 4 +++ .../src/impl/Tacho_NumericTools_LevelSet.hpp | 35 +++++++++++-------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp index 0fb38ab2f4cf..392d1ee86937 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp @@ -142,11 +142,6 @@ void Driver::setLevelSetOptionDeviceFunctionThreshold(const ordinal_type } template void Driver::setLevelSetOptionAlgorithmVariant(const ordinal_type variant) { -#if !defined(TACHO_HAVE_CUSPARSE) && !defined(KOKKOS_ENABLE_HIP) - if (variant == 3) { - TACHO_TEST_FOR_EXCEPTION(true, std::logic_error, "variant 3 requires CuSparse or rocSparce"); - } -#endif if (variant > 3 || variant < 0) { TACHO_TEST_FOR_EXCEPTION(true, std::logic_error, "levelset algorithm variants range from 0 to 3"); } diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Factory.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Factory.hpp index ce31b241aa13..efe6021ff066 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Factory.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Factory.hpp @@ -219,6 +219,10 @@ template class NumericToolsFactory { } inline void extractCRS(bool lu) { -#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ - defined(KOKKOS_ENABLE_HIP) - const ordinal_type nrhs = 1; const ordinal_type m = _m; const value_type one(1); @@ -1647,6 +1644,8 @@ class NumericToolsLevelSet : public NumericToolsBase { this->releaseCRS(true); #endif +#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ + defined(KOKKOS_ENABLE_HIP) // ======================== // workspace Kokkos::resize(_w_vec, m, nrhs); @@ -1701,6 +1700,7 @@ class NumericToolsLevelSet : public NumericToolsBase { rocsparse_dnvec_descr vecX, vecY; rocsparse_create_dnvec_descr(&vecX, m, (void*)_w_vec.data(), rocsparse_compute_type); rocsparse_create_dnvec_descr(&vecY, m, (void*)_w_vec.data(), rocsparse_compute_type); +#endif #endif // allocate rowptrs @@ -1931,6 +1931,8 @@ class NumericToolsLevelSet : public NumericToolsBase { } ptr += (1+m); +#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ + defined(KOKKOS_ENABLE_HIP) // ======================== // create NVIDIA/AMD data structures for SpMV size_t buffer_size_L = 0; @@ -2079,10 +2081,13 @@ class NumericToolsLevelSet : public NumericToolsBase { rocsparse_spmv_stage_preprocess, &buffer_size_L, (void*)buffer_L.data()); #endif - } + } +#endif #endif } +#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ + defined(KOKKOS_ENABLE_HIP) #if defined(KOKKOS_ENABLE_CUDA) #ifdef USE_SPMM_FOR_WORKSPACE_SIZE cusparseDestroyDnMat(vecX); @@ -2404,10 +2409,16 @@ class NumericToolsLevelSet : public NumericToolsBase { inline void solveGenericLowerOnDeviceVar2_SpMV(const ordinal_type lvl, const ordinal_type nlvls, const ordinal_type pbeg, const ordinal_type pend, const value_type_matrix &t) { -#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ - defined(KOKKOS_ENABLE_HIP) const ordinal_type m = t.extent(0); const ordinal_type nrhs = t.extent(1); + const ordinal_type ldt = t.stride(1); + auto &s0 = _h_supernodes(_h_level_sids(pbeg)); + if (_w_vec.extent(1) != size_t(nrhs)) { + // expand workspace + Kokkos::resize(_w_vec, m, nrhs); + } +#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ + defined(KOKKOS_ENABLE_HIP) #if defined(KOKKOS_ENABLE_CUDA) cudaDataType computeType = CUDA_R_64F; if (std::is_same::value) { @@ -2430,8 +2441,6 @@ class NumericToolsLevelSet : public NumericToolsBase { const value_type alpha (1); const value_type beta (0); if (_w_vec.extent(1) != size_t(nrhs)) { - // expand workspace - Kokkos::resize(_w_vec, m, nrhs); // attach to Cusparse/Rocsparse data struct int ldw = _w_vec.stride(1); #if defined(KOKKOS_ENABLE_CUDA) @@ -2450,8 +2459,6 @@ class NumericToolsLevelSet : public NumericToolsBase { rocsparse_create_dnvec_descr(&vecW, m, (void*)(_w_vec.data()), rocsparse_compute_type); #endif } - const ordinal_type ldt = t.stride(1); - auto &s0 = _h_supernodes(_h_level_sids(pbeg)); #else exit(0); #endif @@ -2569,6 +2576,7 @@ class NumericToolsLevelSet : public NumericToolsBase { if (rocsparse_status_success != status) { printf( " Failed rocsparse_spmv for L\n" ); } +#endif #else const value_type zero(0); auto h_w = Kokkos::create_mirror_view_and_copy(host_memory_space(), ((nlvls-1-lvl)%2 == 0 ? t : _w_vec)); @@ -2611,7 +2619,6 @@ class NumericToolsLevelSet : public NumericToolsBase { Kokkos::deep_copy(t, _w_vec); } } -#endif } inline void solveCholeskyLowerOnDeviceVar2(const ordinal_type pbeg, const ordinal_type pend, @@ -2773,13 +2780,13 @@ class NumericToolsLevelSet : public NumericToolsBase { inline void solveGenericUpperOnDeviceVar2_SpMV(const ordinal_type lvl, const ordinal_type nlvls, const ordinal_type pbeg, const ordinal_type pend, const value_type_matrix &t) { -#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ - defined(KOKKOS_ENABLE_HIP) const ordinal_type m = t.extent(0); const ordinal_type nrhs = t.extent(1); auto &s0 = _h_supernodes(_h_level_sids(pbeg)); +#if (defined(KOKKOS_ENABLE_CUDA) && defined(TACHO_HAVE_CUSPARSE)) || \ + defined(KOKKOS_ENABLE_HIP) #ifdef TACHO_INSERT_DIAGONALS // x = t & y = w (lvl = 0,2,4) // compute t = L^{-1}*w @@ -2885,6 +2892,7 @@ class NumericToolsLevelSet : public NumericToolsBase { if (rocsparse_status_success != status) { printf( " Failed rocsparse_spmv for U\n" ); } +#endif #else const value_type zero(0); auto h_w = Kokkos::create_mirror_view_and_copy(host_memory_space(), (lvl%2 == 0 ? t : _w_vec)); @@ -2913,7 +2921,6 @@ class NumericToolsLevelSet : public NumericToolsBase { Kokkos::deep_copy(t, _w_vec); } } -#endif } inline void solveCholeskyUpperOnDeviceVar2(const ordinal_type pbeg, const ordinal_type pend, From 1f014c94d63f70bf379515812c596718906ae52f Mon Sep 17 00:00:00 2001 From: "Samuel E. Browne" Date: Wed, 29 Jan 2025 14:18:04 -0700 Subject: [PATCH 09/15] Update check names in anticipation of requirement Want the names updated early so that current PRs are ready to go once the checks become required and don't have to rebase/update. Signed-off-by: Samuel E. Browne --- .github/workflows/AT2.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/AT2.yml b/.github/workflows/AT2.yml index 909cd82a08bd..3b279d9e37e3 100644 --- a/.github/workflows/AT2.yml +++ b/.github/workflows/AT2.yml @@ -35,7 +35,7 @@ jobs: with: skip_after_successful_duplicate: 'true' - gcc10-openmpi416-EXPERIMENTAL: + gcc10-openmpi4: needs: pre-checks runs-on: [self-hosted, gcc-10.3.0_openmpi-4.1.6] if: ${{ needs.pre-checks.outputs.should_skip != 'true' && (github.event.action == 'synchronize' || github.event.action == 'opened' || github.event.review.state == 'APPROVED') }} @@ -221,7 +221,7 @@ jobs: echo "https://github.com/trilinos/Trilinos/wiki/Containers" >> $GITHUB_STEP_SUMMARY echo "https://gitlab-ex.sandia.gov/trilinos-project/trilinos-containers/-/wikis/Containers-at-Sandia" >> $GITHUB_STEP_SUMMARY - cuda11-EXPERIMENTAL: + cuda11: needs: pre-checks runs-on: [self-hosted, cuda-11.4.2_gcc-10.3.0_openmpi-4.1.6] if: ${{ needs.pre-checks.outputs.should_skip != 'true' && (github.event.action == 'synchronize' || github.event.action == 'opened' || github.event.review.state == 'APPROVED') }} From 05e0df15f66b685667cf61c64c3a7abb59eb642c Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 29 Jan 2025 15:59:00 -0700 Subject: [PATCH 10/15] TrilinosCouplings: Minor fixes to allow builds w/o Epetra stack (#13757) Signed-off-by: Chris Siefert --- .../examples/scaling/CMakeLists.txt | 53 +++-- .../scaling/example_Poisson2D_p2_tpetra.cpp | 82 ++++---- .../scaling/example_Poisson2D_pn_tpetra.cpp | 189 +++++++++--------- 3 files changed, 159 insertions(+), 165 deletions(-) diff --git a/packages/trilinoscouplings/examples/scaling/CMakeLists.txt b/packages/trilinoscouplings/examples/scaling/CMakeLists.txt index 7024aa66e5e2..da00097899d1 100644 --- a/packages/trilinoscouplings/examples/scaling/CMakeLists.txt +++ b/packages/trilinoscouplings/examples/scaling/CMakeLists.txt @@ -85,32 +85,7 @@ IF(${PACKAGE_NAME}_ENABLE_Epetra AND ${PACKAGE_NAME}_ENABLE_EpetraExt AND ENDIF() - IF(${PACKAGE_NAME}_ENABLE_Belos AND - ${PACKAGE_NAME}_ENABLE_MueLu) - - TRIBITS_ADD_EXECUTABLE_AND_TEST( - Example_Poisson2D_p2_tpetra - SOURCES example_Poisson2D_p2_tpetra.cpp - TrilinosCouplings_Pamgen_Utils.cpp - NUM_MPI_PROCS 1 - COMM mpi # Fails to build in serial (see Trilinos #465) - ) - - TRIBITS_ADD_EXECUTABLE( - Example_Poisson2D_pn_tpetra - SOURCES example_Poisson2D_pn_tpetra.cpp - TrilinosCouplings_Pamgen_Utils.cpp - TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp - COMM mpi - ) - - TRIBITS_ADD_TEST( - Example_Poisson2D_pn_tpetra - NAME "Poisson2D_pn=4_tpetra" - ARGS "--mesh=Poisson2D_p4.xml --solver=muelu_ho.xml" - COMM mpi - NUM_MPI_PROCS 1 - ) + IF(${PACKAGE_NAME}_ENABLE_Belos AND ${PACKAGE_NAME}_ENABLE_MueLu) IF(MueLu_ENABLE_Epetra AND ${PACKAGE_NAME}_ENABLE_Kokkos) TRIBITS_ADD_TEST( @@ -345,6 +320,31 @@ IF(${PACKAGE_NAME}_ENABLE_Belos AND COMM serial mpi ) + TRIBITS_ADD_EXECUTABLE_AND_TEST( + Example_Poisson2D_p2_tpetra + SOURCES example_Poisson2D_p2_tpetra.cpp + TrilinosCouplings_Pamgen_Utils.cpp + NUM_MPI_PROCS 1 + COMM mpi # Fails to build in serial (see Trilinos #465) + ) + + TRIBITS_ADD_EXECUTABLE( + Example_Poisson2D_pn_tpetra + SOURCES example_Poisson2D_pn_tpetra.cpp + TrilinosCouplings_Pamgen_Utils.cpp + TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp + COMM mpi + ) + + TRIBITS_ADD_TEST( + Example_Poisson2D_pn_tpetra + NAME "Poisson2D_pn=4_tpetra" + ARGS "--mesh=Poisson2D_p4.xml --solver=muelu_ho.xml" + COMM mpi + NUM_MPI_PROCS 1 + ) + + ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_AvatarT) IF( TPL_ENABLE_AVATAR OR ${PACKAGE_NAME}_ENABLE_AvatarT) TRIBITS_ADD_TEST( @@ -354,7 +354,6 @@ IF(${PACKAGE_NAME}_ENABLE_Belos AND NUM_MPI_PROCS 1 COMM mpi serial ) - ENDIF() diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp index 9669216825fa..5ea4af548c06 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp @@ -644,11 +644,11 @@ int main(int argc, char *argv[]) { - // Enumerate edges + // Enumerate edges // NOTE: Only correct in serial FieldContainer P1_elemToEdge(numElems,4);// Because quads FieldContainer P1_elemToEdgeOrient(numElems,4); - FieldContainer P1_edgeCoord(1,dim);//will be resized + FieldContainer P1_edgeCoord(1,dim);//will be resized GenerateEdgeEnumeration(P1_elemToNode, P1_nodeCoord, P1_elemToEdge,P1_elemToEdgeOrient,P1_edgeCoord); @@ -791,10 +791,10 @@ int main(int argc, char *argv[]) { } int numCellSeeds = P2_cellNodes.size(); - + // Generate map for nodes RCP globalMapG = rcp(new driver_map_type(INVALID_GO,&P2_ownedGIDs[0],P2_ownedNodes,0,Comm)); - + // Generate p1 map RCP P1_globalMap = rcp(new driver_map_type(INVALID_GO,&P1_ownedGIDs[0],P1_ownedNodes,0,Comm)); @@ -886,7 +886,7 @@ int main(int argc, char *argv[]) { } } - + tm.reset(); tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Global assembly"))); @@ -950,7 +950,7 @@ int main(int argc, char *argv[]) { FieldContainer cubPoints_aux(numCubPoints_aux, cubDim_aux); FieldContainer cubWeights_aux(numCubPoints_aux); myCub_aux->getCubature(cubPoints_aux, cubWeights_aux); - + tm.reset(); tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Getting basis for auxiliary P1 mesh"))); @@ -1551,8 +1551,6 @@ void evaluateExactSolutionGrad(ArrayOut & exactSolutionGradValues, /******************************* TEST MueLu ***************************************/ /**********************************************************************************/ -#include "ml_LevelWrap.h" - // Test MueLu int TestMultiLevelPreconditionerLaplace(char ProblemType[], ParameterList & amgList, @@ -1670,11 +1668,11 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], RCP< Belos::SolverManager > solver; if(solveType == "cg") solver = rcp(new Belos::PseudoBlockCGSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); - else if (solveType == "gmres") { + else if (solveType == "gmres") { solver = rcp(new Belos::PseudoBlockGmresSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); } else if (solveType == "fixed point" || solveType == "fixed-point") { - solver = rcp(new Belos::FixedPointSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); + solver = rcp(new Belos::FixedPointSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); } else { std::cout << "\nERROR: Invalid solver '"< & elemToNode, const FieldContainer & nodeCoord, FieldContainer & elemToEdge, FieldContainer & elemToEdgeOrient, FieldContainer & edgeCoord) { // Not especially efficient, but effective... at least in serial! - + int numElems = elemToNode.dimension(0); int numNodesperElem = elemToNode.dimension(1); int dim = nodeCoord.dimension(1); // Sanity checks if(numNodesperElem !=4) throw std::runtime_error("Error: GenerateEdgeEnumeration only works on Quads!"); - if(elemToEdge.dimension(0)!=numElems || elemToEdge.dimension(1)!=4 || elemToEdge.dimension(0)!=elemToEdgeOrient.dimension(0) || elemToEdge.dimension(1)!=elemToEdgeOrient.dimension(1)) + if(elemToEdge.dimension(0)!=numElems || elemToEdge.dimension(1)!=4 || elemToEdge.dimension(0)!=elemToEdgeOrient.dimension(0) || elemToEdge.dimension(1)!=elemToEdgeOrient.dimension(1)) throw std::runtime_error("Error: GenerateEdgeEnumeration array size mismatch"); int edge_node0_id[4]={0,1,2,3}; int edge_node1_id[4]={1,2,3,0}; - + // Run over all the elements and start enumerating edges typedef std::map,int> en_map_type; en_map_type e2n; @@ -1767,7 +1765,7 @@ void GenerateEdgeEnumeration(const FieldContainer & elemToNode, const Field std::pair ep(lo,hi); int edge_id; - en_map_type::iterator iter = edge_map.find(ep); + en_map_type::iterator iter = edge_map.find(ep); if(iter==edge_map.end()) { edge_map[ep] = num_edges; edge_id = num_edges; @@ -1775,23 +1773,23 @@ void GenerateEdgeEnumeration(const FieldContainer & elemToNode, const Field } else edge_id = (*iter).second; - + elemToEdge(i,j) = edge_id; elemToEdgeOrient(i,j) = (lo==elemToNode(i,edge_node0_id[j]))?1:-1; } - } + } // Fill out the edge centers (clobbering data if needed) edgeCoord.resize(num_edges,dim); for(int i=0; i vals1(1); Array cols1(1); for(int cell = worksetBegin; cell < worksetEnd; cell++){ @@ -2135,8 +2133,8 @@ void CreateLinearSystem(int numWorksets, int globalRow = globalNodeIds[localRow]; double sourceTermContribution = worksetRHS(worksetCellOrdinal, cellRow); - //rhsVector.sumIntoGlobalValue(globalRow, 0, sourceTermContribution); - rhsVector->sumIntoGlobalValue(globalRow, 0, sourceTermContribution); + //rhsVector.sumIntoGlobalValue(globalRow, 0, sourceTermContribution); + rhsVector->sumIntoGlobalValue(globalRow, 0, sourceTermContribution); // "CELL VARIABLE" loop for the workset cell: cellCol is relative to the cell DoF numbering for (int cellCol = 0; cellCol < numFieldsG; cellCol++){ @@ -2163,14 +2161,14 @@ void GenerateLinearCoarsening_p2_to_p1(const FieldContainer & P2_elemToNode // This presumes that the P2 element has all of the P1 nodes numbered first // Resulting matrix is #P2nodes x #P1nodes double one = 1.0; - double half = 0.5; + double half = 0.5; double quarter = 0.25; int edge_node0_id[4]={0,1,2,3}; int edge_node1_id[4]={1,2,3,0}; - + int Nelem=P2_elemToNode.dimension(0); if(P2_elemToNode.dimension(1) != 9) throw std::runtime_error("Unidentified element type"); - + P = rcp(new crs_matrix_type(P2_map,0)); Array vals1(1); diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp index cbe94ffa9155..a1ec206ab415 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp @@ -104,9 +104,6 @@ #include "pamgen_im_ne_nemesisI_l.h" #include "pamgen_extras.h" -// AztecOO includes -#include "AztecOO.h" - // MueLu Includes # include "MueLu.hpp" # include "MueLu_ParameterListInterpreter.hpp" @@ -286,13 +283,13 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], RCP const & xexact, RCP & b, int maxits, - double tol, + double tol, RCP & uh, double & TotalErrorResidual, double & TotalErrorExactSol, std::string &amgType, std::string &solveType); - + /**********************************************************************************/ @@ -412,7 +409,7 @@ int main(int argc, char *argv[]) { Teuchos::CommandLineProcessor clp(false); Teuchos::ParameterList problemStatistics; - + RCP tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Pamgen Setup"))); std::string optMeshFile = "Poisson2D.xml"; @@ -433,18 +430,18 @@ int main(int argc, char *argv[]) { std::string rhsFilename; clp.setOption ("rhsFilename", &rhsFilename, "If nonempty, dump the " "generated rhs to that file in MatrixMarket format."); - + // If coordsFilename is nonempty, dump the coords to that file // in MatrixMarket format. std::string coordsFilename; clp.setOption ("coordsFilename", &coordsFilename, "If nonempty, dump the " "generated coordinates to that file in MatrixMarket format."); - + // Random number seed int randomSeed=24601; clp.setOption ("seed", &randomSeed, "Random Seed."); - - + + // Material diffusion strength and rotation (in 3D) // We'll get the 2D version of this later std::vector diff_rotation_angle {0.0, 0.0, 0.0}; @@ -456,13 +453,13 @@ int main(int argc, char *argv[]) { sprintf(str1,"rot_%c_angle",letter[i]); sprintf(str2,"Rotation around %c axis, in degrees",letter[i]); clp.setOption(str1,&diff_rotation_angle[i],str2); - + // Strength sprintf(str1,"strength_%c",letter[i]); sprintf(str2,"Strength of pre-rotation %c-diffusion",letter[i]); clp.setOption(str1,&diff_strength[i],str2); } - + switch (clp.parse(argc, argv)) { case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED: return EXIT_SUCCESS; @@ -470,7 +467,7 @@ int main(int argc, char *argv[]) { case Teuchos::CommandLineProcessor::PARSE_UNRECOGNIZED_OPTION: return EXIT_FAILURE; case Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL: break; } - + // Initialize RNG srand(randomSeed); @@ -783,14 +780,14 @@ int main(int argc, char *argv[]) { delete [] sideSetIds; - // Enumerate edges + // Enumerate edges // NOTE: Only correct in serial FieldContainer P1_elemToEdge(numElems,4);// Because quads FieldContainer P1_elemToEdgeOrient(numElems,4); - FieldContainer P1_edgeCoord(1,dim);//will be resized + FieldContainer P1_edgeCoord(1,dim);//will be resized FieldContainer P1_edgeToNode(1,2);//will be resized GenerateEdgeEnumeration(P1_elemToNode, P1_nodeCoord, P1_elemToEdge,P1_elemToEdgeOrient,P1_edgeToNode,P1_edgeCoord); - + tm.reset(); tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Mesh Statistics"))); @@ -814,7 +811,7 @@ int main(int argc, char *argv[]) { double dist2 = 0.0; double dist3 = 0.0; double dist4 = 0.0; - + int edge = P1_elemToEdge(0, 0); int node1 = P1_edgeToNode(edge, 0); int node2 = P1_edgeToNode(edge, 1); @@ -843,14 +840,14 @@ int main(int argc, char *argv[]) { for(int i=0; i elemToNode(numElems,Pn_numNodesperElem); + FieldContainer elemToNode(numElems,Pn_numNodesperElem); FieldContainer nodeCoord(Pn_numNodes,dim); FieldContainer nodeOnBoundary(Pn_numNodes); std::vector Pn_edgeNodes; @@ -1028,7 +1025,7 @@ int main(int argc, char *argv[]) { //#define OUTPUT_REFERENCE_FUNCTIONS #ifdef OUTPUT_REFERENCE_FUNCTIONS - // Evaluate basis values and gradients at DOF points + // Evaluate basis values and gradients at DOF points FieldContainer DofCoords(numFieldsG,spaceDim); myHGradBasis.getDofCoords(DofCoords); FieldContainer HGBValues_at_Dofs(numFieldsG,numFieldsG); @@ -1038,30 +1035,30 @@ int main(int argc, char *argv[]) { printf("*** Dof Coords ***\n"); for(int j=0; j globalMapG = rcp(new driver_map_type(INVALID_GO,&Pn_ownedGIDs[0],Pn_ownedNodes,0,Comm)); - + // Generate p1 map RCP P1_globalMap = rcp(new driver_map_type(INVALID_GO,&P1_ownedGIDs[0],P1_ownedNodes,0,Comm)); @@ -1151,7 +1148,7 @@ int main(int argc, char *argv[]) { Kokkos::DynRankView elemToNodeI2; CopyFieldContainer2D(elemToNode,elemToNodeI2); - + if (inputSolverList.isParameter("aux P1") && inputSolverList.isParameter("linear P1")) throw std::runtime_error("Can only specify \"aux P1\" or \"linear P1\", not both."); if (inputSolverList.isParameter("linear P1")) { @@ -1220,10 +1217,10 @@ int main(int argc, char *argv[]) { iOwned++; } } - + tm.reset(); tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Global assembly"))); - + /**********************************************************************************/ /******************** DEFINE WORKSETS AND LOOP OVER THEM **************************/ /**********************************************************************************/ @@ -1364,7 +1361,7 @@ int main(int argc, char *argv[]) { problemStatistics.set("Inverse Taper max", global_stat_max[5]); problemStatistics.set("Inverse Taper min", global_stat_min[5]); problemStatistics.set("Inverse Taper mean", global_stat_sum[5] / numElemsGlobal); - + // 6 - Skew problemStatistics.set("Skew max", global_stat_max[6]); problemStatistics.set("Skew min", global_stat_min[6]); @@ -1394,7 +1391,7 @@ int main(int argc, char *argv[]) { GenerateIdentityCoarsening_pn_to_p1(elemToNode, StiffMatrix_aux.getDomainMap(), StiffMatrix.getRangeMap(), P_identity, R_identity); inputSolverList.remove("aux P1"); //even though LevelWrap happily accepts this parameter } - + /**********************************************************************************/ /******************************* ADJUST MATRIX DUE TO BC **************************/ /**********************************************************************************/ @@ -1593,7 +1590,7 @@ int main(int argc, char *argv[]) { rcpFromRef(StiffMatrix), nCoord, exactNodalVals, - rhsVector, + rhsVector, maxits, tol, femCoefficients, @@ -1857,7 +1854,7 @@ std::vector diffusion_tensor; template void materialTensor(Scalar material[][2], const Scalar& x, const Scalar& y) { - if(diffusion_tensor.size() == 0) + if(diffusion_tensor.size() == 0) diffusion_tensor = ::TrilinosCouplings::IntrepidPoissonExample::getDiffusionMatrix2D(); material[0][0] = (Scalar)diffusion_tensor[0]; material[0][1] = (Scalar)diffusion_tensor[1]; @@ -2031,7 +2028,7 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], RCP const & xexact, RCP & b, int maxIts, - double tol, + double tol, RCP & uh, double & TotalErrorResidual, double & TotalErrorExactSol, @@ -2064,7 +2061,7 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], throw std::runtime_error("Error: ML does not support Tpetra objects"); } else if (amgType == "MueLu") { - // Multigrid Hierarchy, the easy way + // Multigrid Hierarchy, the easy way RCP A0op = A0; amgList.sublist("user data").set("Coordinates",nCoord); Teuchos::RCP M = MueLu::CreateTpetraPreconditioner(A0op, amgList); @@ -2092,11 +2089,11 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], RCP< Belos::SolverManager > solver; if(solveType == "cg") solver = rcp(new Belos::PseudoBlockCGSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); - else if (solveType == "gmres") { + else if (solveType == "gmres") { solver = rcp(new Belos::PseudoBlockGmresSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); } else if (solveType == "fixed point" || solveType == "fixed-point") { - solver = rcp(new Belos::FixedPointSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); + solver = rcp(new Belos::FixedPointSolMgr(rcpFromRef(Problem), rcp(&belosList, false))); } else { std::cout << "\nERROR: Invalid solver '"< & elemToNode, const FieldContainer & nodeCoord, FieldContainer & elemToEdge, FieldContainer & elemToEdgeOrient, FieldContainer & edgeToNode, FieldContainer & edgeCoord) { // Not especially efficient, but effective... at least in serial! - + int numElems = elemToNode.dimension(0); int numNodesperElem = elemToNode.dimension(1); int dim = nodeCoord.dimension(1); // Sanity checks if(numNodesperElem !=4) throw std::runtime_error("Error: GenerateEdgeEnumeration only works on Quads!"); - if(elemToEdge.dimension(0)!=numElems || elemToEdge.dimension(1)!=4 || elemToEdge.dimension(0)!=elemToEdgeOrient.dimension(0) || elemToEdge.dimension(1)!=elemToEdgeOrient.dimension(1)) + if(elemToEdge.dimension(0)!=numElems || elemToEdge.dimension(1)!=4 || elemToEdge.dimension(0)!=elemToEdgeOrient.dimension(0) || elemToEdge.dimension(1)!=elemToEdgeOrient.dimension(1)) throw std::runtime_error("Error: GenerateEdgeEnumeration array size mismatch"); int edge_node0_id[4]={0,1,2,3}; int edge_node1_id[4]={1,2,3,0}; - + // Run over all the elements and start enumerating edges typedef std::map,int> en_map_type; en_map_type e2n; @@ -2188,7 +2185,7 @@ void GenerateEdgeEnumeration(const FieldContainer & elemToNode, const Field std::pair ep(lo,hi); int edge_id; - en_map_type::iterator iter = edge_map.find(ep); + en_map_type::iterator iter = edge_map.find(ep); if(iter==edge_map.end()) { edge_map[ep] = num_edges; edge_id = num_edges; @@ -2196,16 +2193,16 @@ void GenerateEdgeEnumeration(const FieldContainer & elemToNode, const Field } else edge_id = (*iter).second; - + elemToEdge(i,j) = edge_id; elemToEdgeOrient(i,j) = (lo==elemToNode(i,edge_node0_id[j]))?1:-1; } - } + } // Fill out the edge centers (clobbering data if needed) edgeCoord.resize(num_edges,dim); for(int i=0; i & elemToNode, const Field // Edge to Node connectivity edgeToNode.resize(num_edges,2); for(int i=0; i & elemToNode, const Field } } - + //#define DEBUG_EDGE_ENUMERATION #ifdef DEBUG_EDGE_ENUMERATION printf("**** Edge coordinates ***\n"); @@ -2264,7 +2261,7 @@ void PromoteMesh_Pn_Kirby(const int degree, const EPointType & pointType, #endif int Pn_ExpectedNodesperElem = P1_numNodesperElem + (degree-1)*P1_numEdgesperElem + (degree-1)*(degree-1); - int Pn_ExpectedNumNodes = P1_numNodes + (degree-1)*P1_numEdges + (degree-1)*(degree-1)*numElems; + int Pn_ExpectedNumNodes = P1_numNodes + (degree-1)*P1_numEdges + (degree-1)*(degree-1)*numElems; // Sanity checks if(P1_numNodesperElem !=4 || Pn_numNodesperElem !=Pn_ExpectedNodesperElem ) throw std::runtime_error("Error: PromoteMesh_Pn_Kirby only works on Quads!"); @@ -2272,26 +2269,26 @@ void PromoteMesh_Pn_Kirby(const int degree, const EPointType & pointType, Pn_elemToNode.dimension(0)!=numElems || Pn_nodeCoord.dimension(0) != Pn_ExpectedNumNodes) throw std::runtime_error("Error: PromoteMesh_Pn_Kirby array size mismatch"); - const CellTopologyData &cellTopoData = *shards::getCellTopologyData >(); + const CellTopologyData &cellTopoData = *shards::getCellTopologyData >(); shards::CellTopology cellTopo(&cellTopoData); // Kirby elements are ordered strictly in lex ordering from the bottom left to the top right /* Kirby Quad-9 Layout (p=2) - inode6 -- inode7 -- inode8 + inode6 -- inode7 -- inode8 | | inode3 inode4 inode5 - | | + | | inode0 -- inode1 -- inode2 Kirby Quad-16 Layout (p=3) inode12-- inode13-- inode14-- inode15 - | | + | | inode8 inode9 inode10 inode11 - | | + | | inode4 inode5 inode6 inode7 - | | + | | inode0 -- inode1 -- inode2 -- inode3 */ @@ -2307,11 +2304,11 @@ void PromoteMesh_Pn_Kirby(const int degree, const EPointType & pointType, int center_root = degree+2; // Make the new el2node array - for(int i=0; i RefNodeCoords(Pn_numNodesperElem,dim); - FieldContainer RefNodeCoords2(1,Pn_numNodesperElem,dim); - FieldContainer PhysNodeCoords(1,Pn_numNodesperElem,dim); + FieldContainer RefNodeCoords(Pn_numNodesperElem,dim); + FieldContainer RefNodeCoords2(1,Pn_numNodesperElem,dim); + FieldContainer PhysNodeCoords(1,Pn_numNodesperElem,dim); Basis_HGRAD_QUAD_Cn_FEM > BasisPn(degree,pointType); BasisPn.getDofCoords(RefNodeCoords); @@ -2352,7 +2349,7 @@ void PromoteMesh_Pn_Kirby(const int degree, const EPointType & pointType, RefNodeCoords2(0,i,k) = RefNodeCoords(i,k); // Make the new coordinates (inefficient, but correct) - for(int i=0; i my_p1_nodes(1,P1_numNodesperElem,dim); for(int j=0; j::mapToPhysicalFrame(PhysNodeCoords,RefNodeCoords2,my_p1_nodes,cellTopo); @@ -2383,7 +2380,7 @@ void PromoteMesh_Pn_Kirby(const int degree, const EPointType & pointType, } #ifdef DEBUG_PROMOTE_MESH - for(int i=0; i tm = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("Allocate arrays"))); - + std::cout << "CreateLinearSystem:" << std::endl; std::cout << " numCubPoints = " << numCubPoints << std::endl; std::cout << " cubDim = " << cubDim << std::endl; @@ -2628,7 +2625,7 @@ void CreateLinearSystem(int numWorksets, for(int i=0; igetImporter().is_null())) { @@ -2896,7 +2893,7 @@ void GenerateIdentityCoarsening_pn_to_p1(const FieldContainer & Pn_elemToNo // It's just the identity matrix. // By construction, the node numbering on the P1 auxiliary mesh is the same as on the Pn base mesh // (see CreateP1MeshFromPnMesh). The P2 map is the range map, the P1 auxiliary map is the domain map. - + double one = 1.0; P = rcp(new crs_matrix_type(Pn_map,1)); @@ -2962,7 +2959,7 @@ void Apply_Dirichlet_BCs(std::vector &BCNodes, crs_matrix_type & A, multive typename crs_matrix_type::nonconst_local_inds_host_view_type cols("cols", numEntriesInRow); typename crs_matrix_type::nonconst_values_host_view_type vals("vals", numEntriesInRow); A.getLocalRowCopy(lrid, cols, vals, numEntriesInRow); - + for(size_t j=0; j Date: Thu, 30 Jan 2025 05:53:21 -0700 Subject: [PATCH 11/15] Remove unused import `imp` is deprecated and replaced with `importlib` since Python 3.4. Our containers do not allow it to be imported in their environments. Since it appears unused, just remove it. Signed-off-by: Samuel E. Browne --- .../create_trilinos_github_test_failure_issue_unit_tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/commonTools/framework/github_issue_creator/create_trilinos_github_test_failure_issue_unit_tests.py b/commonTools/framework/github_issue_creator/create_trilinos_github_test_failure_issue_unit_tests.py index 9bf8c2717b23..b5335f86c30b 100644 --- a/commonTools/framework/github_issue_creator/create_trilinos_github_test_failure_issue_unit_tests.py +++ b/commonTools/framework/github_issue_creator/create_trilinos_github_test_failure_issue_unit_tests.py @@ -7,7 +7,6 @@ import sys -import imp import shutil import unittest From e571022738cad5484ad6679661753f2361b1fe5c Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Thu, 30 Jan 2025 09:50:51 -0700 Subject: [PATCH 12/15] Tacho: muliple RHSs Signed-off-by: iyamazaki --- .../tacho/src/impl/Tacho_NumericTools_LevelSet.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp index c0a3abfad151..dff9f98dff64 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp @@ -2412,8 +2412,10 @@ class NumericToolsLevelSet : public NumericToolsBase { const ordinal_type m = t.extent(0); const ordinal_type nrhs = t.extent(1); const ordinal_type ldt = t.stride(1); + const ordinal_type old_nrhs = _w_vec.extent(1); + auto &s0 = _h_supernodes(_h_level_sids(pbeg)); - if (_w_vec.extent(1) != size_t(nrhs)) { + if (old_nrhs != nrhs) { // expand workspace Kokkos::resize(_w_vec, m, nrhs); } @@ -2440,7 +2442,7 @@ class NumericToolsLevelSet : public NumericToolsBase { // compute t = L^{-1}*w const value_type alpha (1); const value_type beta (0); - if (_w_vec.extent(1) != size_t(nrhs)) { + if (old_nrhs != nrhs) { // attach to Cusparse/Rocsparse data struct int ldw = _w_vec.stride(1); #if defined(KOKKOS_ENABLE_CUDA) From 64d17de0b8547274ae5f0cec0839e4db7119f1bd Mon Sep 17 00:00:00 2001 From: Greg Sjaardema Date: Thu, 30 Jan 2025 08:40:55 -0700 Subject: [PATCH 13/15] Automatic snapshot commit from seacas at 94e88d4519 Origin repo remote tracking branch: 'origin/develop' Origin repo remote repo URL: 'origin = https://github.com/sandialabs/seacas' Git describe: i2024-11-15-47-gc376c98dfe At commit: commit 94e88d451990cea8ff5520c769e6d29e0fd7cb9d Author: Greg Sjaardema Date: Tue Jan 28 15:58:59 2025 -0700 Summary: IOSS: cgns - minor tweak to decomposition algorithm to avoid 0 intervals * Several files -- remove trailing whitespace * Several -- Cleanups from compiler and static analyzer warnings * Exodiff -- Use Namelist as alias for std::vector, Rename class ExoII_Read to Exo_Read * Aprepro -- better error detection/reporting. Support string+string for concatenation in addition to // * Aprepro -- add a `format` function to print variable using a specified output format. * Exodus -- clean up lots of trailing whitespace in tests * Exodus -- support additional compression algorithms * IOSS -- New change-set (dynamic topology) code [Tolu primarily] * IOSS -- cgns decomp - fix bug giving 0 intervals on a zone * nem_slice -- Use enum class and rename some enums * Compression -- add zstd, bz2, and lossy quantize compression to several apps Signed-off-by: Greg Sjaardema --- packages/seacas/Jamfile | 4 +- .../seacas/applications/aprepro/test.inp_app | 6 +- .../applications/aprepro/test_standard.out | 48 +- packages/seacas/applications/blot/grpcom.blk | 4 +- packages/seacas/applications/blot/mshcol.f | 4 +- .../applications/conjoin/CJ_ExodusFile.C | 12 +- .../applications/conjoin/CJ_SystemInterface.C | 83 +- .../applications/conjoin/CJ_SystemInterface.h | 14 +- .../seacas/applications/conjoin/Conjoin.C | 7 +- .../applications/cpup/CP_SystemInterface.C | 24 - .../applications/cpup/CP_SystemInterface.h | 6 - packages/seacas/applications/cpup/cpup.C | 19 +- .../applications/ejoin/EJ_SystemInterface.C | 85 +- .../applications/ejoin/EJ_SystemInterface.h | 22 +- .../seacas/applications/ejoin/EJ_Version.h | 4 +- .../seacas/applications/ejoin/EJ_vector3d.C | 20 +- .../seacas/applications/ejoin/EJ_vector3d.h | 28 +- packages/seacas/applications/ejoin/EJoin.C | 213 +- .../seacas/applications/epu/EP_ExodusFile.C | 10 + .../applications/epu/EP_SystemInterface.C | 75 +- .../applications/epu/EP_SystemInterface.h | 13 +- packages/seacas/applications/epu/epu.C | 15 +- .../applications/exodiff/CMakeLists.txt | 2 +- .../applications/exodiff/ED_SystemInterface.C | 19 +- .../applications/exodiff/ED_SystemInterface.h | 48 +- .../seacas/applications/exodiff/assembly.h | 4 +- packages/seacas/applications/exodiff/check.C | 46 +- .../seacas/applications/exodiff/create_file.C | 71 +- .../seacas/applications/exodiff/edge_block.C | 13 +- .../seacas/applications/exodiff/edge_block.h | 4 +- .../seacas/applications/exodiff/exo_block.C | 13 +- .../seacas/applications/exodiff/exo_block.h | 6 +- .../seacas/applications/exodiff/exo_entity.C | 2 +- .../seacas/applications/exodiff/exo_entity.h | 16 +- .../exodiff/{exoII_read.C => exo_read.C} | 180 +- .../exodiff/{exoII_read.h => exo_read.h} | 129 +- .../seacas/applications/exodiff/exodiff.C | 112 +- .../seacas/applications/exodiff/face_block.C | 11 +- .../seacas/applications/exodiff/face_block.h | 4 +- packages/seacas/applications/exodiff/map.C | 44 +- packages/seacas/applications/exodiff/map.h | 16 +- .../seacas/applications/exodiff/node_set.h | 8 +- .../seacas/applications/exodiff/side_set.h | 4 +- .../seacas/applications/exodiff/stringx.C | 7 +- .../seacas/applications/exodiff/stringx.h | 7 +- packages/seacas/applications/exodiff/util.h | 2 + .../seacas/applications/exomatlab/exomatlab.C | 2 +- .../applications/explore/CMakeLists.txt | 2 +- .../seacas/applications/explore/exp_comand.f | 2 +- .../seacas/applications/explore/exp_dbsbel.f | 4 +- .../seacas/applications/explore/exp_preb1.f | 8 +- .../seacas/applications/explore/exp_prelem.f | 4 +- .../seacas/applications/explore/exp_rmixint.f | 4 +- .../seacas/applications/gjoin/gj_munnps.f | 4 +- .../seacas/applications/grepos/gp_attrot.blk | 4 +- .../seacas/applications/grepos/gp_mapvar.f | 2 +- .../seacas/applications/mapvar-kd/mapvar-kd.f | 4 +- packages/seacas/applications/mapvar/mapvar.f | 4 +- packages/seacas/applications/nem_slice/elb.h | 176 +- .../seacas/applications/nem_slice/elb_elem.C | 1126 +- .../seacas/applications/nem_slice/elb_elem.h | 67 +- .../applications/nem_slice/elb_exo_util.C | 25 +- .../seacas/applications/nem_slice/elb_graph.C | 44 +- .../applications/nem_slice/elb_groups.C | 4 +- .../seacas/applications/nem_slice/elb_inp.C | 292 +- .../applications/nem_slice/elb_loadbal.C | 279 +- .../seacas/applications/nem_slice/elb_main.C | 82 +- .../applications/nem_slice/elb_output.C | 55 +- .../nem_slice/fix_column_partitions.C | 12 +- .../applications/numbers/nu_multi_cavity.f | 8 +- .../seacas/applications/slice/SL_Decompose.C | 13 +- .../applications/slice/SL_SystemInterface.C | 84 +- .../applications/slice/SL_SystemInterface.h | 5 +- packages/seacas/applications/slice/Slice.C | 25 +- packages/seacas/applications/zellij/Grid.C | 6 +- .../libraries/aprepro_lib/CMakeLists.txt | 2 +- .../libraries/aprepro_lib/apr_aprepro.cc | 10 +- .../seacas/libraries/aprepro_lib/apr_array.cc | 19 +- .../libraries/aprepro_lib/apr_builtin.cc | 148 +- .../libraries/aprepro_lib/apr_builtin.h | 3 +- .../libraries/aprepro_lib/apr_getline.cc | 20 +- .../libraries/aprepro_lib/apr_getline.h | 4 +- .../seacas/libraries/aprepro_lib/apr_init.cc | 91 +- .../libraries/aprepro_lib/apr_parser.cc | 810 +- .../libraries/aprepro_lib/apr_scanner.cc | 19 +- .../seacas/libraries/aprepro_lib/apr_symrec.h | 9 +- .../seacas/libraries/aprepro_lib/apr_util.cc | 26 +- .../seacas/libraries/aprepro_lib/aprepro.h | 4 +- .../seacas/libraries/aprepro_lib/aprepro.ll | 14 +- .../seacas/libraries/aprepro_lib/aprepro.yy | 20 +- .../libraries/aprepro_lib/aprepro_parser.h | 4 +- .../libraries/aprepro_lib/init_structs.h | 10 +- .../seacas/libraries/aprepro_lib/strings.cc | 40 +- .../seacas/libraries/aprepro_lib/test.inp_app | 15 +- .../libraries/aprepro_lib/test_standard.out | 88 +- .../seacas/libraries/chaco/util/smalloc.c | 4 +- .../libraries/exoIIv2for32/CMakeLists.txt | 2 +- .../libraries/exoIIv2for32/test/testrd.dmp | 122 +- .../libraries/exoIIv2for32/test/testrdd.dmp | 122 +- .../exoIIv2for32/test/testrddi64.dmp | 122 +- .../seacas/libraries/exodus/CMakeLists.txt | 6 +- .../libraries/exodus/include/exodusII.h | 30 +- .../libraries/exodus/include/exodusII_int.h | 29 +- .../exodus/src/deprecated/ex_get_var_param.c | 4 +- .../exodus/src/deprecated/ex_put_var_param.c | 4 +- .../src/ex__put_homogenous_block_params.c | 28 +- .../exodus/src/ex__put_nodal_var_multi_time.c | 8 +- .../seacas/libraries/exodus/src/ex_conv.c | 70 +- .../seacas/libraries/exodus/src/ex_copy.c | 16 +- .../exodus/src/ex_cvt_nodes_to_sides.c | 42 +- packages/seacas/libraries/exodus/src/ex_err.c | 7 +- .../libraries/exodus/src/ex_field_utils.c | 12 +- .../libraries/exodus/src/ex_get_assemblies.c | 4 +- .../libraries/exodus/src/ex_get_blobs.c | 4 +- .../exodus/src/ex_get_block_params.c | 5 +- .../libraries/exodus/src/ex_get_concat_sets.c | 21 +- .../exodus/src/ex_get_field_metadata.c | 10 +- .../libraries/exodus/src/ex_get_group_id.c | 6 +- .../seacas/libraries/exodus/src/ex_get_ids.c | 9 +- .../libraries/exodus/src/ex_get_init_ext.c | 63 +- .../libraries/exodus/src/ex_get_init_global.c | 6 +- .../libraries/exodus/src/ex_get_names.c | 4 +- .../exodus/src/ex_get_partial_attr.c | 4 +- .../exodus/src/ex_get_partial_coord.c | 4 +- .../src/ex_get_partial_coord_component.c | 6 +- .../exodus/src/ex_get_partial_id_map.c | 4 +- .../exodus/src/ex_get_partial_num_map.c | 6 +- .../exodus/src/ex_get_partial_one_attr.c | 4 +- .../libraries/exodus/src/ex_get_prop_names.c | 4 +- .../exodus/src/ex_get_side_set_node_count.c | 34 +- .../exodus/src/ex_get_side_set_node_list.c | 31 +- .../src/ex_get_side_set_node_list_len.c | 17 +- .../libraries/exodus/src/ex_get_var_time.c | 4 +- .../seacas/libraries/exodus/src/ex_inquire.c | 10 +- .../exodus/src/ex_int_get_block_param.c | 4 +- .../seacas/libraries/exodus/src/ex_ne_util.c | 12 +- .../seacas/libraries/exodus/src/ex_open.c | 8 + .../seacas/libraries/exodus/src/ex_open_par.c | 18 +- .../exodus/src/ex_put_all_var_param_ext.c | 12 +- .../libraries/exodus/src/ex_put_assemblies.c | 10 +- .../exodus/src/ex_put_block_params.c | 7 +- .../exodus/src/ex_put_concat_elem_block.c | 8 +- .../seacas/libraries/exodus/src/ex_put_conn.c | 4 +- .../exodus/src/ex_put_field_metadata.c | 24 +- .../seacas/libraries/exodus/src/ex_put_init.c | 4 +- .../libraries/exodus/src/ex_put_init_ext.c | 40 +- .../src/ex_put_partial_coord_component.c | 4 +- .../exodus/src/ex_put_partial_num_map.c | 6 +- .../exodus/src/ex_put_partial_one_attr.c | 4 +- .../libraries/exodus/src/ex_put_partial_var.c | 30 +- .../seacas/libraries/exodus/src/ex_put_prop.c | 3 +- .../libraries/exodus/src/ex_put_prop_names.c | 3 +- .../src/ex_put_reduction_variable_names.c | 6 +- .../src/ex_put_reduction_variable_param.c | 10 +- .../exodus/src/ex_put_reduction_vars.c | 20 +- .../exodus/src/ex_put_variable_names.c | 8 +- .../exodus/src/ex_put_variable_param.c | 10 +- .../seacas/libraries/exodus/src/ex_utils.c | 179 +- .../libraries/exodus/test/CMakeLists.txt | 35 +- .../libraries/exodus/test/create_mesh.c | 16 +- packages/seacas/libraries/exodus/test/makedmp | 11 +- .../seacas/libraries/exodus/test/rd_wt_mesh.c | 60 +- .../libraries/exodus/test/test_nemesis.c | 20 +- .../seacas/libraries/exodus/test/testall.in | 2 +- .../seacas/libraries/exodus/test/testall.in1 | 4 +- .../libraries/exodus/test/testrd-assembly.c | 4 +- .../libraries/exodus/test/testrd-assembly.dmp | 8 +- .../libraries/exodus/test/testrd-blob.c | 4 +- .../libraries/exodus/test/testrd-blob.dmp | 6 +- .../exodus/test/testrd-field-metadata.c | 14 +- .../exodus/test/testrd-long-name.dmp | 54 +- .../libraries/exodus/test/testrd-nfaced.dmp | 42 +- .../libraries/exodus/test/testrd-nm32.dmp | 54 +- .../libraries/exodus/test/testrd-nsided.dmp | 68 +- .../libraries/exodus/test/testrd-oned.dmp | 56 +- .../seacas/libraries/exodus/test/testrd.dmp | 54 +- .../seacas/libraries/exodus/test/testrd1.dmp | 128 +- .../libraries/exodus/test/testrd_nc.dmp | 54 +- .../libraries/exodus/test/testrd_ss.dmp | 16 +- .../libraries/exodus/test/testrd_zeroe.dmp | 24 +- .../libraries/exodus/test/testrd_zeron.dmp | 6 +- .../seacas/libraries/exodus/test/testrdd.dmp | 50 +- .../libraries/exodus/test/testwt-blob.dmp | 48 +- .../exodus/test/testwt-field-metadata.c | 6 +- .../exodus/test/testwt-field-metadata.dmp | 20 +- .../libraries/exodus/test/update_all_tests | 16 +- .../libraries/exodus_for/CMakeLists.txt | 4 +- .../libraries/exodus_for/src/addrwrap.F | 4 +- .../libraries/exodus_for/src/exo_jack.c | 67 +- .../libraries/exodus_for/test/test-nsided.dmp | 12 +- .../seacas/libraries/exodus_for/test/test.dmp | 62 +- .../libraries/exodus_for/test/test1.dmp | 84 +- .../libraries/exodus_for/test/test2-1.dmp | 62 +- .../libraries/exodus_for/test/test2-2.dmp | 62 +- .../libraries/exodus_for/test/testcp_ss.dmp | 6 +- .../libraries/exodus_for/test/testcpnl.dmp | 6 +- .../libraries/exodus_for/test/testpart.f90 | 2 +- .../libraries/exodus_for/test/testrd.dmp | 122 +- .../libraries/exodus_for/test/testrd1.dmp | 92 +- .../libraries/exodus_for/test/testrd_nsid.dmp | 14 +- .../libraries/exodus_for/test/testrdd.dmp | 80 +- .../ioss/src/Ioss_BasisVariableType.h | 10 +- .../libraries/ioss/src/Ioss_ChangeSet.C | 391 + .../libraries/ioss/src/Ioss_ChangeSet.h | 104 + .../ioss/src/Ioss_ChangeSetFactory.C | 153 + .../ioss/src/Ioss_ChangeSetFactory.h | 60 + .../seacas/libraries/ioss/src/Ioss_Compare.C | 1118 +- .../libraries/ioss/src/Ioss_CopyDatabase.C | 4 +- .../libraries/ioss/src/Ioss_DatabaseIO.C | 19 + .../libraries/ioss/src/Ioss_DatabaseIO.h | 118 +- .../libraries/ioss/src/Ioss_Decomposition.h | 2 +- .../ioss/src/Ioss_DecompositionUtils.C | 94 +- .../ioss/src/Ioss_DecompositionUtils.h | 9 +- .../seacas/libraries/ioss/src/Ioss_Doxygen.h | 16 +- .../libraries/ioss/src/Ioss_DynamicTopology.C | 728 - .../libraries/ioss/src/Ioss_DynamicTopology.h | 222 +- .../ioss/src/Ioss_DynamicTopologyBroker.C | 111 + .../ioss/src/Ioss_DynamicTopologyBroker.h | 58 + .../src/Ioss_DynamicTopologyFileControl.C | 433 + .../src/Ioss_DynamicTopologyFileControl.h | 77 + .../ioss/src/Ioss_DynamicTopologyNotifier.C | 59 + .../ioss/src/Ioss_DynamicTopologyNotifier.h | 85 + .../ioss/src/Ioss_DynamicTopologyObserver.C | 222 + .../ioss/src/Ioss_DynamicTopologyObserver.h | 95 + .../src/Ioss_DynamicTopologyStateLocator.C | 177 + .../src/Ioss_DynamicTopologyStateLocator.h | 84 + .../seacas/libraries/ioss/src/Ioss_Field.C | 1 + .../libraries/ioss/src/Ioss_GroupingEntity.h | 51 +- .../libraries/ioss/src/Ioss_MeshCopyOptions.h | 1 + .../libraries/ioss/src/Ioss_ParallelUtils.C | 2 +- .../libraries/ioss/src/Ioss_ParallelUtils.h | 2 +- .../seacas/libraries/ioss/src/Ioss_Region.C | 193 +- .../seacas/libraries/ioss/src/Ioss_Region.h | 62 +- .../libraries/ioss/src/Ioss_StructuredBlock.C | 34 +- .../seacas/libraries/ioss/src/Ioss_Utils.C | 42 +- .../seacas/libraries/ioss/src/Ioss_Utils.h | 9 +- .../libraries/ioss/src/Ioss_VariableType.h | 4 +- .../seacas/libraries/ioss/src/Ioss_Version.h | 2 +- .../seacas/libraries/ioss/src/Ioss_use_fmt.h | 33 + .../libraries/ioss/src/adios/AdiosWrapper.C | 9 +- .../ioss/src/adios/Ioad_DatabaseIO.h | 25 +- .../src/catalyst/Iocatalyst_CatalystLogging.C | 2 +- .../ioss/src/catalyst/Iocatalyst_DatabaseIO.C | 16 + .../ioss/src/catalyst/Iocatalyst_DatabaseIO.h | 62 +- .../src/catalyst_tests/Iocatalyst_BlockMesh.C | 8 +- .../src/catalyst_tests/Iocatalyst_BlockMesh.h | 8 +- .../catalyst_tests/Iocatalyst_BlockMeshSet.C | 71 +- .../catalyst_tests/Iocatalyst_BlockMeshSet.h | 18 +- .../Iocatalyst_BlockMeshSetTest.C | 4 +- .../Iocatalyst_ConduitReadTest.C | 3 +- .../Iocatalyst_DatabaseIOTest.C | 10 +- .../Iocatalyst_ElementBlockTest.C | 164 +- .../catalyst_tests/Iocatalyst_LoggingTest.h | 2 +- .../Iocatalyst_TestDriverMain.C | 4 +- .../ioss/src/cgns/Iocgns_DatabaseIO.C | 9 + .../ioss/src/cgns/Iocgns_DatabaseIO.h | 13 +- .../ioss/src/cgns/Iocgns_ParallelDatabaseIO.C | 12 +- .../ioss/src/cgns/Iocgns_ParallelDatabaseIO.h | 15 +- .../ioss/src/cgns/Iocgns_StructuredZoneData.C | 8 +- .../libraries/ioss/src/cgns/Iocgns_Utils.C | 22 +- .../libraries/ioss/src/cgns/Iocgns_Utils.h | 2 +- .../ioss/src/exodus/Ioex_BaseDatabaseIO.C | 228 +- .../ioss/src/exodus/Ioex_BaseDatabaseIO.h | 93 +- .../ioss/src/exodus/Ioex_ChangeSet.C | 162 + .../ioss/src/exodus/Ioex_ChangeSet.h | 69 + .../ioss/src/exodus/Ioex_DatabaseIO.C | 164 +- .../ioss/src/exodus/Ioex_DatabaseIO.h | 4 +- .../ioss/src/exodus/Ioex_DecompositionData.C | 18 +- .../ioss/src/exodus/Ioex_Internals.C | 530 +- .../ioss/src/exodus/Ioex_ParallelDatabaseIO.C | 92 +- .../ioss/src/exodus/Ioex_ParallelDatabaseIO.h | 7 +- .../libraries/ioss/src/exodus/Ioex_Utils.C | 2 +- .../libraries/ioss/src/exonull/Ioexnl_Utils.C | 4 +- .../ioss/src/faodel/Iofaodel_DatabaseIO.C | 29 + .../ioss/src/faodel/Iofaodel_DatabaseIO.h | 2 + .../ioss/src/gen_struc/Iogs_DatabaseIO.C | 14 + .../ioss/src/gen_struc/Iogs_DatabaseIO.h | 4 +- .../ioss/src/generated/Iogn_DatabaseIO.C | 13 + .../ioss/src/generated/Iogn_DatabaseIO.h | 5 +- .../ioss/src/init/Ionit_Initializer.C | 6 +- .../libraries/ioss/src/main/CMakeLists.txt | 91 +- .../libraries/ioss/src/main/cgns_decomp.C | 161 +- .../libraries/ioss/src/main/info_interface.C | 29 +- .../libraries/ioss/src/main/info_interface.h | 12 +- .../seacas/libraries/ioss/src/main/io_info.C | 99 +- .../seacas/libraries/ioss/src/main/io_info.h | 48 +- .../libraries/ioss/src/main/io_info_main.C | 8 +- .../libraries/ioss/src/main/io_modify.C | 40 +- .../seacas/libraries/ioss/src/main/io_shell.C | 232 +- .../libraries/ioss/src/main/io_shell_ts.C | 89 +- .../libraries/ioss/src/main/shell_interface.C | 136 +- .../libraries/ioss/src/main/shell_interface.h | 9 +- .../seacas/libraries/ioss/src/main/skinner.C | 8 +- .../src/main/test/exodus_Q2_bc_parents.gold | Bin 1966313 -> 1472256 bytes .../ioss/src/main/test/exodus_bc_parents.gold | Bin 463844 -> 321832 bytes .../seacas/libraries/ioss/src/main/vector3d.h | 14 +- .../ioss/src/text_mesh/Iotm_DatabaseIO.C | 13 + .../ioss/src/text_mesh/Iotm_DatabaseIO.h | 5 +- .../ioss/src/text_mesh/Iotm_TextMesh.C | 9 +- .../text_mesh/Iotm_TextMeshAdjacencyGraph.h | 9 +- .../text_mesh/Iotm_TextMeshTopologyMapping.h | 36 +- .../src/unit_tests/UnitTestDynamicTopology.C | 2133 +- .../UnitTestElementBlockBatchRead.C | 5 +- .../src/unit_tests/UnitTestIotmDatabaseIO.C | 14 - .../unit_tests/UnitTestIotmTextMeshFixture.h | 2 - .../ioss/src/unit_tests/UnitTestTextMesh.C | 9 +- .../seacas/libraries/ioss/src/utest/Ut_ioad.C | 23 +- .../libraries/ioss/src/utest/Utst_ioel.C | 96 +- .../libraries/ioss/src/utest/Utst_sort.C | 23 +- .../ioss/src/utest/Utst_structured_decomp.C | 16 +- .../libraries/ioss/src/utest/Utst_utils.C | 116 +- .../src/visualization/catalyst/CMakeLists.txt | 8 +- .../catalyst/cgns/CatalystCGNSMesh.h | 33 +- .../catalyst/exodus/CatalystExodusMesh.h | 12 +- .../catalyst/manager/CatalystMeshWriter.h | 23 +- .../catalyst/parser/PhactoriParserInterface.h | 69 +- ...actoriAppendLocationAttributesOperation.py | 6 +- .../Operation/PhactoriCSVExportOperation.py | 4 +- .../Operation/PhactoriCalculatorOperation.py | 4 +- .../Operation/PhactoriCellEdgeAngleMetrics.py | 6 +- .../Operation/PhactoriCellSizeOperation.py | 4 +- .../PhactoriDataArtifactMetaDataControl.py | 7 +- .../PhactoriExtractBlockOperation.py | 6 +- .../PhactoriExtractComponentOperation.py | 4 +- .../PhactoriExtractStructuredMultiBlock.py | 26 +- .../Operation/PhactoriFindCellEdgeLengths.py | 4 +- .../Operation/PhactoriFollowSurfaceSide1.py | 8 +- .../PhactoriGeometricCellSampler1.py | 20 +- .../Operation/PhactoriGlyphOperation.py | 4 +- .../Operation/PhactoriGroupOperation.py | 4 +- .../PhactoriIntegrateVariablesOperation.py | 4 +- .../PhactoriMarkCellSurfaceStatus2.py | 4 +- .../Operation/PhactoriMpiUtilities.py | 4 +- .../Operation/PhactoriOperationBlock.py | 12 +- .../PhactoriParallelGeometryUtilities.py | 2 +- .../PhactoriParaviewMultiBlockRecursion.py | 4 +- .../PhactoriPointSourceFromJsonList.py | 5 +- .../PhactoriPointSourceGeometrySampler1.py | 7 +- .../PhactoriPointSourceNearbyCorrelator.py | 12 +- .../Operation/PhactoriRepresentationBlock.py | 5 +- .../Operation/PhactoriResampleWithDataset.py | 6 +- .../Operation/PhactoriSampledCellInfo.py | 8 +- .../Operation/PhactoriSegmentCellSampler3.py | 24 +- .../PhactoriSliceWithPlaneOperation.py | 5 +- .../PhactoriStreamTracerOperation.py | 8 +- ...PhactoriStreamTracerSeedSourceOperation.py | 6 +- .../PhactoriStructuredGridSampler.py | 7 +- .../Operation/PhactoriThresholdOperation.py | 5 +- .../Operation/PhactoriVtkCellOperations.py | 14 +- .../Operation/test_PhactoriCameraBlock.py | 7 +- ...est_PhactoriCreateSegmentsNormalToCells.py | 14 +- .../test_PhactoriGeometricCellSampler1.py | 6 +- .../test_PhactoriPointSourceFromJsonList.py | 10 +- .../Operation/test_PhactoriSegment.py | 6 +- .../test_PhactoriSegmentCellSampler3.py | 26 +- .../test_PhactoriVtkCellOperations.py | 14 +- .../phactori/PhactoriCombineToOneFile.py | 6 +- .../catalyst/phactori/PhactoriDriver.py | 336 +- .../phactori/PhactoriDriver_modular.py | 24 +- .../catalyst/phactori/phactori.py | 168 +- .../catalyst/test/Catch2/catch.hpp | 26731 ++++++++-------- .../visualization/cgns/CatalystCGNSMeshBase.h | 4 +- .../visualization/cgns/Iovs_cgns_DatabaseIO.C | 5 +- .../exodus/CatalystExodusMeshBase.h | 4 +- .../exodus/Iovs_exodus_DatabaseIO.C | 4 +- .../visualization/utils/CatalystManagerBase.h | 4 +- .../utils/Iovs_CatalystVersion.h | 2 +- .../seacas/libraries/nemesis/CMakeLists.txt | 1 + .../seacas/libraries/supes/ext_lib/exread.c | 6 +- packages/seacas/scripts/epup.in | 21 +- packages/seacas/scripts/exodus3.in.py | 19 +- packages/seacas/scripts/getopt-enhanced.c | 445 + packages/seacas/scripts/pconjoin.in | 16 +- packages/seacas/scripts/tests/test_exodus3.py | 14 + packages/seacas/see-top-level-LICENSE | 5 + packages/seacas/trlinos-seacas-config | 525 + 376 files changed, 26437 insertions(+), 20751 deletions(-) rename packages/seacas/applications/exodiff/{exoII_read.C => exo_read.C} (83%) rename packages/seacas/applications/exodiff/{exoII_read.h => exo_read.h} (68%) create mode 100644 packages/seacas/libraries/ioss/src/Ioss_ChangeSet.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_ChangeSet.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.h delete mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.C create mode 100644 packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.h create mode 100644 packages/seacas/libraries/ioss/src/Ioss_use_fmt.h create mode 100644 packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.C create mode 100644 packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.h create mode 100644 packages/seacas/scripts/getopt-enhanced.c create mode 100644 packages/seacas/see-top-level-LICENSE create mode 100755 packages/seacas/trlinos-seacas-config diff --git a/packages/seacas/Jamfile b/packages/seacas/Jamfile index 52e6d8693e74..886717f4eed8 100644 --- a/packages/seacas/Jamfile +++ b/packages/seacas/Jamfile @@ -168,7 +168,7 @@ explicit install-user-include0 ; install install-user-include0 : [ glob $(seacas-root)/libraries/ioss/src/*.h $(seacas-root)/libraries/ioss/src/init/*.h ] - : $(install-root)/io_system/include + : $(install-root)/Sierra/include/io_system ; explicit install-user-include1 ; @@ -222,7 +222,7 @@ install install-user-include6 : [ glob $(seacas-root)/libraries/ioss/src/visualization/utils/*.h $(seacas-root)/libraries/ioss/src/visualization/exodus/*.h $(seacas-root)/libraries/ioss/src/visualization/cgns/*.h ] - : $(install-root)/io_system/include + : $(install-root)/Sierra/include/io_system ; diff --git a/packages/seacas/applications/aprepro/test.inp_app b/packages/seacas/applications/aprepro/test.inp_app index e89ca173fb68..e31d49fc2998 100644 --- a/packages/seacas/applications/aprepro/test.inp_app +++ b/packages/seacas/applications/aprepro/test.inp_app @@ -180,7 +180,7 @@ $ Test int and [] (shortcut for int) $ Test looping - print sin, cos from 0 to 90 by 5 {Loop(19, _angle, 0, 5)} -{_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} +{_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} {EndLoop} $$$$ Test formatting and string concatenation @@ -200,12 +200,12 @@ $$$$ Test string rescanning and executing Original String: {Test} Rescanned String: -{rescan(Test)} +{rescan(Test)} Original String: {Test2} Print Value of variable T = {T} Rescanned String: -{rescan(Test2)} +{rescan(Test2)} Print Value of variable T = {T} Original String: {t1 = "atan2(0,-1)"} diff --git a/packages/seacas/applications/aprepro/test_standard.out b/packages/seacas/applications/aprepro/test_standard.out index 547666f429e2..6135b1970924 100644 --- a/packages/seacas/applications/aprepro/test_standard.out +++ b/packages/seacas/applications/aprepro/test_standard.out @@ -3,7 +3,7 @@ $ Test number representations 1 1 1 1 1 1 1 1 1 1 - + Test assign statements: 5 5 $ Should print 5 5 10 10 $ Should print 10 10 @@ -51,8 +51,8 @@ $ Test ifndef - else lines This line should be echoed (6) This line should be echoed. (7) $ Lines a, b, c, d, 1, 4, 6, 7 should be echoed -$ Check line counting -- should be on line 78: - +$ Check line counting -- should be on line 78: + $ ======================================================================== $ Test string if lines This line should be echoed ("greg") @@ -89,25 +89,25 @@ $ Test int and [] (shortcut for int) 5 -5 $ Test looping - print sin, cos from 0 to 90 by 5 -0 0 1 1 -5 0.08715574275 0.9961946981 1 -10 0.1736481777 0.984807753 1 -15 0.2588190451 0.9659258263 1 -20 0.3420201433 0.9396926208 1 -25 0.4226182617 0.906307787 1 -30 0.5 0.8660254038 1 -35 0.5735764364 0.8191520443 1 -40 0.6427876097 0.7660444431 1 -45 0.7071067812 0.7071067812 1 -50 0.7660444431 0.6427876097 1 -55 0.8191520443 0.5735764364 1 -60 0.8660254038 0.5 1 -65 0.906307787 0.4226182617 1 -70 0.9396926208 0.3420201433 1 -75 0.9659258263 0.2588190451 1 -80 0.984807753 0.1736481777 1 -85 0.9961946981 0.08715574275 1 -90 1 6.123233996e-17 1 +0 0 1 1 +5 0.08715574275 0.9961946981 1 +10 0.1736481777 0.984807753 1 +15 0.2588190451 0.9659258263 1 +20 0.3420201433 0.9396926208 1 +25 0.4226182617 0.906307787 1 +30 0.5 0.8660254038 1 +35 0.5735764364 0.8191520443 1 +40 0.6427876097 0.7660444431 1 +45 0.7071067812 0.7071067812 1 +50 0.7660444431 0.6427876097 1 +55 0.8191520443 0.5735764364 1 +60 0.8660254038 0.5 1 +65 0.906307787 0.4226182617 1 +70 0.9396926208 0.3420201433 1 +75 0.9659258263 0.2588190451 1 +80 0.984807753 0.1736481777 1 +85 0.9961946981 0.08715574275 1 +90 1 6.123233996e-17 1 $$$$ Test formatting and string concatenation %.10g @@ -142,12 +142,12 @@ Original String: Rescanned String: This is line 1: 3.141592654 This is line 2: 0.7071067812 - This is line 3: 0.7071067812 + This is line 3: 0.7071067812 Original String: This has an embedded string: {T = "This is a string"} Print Value of variable T = 0 Rescanned String: -This has an embedded string: This is a string +This has an embedded string: This is a string Print Value of variable T = This is a string Original String: atan2(0,-1) diff --git a/packages/seacas/applications/blot/grpcom.blk b/packages/seacas/applications/blot/grpcom.blk index e1da60206bec..dac995747efe 100644 --- a/packages/seacas/applications/blot/grpcom.blk +++ b/packages/seacas/applications/blot/grpcom.blk @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -7,7 +7,7 @@ C See packages/seacas/LICENSE for details COMMON /GRPCOC/ DEVNAM(2), DEVCOD(2) CHARACTER*3 DEVNAM CHARACTER*8 DEVCOD - COMMON /GRPCOM/ ICURDV, + COMMON /GRPCOM/ ICURDV, & NSNAP(2), IFONT(2), & MAXCOL(2), NUMCOL(0:1,2), MAPALT(2), MAPUSE(2), & ISHARD, DEVOK(2), TALKOK(2), SOFTCH(2), AUTOPL(2) diff --git a/packages/seacas/applications/blot/mshcol.f b/packages/seacas/applications/blot/mshcol.f index 25edee6dacd3..2663c50544db 100644 --- a/packages/seacas/applications/blot/mshcol.f +++ b/packages/seacas/applications/blot/mshcol.f @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -53,7 +53,7 @@ SUBROUTINE MSHCOL (FNCT, IELB, MLNTYP, WIDLIN, BLKCOL, include 'dbnums.blk' include 'linthc.blk' - + CHARACTER*(*) FNCT INTEGER MLNTYP(-1:1) LOGICAL WIDLIN diff --git a/packages/seacas/applications/conjoin/CJ_ExodusFile.C b/packages/seacas/applications/conjoin/CJ_ExodusFile.C index 618f980e20a3..e7f79e1bde1b 100644 --- a/packages/seacas/applications/conjoin/CJ_ExodusFile.C +++ b/packages/seacas/applications/conjoin/CJ_ExodusFile.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -202,6 +202,16 @@ bool Excn::ExodusFile::create_output(const SystemInterface &si) else if (si.zlib()) { ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_ZLIB); } + else if (si.zstd()) { + ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_ZSTD); + } + else if (si.bz2()) { + ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_BZ2); + } + + if (si.quantize()) { + ex_set_option(outputId_, EX_OPT_QUANTIZE_NSD, si.quantize_nsd()); + } } fmt::print("IO Word size is {} bytes.\n", ioWordSize_); diff --git a/packages/seacas/applications/conjoin/CJ_SystemInterface.C b/packages/seacas/applications/conjoin/CJ_SystemInterface.C index 6954ab093785..f74f50f2e776 100644 --- a/packages/seacas/applications/conjoin/CJ_SystemInterface.C +++ b/packages/seacas/applications/conjoin/CJ_SystemInterface.C @@ -65,18 +65,27 @@ void Excn::SystemInterface::enroll_options() options_.enroll("64-bit", GetLongOption::NoValue, "True if forcing the use of 64-bit integers for the output file", nullptr); - options_.enroll( - "zlib", GetLongOption::NoValue, - "Use the Zlib / libz compression method if compression is enabled (default) [exodus only].", - nullptr); + options_.enroll("zlib", GetLongOption::NoValue, + "Use the Zlib / libz compression method if compression is enabled (default) " + "[exodus only, enables netcdf-4].", + nullptr); options_.enroll("szip", GetLongOption::NoValue, "Use SZip compression. [exodus only, enables netcdf-4]", nullptr); + options_.enroll("zstd", GetLongOption::NoValue, + "Use Zstd compression. [exodus only, enables netcdf-4, experimental]", nullptr); + options_.enroll("bzip2", GetLongOption::NoValue, + "Use Bzip2 compression. [exodus only, enables netcdf-4, experimental]", nullptr); + + options_.enroll("compress", GetLongOption::MandatoryValue, + "Specify the compression level to be used. Values depend on algorithm:\n" + "\t\tzlib/bzip2: 0..9\t\tszip: even, 4..32\t\tzstd: -131072..22", + nullptr); - options_.enroll( - "compress", GetLongOption::MandatoryValue, - "Specify the hdf5 (netcdf4) compression level [0..9] to be used on the output file.", nullptr, - nullptr, true); + options_.enroll("quantize_nsd", GetLongOption::MandatoryValue, + "Use the lossy quantize compression method. Value specifies number of digits to " + "retain (1..15) [exodus only]", + nullptr, nullptr, true); options_.enroll("sort_times", GetLongOption::NoValue, "Sort the input files on the minimum timestep time in the file.\n" @@ -242,17 +251,61 @@ bool Excn::SystemInterface::parse_options(int argc, char **argv) omitNodesets_ = options_.retrieve("omit_nodesets") != nullptr; omitSidesets_ = options_.retrieve("omit_sidesets") != nullptr; - if (options_.retrieve("szip") != nullptr) { - szip_ = true; - zlib_ = false; - } zlib_ = (options_.retrieve("zlib") != nullptr); + szip_ = (options_.retrieve("szip") != nullptr); + zstd_ = (options_.retrieve("zstd") != nullptr); + bz2_ = (options_.retrieve("bzip2") != nullptr); + + if (szip_ + zlib_ + zstd_ + bz2_ > 1) { + fmt::print(stderr, + "ERROR: Only one of 'szip' or 'zlib' or 'zstd' or 'bzip2' can be specified.\n"); + } + + { + const char *temp = options_.retrieve("compress"); + if (temp != nullptr) { + compressionLevel_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } - if (szip_ && zlib_) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); + if (zlib_ || bz2_) { + if (compressionLevel_ < 0 || compressionLevel_ > 9) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 0 and 9 inclusive " + "for gzip/zlib/bzip2 compression.\n", + compressionLevel_); + return false; + } + } + else if (szip_) { + if (compressionLevel_ % 2 != 0) { + fmt::print( + stderr, + "ERROR: Bad compression level {}. Must be an even value for szip compression.\n", + compressionLevel_); + return false; + } + if (compressionLevel_ < 4 || compressionLevel_ > 32) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 4 and 32 inclusive " + "for szip compression.\n", + compressionLevel_); + return false; + } + } + } } - compressionLevel_ = options_.get_option_value("compress", compressionLevel_); + { + const char *temp = options_.retrieve("quantize_nsd"); + if (temp != nullptr) { + quantizeNSD_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + } + } if (options_.retrieve("copyright") != nullptr) { fmt::print("{}", copyright("2009-2021")); diff --git a/packages/seacas/applications/conjoin/CJ_SystemInterface.h b/packages/seacas/applications/conjoin/CJ_SystemInterface.h index 56d1a01d2e53..2df7577ac3fc 100644 --- a/packages/seacas/applications/conjoin/CJ_SystemInterface.h +++ b/packages/seacas/applications/conjoin/CJ_SystemInterface.h @@ -17,11 +17,16 @@ namespace Excn { SystemInterface(); bool parse_options(int argc, char **argv); - int debug() const { return debugLevel_; } - int screen_width() const { return screenWidth_; } + int debug() const { return debugLevel_; } + int screen_width() const { return screenWidth_; } + + int quantize_nsd() const { return quantizeNSD_; } int compress_data() const { return compressionLevel_; } bool zlib() const { return zlib_; } bool szip() const { return szip_; } + bool zstd() const { return zstd_; } + bool bz2() const { return bz2_; } + bool quantize() const { return quantizeNSD_ > 0; } bool omit_nodesets() const { return omitNodesets_; } bool omit_sidesets() const { return omitSidesets_; } @@ -60,8 +65,11 @@ namespace Excn { int debugLevel_{0}; int screenWidth_{0}; int compressionLevel_{0}; - bool zlib_{true}; + int quantizeNSD_{0}; + bool zlib_{false}; bool szip_{false}; + bool zstd_{false}; + bool bz2_{false}; bool omitNodesets_{false}; bool omitSidesets_{false}; bool ints64Bit_{false}; diff --git a/packages/seacas/applications/conjoin/Conjoin.C b/packages/seacas/applications/conjoin/Conjoin.C index 6f92ebfab309..00564c918f38 100644 --- a/packages/seacas/applications/conjoin/Conjoin.C +++ b/packages/seacas/applications/conjoin/Conjoin.C @@ -1535,6 +1535,9 @@ namespace { global->elementCount = goffset; global_element_map.resize(goffset); + if (goffset == 0) { + return; + } size_t max_id = global_element_map[global->elementCount - 1].first; bool is_contiguous = max_id == global_element_map.size(); @@ -2203,7 +2206,7 @@ namespace { for (size_t ns = 0; ns < set_ids.size(); ns++) { std::vector glob_ns_nodes(total_node_count + 1); - std::fill(glob_ns_nodes.begin(), glob_ns_nodes.end(), 0); + std::fill(glob_ns_nodes.begin(), glob_ns_nodes.end(), (INT)0); size_t lns = glob_sets[ns].position_; for (size_t p = 0; p < part_count; p++) { @@ -2548,7 +2551,7 @@ namespace { for (size_t b = 0; b < global.count(Excn::ObjectType::EBLK); b++) { status.resize(glob_blocks[b].entity_count()); - std::fill(status.begin(), status.end(), (1.0 - alive)); + std::fill(status.begin(), status.end(), T(1.0 - alive)); size_t boffset = blocks[b].offset_; size_t goffset = glob_blocks[b].offset_; size_t element_count = blocks[b].entity_count(); diff --git a/packages/seacas/applications/cpup/CP_SystemInterface.C b/packages/seacas/applications/cpup/CP_SystemInterface.C index 38007c582c36..1c3d10c4d940 100644 --- a/packages/seacas/applications/cpup/CP_SystemInterface.C +++ b/packages/seacas/applications/cpup/CP_SystemInterface.C @@ -124,19 +124,6 @@ void Cpup::SystemInterface::enroll_options() "large subcycle runs.", nullptr); - options_.enroll( - "zlib", GetLongOption::NoValue, - "Use the Zlib / libz compression method if compression is enabled (default) [exodus only].", - nullptr); - - options_.enroll("szip", GetLongOption::NoValue, - "Use SZip compression. [exodus only, enables netcdf-4]", nullptr); - - options_.enroll("compress_data", GetLongOption::MandatoryValue, - "The output database will be written using compression (netcdf-4 mode only).\n" - "\t\tValue ranges from 0..9 for zlib/gzip or even values 4..32 for szip.", - nullptr, nullptr, true); - options_.enroll("append", GetLongOption::NoValue, "Append to database instead of opening a new database.\n" "\t\tTimestep transfer will start after last timestep on database", @@ -301,18 +288,7 @@ bool Cpup::SystemInterface::parse_options(int argc, char **argv) append_ = options_.retrieve("append") != nullptr; - if (options_.retrieve("szip") != nullptr) { - szip_ = true; - zlib_ = false; - } - zlib_ = (options_.retrieve("zlib") != nullptr); - - if (szip_ && zlib_) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); - } - append_ = options_.retrieve("append") != nullptr; - compressData_ = options_.get_option_value("compress_data", compressData_); //subcycle_ = options_.get_option_value("subcycle", subcycle_); cycle_ = options_.get_option_value("cycle", cycle_); subcycleJoin_ = options_.retrieve("join_subcycles") != nullptr; diff --git a/packages/seacas/applications/cpup/CP_SystemInterface.h b/packages/seacas/applications/cpup/CP_SystemInterface.h index a7295f1e62d1..4caf2f9d6915 100644 --- a/packages/seacas/applications/cpup/CP_SystemInterface.h +++ b/packages/seacas/applications/cpup/CP_SystemInterface.h @@ -65,9 +65,6 @@ namespace Cpup { bool map_element_ids() const { return mapIds_; } bool omit_nodesets() const { return omitNodesets_; } bool omit_sidesets() const { return omitSidesets_; } - int compress_data() const { return compressData_; } - bool zlib() const { return zlib_; } - bool szip() const { return szip_; } bool subcycle_join() const { return subcycleJoin_; } bool keep_temporary() const { return keepTemporary_; } bool verify_valid_file() const { return verifyValidFile_; } @@ -132,10 +129,7 @@ namespace Cpup { int partCount_{-1}; int subcycle_{-1}; int cycle_{-1}; - int compressData_{0}; int maxOpenFiles_{0}; - bool zlib_{true}; - bool szip_{false}; bool sumSharedNodes_{false}; bool addProcessorIdField_{false}; bool addProcessorIdMap_{false}; diff --git a/packages/seacas/applications/cpup/cpup.C b/packages/seacas/applications/cpup/cpup.C index 87387a2816a0..8939076414b3 100644 --- a/packages/seacas/applications/cpup/cpup.C +++ b/packages/seacas/applications/cpup/cpup.C @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -35,22 +36,6 @@ unsigned int debug_level = 0; -#if FMT_VERSION >= 90000 -#include "Ioss_ZoneConnectivity.h" -#include "Ioss_StructuredBlock.h" - -namespace fmt { - template <> struct formatter : ostream_formatter - { - }; -} // namespace fmt -namespace fmt { - template <> struct formatter : ostream_formatter - { - }; -} // namespace fmt -#endif - namespace { std::string tsFormat = "[{:%H:%M:%S}] "; @@ -390,7 +375,7 @@ template void cpup(Cpup::SystemInterface &interFace, INT /*dummy* } // Now transfer the fields on the embedded node block... - auto pnb = pblock->get_node_block(); + const auto &pnb = pblock->get_node_block(); fields.clear(); pnb.field_describe(Ioss::Field::TRANSIENT, &fields); for (const auto &field_name : fields) { diff --git a/packages/seacas/applications/ejoin/EJ_SystemInterface.C b/packages/seacas/applications/ejoin/EJ_SystemInterface.C index f1aeecd6d920..b57157fd503b 100644 --- a/packages/seacas/applications/ejoin/EJ_SystemInterface.C +++ b/packages/seacas/applications/ejoin/EJ_SystemInterface.C @@ -196,18 +196,27 @@ void SystemInterface::enroll_options() options_.enroll("64-bit", GetLongOption::NoValue, "True if forcing the use of 64-bit integers for the output file", nullptr); - options_.enroll( - "zlib", GetLongOption::NoValue, - "Use the Zlib / libz compression method if compression is enabled (default) [exodus only].", - nullptr); + options_.enroll("zlib", GetLongOption::NoValue, + "Use the Zlib / libz compression method if compression is enabled (default) " + "[exodus only, enables netcdf-4].", + nullptr); options_.enroll("szip", GetLongOption::NoValue, "Use SZip compression. [exodus only, enables netcdf-4]", nullptr); + options_.enroll("zstd", GetLongOption::NoValue, + "Use Zstd compression. [exodus only, enables netcdf-4, experimental]", nullptr); + options_.enroll("bzip2", GetLongOption::NoValue, + "Use Bzip2 compression. [exodus only, enables netcdf-4, experimental]", nullptr); + + options_.enroll("compress", GetLongOption::MandatoryValue, + "Specify the compression level to be used. Values depend on algorithm:\n" + "\t\tzlib/bzip2: 0..9\t\tszip: even, 4..32\t\tzstd: -131072..22", + nullptr); - options_.enroll( - "compress", GetLongOption::MandatoryValue, - "Specify the hdf5 (netcdf4) compression level [0..9] to be used on the output file.", - nullptr); + options_.enroll("quantize_nsd", GetLongOption::MandatoryValue, + "Use the lossy quantize compression method. Value specifies number of digits to " + "retain (1..15) [exodus only]", + nullptr, nullptr, true); options_.enroll("disable_field_recognition", GetLongOption::NoValue, "Do not try to combine scalar fields into higher-order fields such as\n" @@ -417,17 +426,61 @@ bool SystemInterface::parse_options(int argc, char **argv) ints64bit_ = true; } - if (options_.retrieve("szip") != nullptr) { - szip_ = true; - zlib_ = false; - } zlib_ = (options_.retrieve("zlib") != nullptr); + szip_ = (options_.retrieve("szip") != nullptr); + zstd_ = (options_.retrieve("zstd") != nullptr); + bz2_ = (options_.retrieve("bzip2") != nullptr); - if (szip_ && zlib_) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); + if (szip_ + zlib_ + zstd_ + bz2_ > 1) { + fmt::print(stderr, + "ERROR: Only one of 'szip' or 'zlib' or 'zstd' or 'bzip2' can be specified.\n"); } - compressionLevel_ = options_.get_option_value("compress", compressionLevel_); + { + const char *temp = options_.retrieve("compress"); + if (temp != nullptr) { + compressionLevel_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + + if (zlib_ || bz2_) { + if (compressionLevel_ < 0 || compressionLevel_ > 9) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 0 and 9 inclusive " + "for gzip/zlib/bzip2 compression.\n", + compressionLevel_); + return false; + } + } + else if (szip_) { + if (compressionLevel_ % 2 != 0) { + fmt::print( + stderr, + "ERROR: Bad compression level {}. Must be an even value for szip compression.\n", + compressionLevel_); + return false; + } + if (compressionLevel_ < 4 || compressionLevel_ > 32) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 4 and 32 inclusive " + "for szip compression.\n", + compressionLevel_); + return false; + } + } + } + } + + { + const char *temp = options_.retrieve("quantize_nsd"); + if (temp != nullptr) { + quantizeNSD_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + } + } if (options_.retrieve("match_node_ids") != nullptr) { matchNodeIds_ = true; @@ -540,7 +593,7 @@ void SystemInterface::show_version() { fmt::print("EJoin\n" "\t(A code for merging Exodus databases; with or without results data.)\n" - "\t(Version: {}) Modified: {}\n", + "\t(Version: {}) Modified: {}\n\n", qainfo[2], qainfo[1]); } diff --git a/packages/seacas/applications/ejoin/EJ_SystemInterface.h b/packages/seacas/applications/ejoin/EJ_SystemInterface.h index 43985e833ae5..76fcd97eab95 100644 --- a/packages/seacas/applications/ejoin/EJ_SystemInterface.h +++ b/packages/seacas/applications/ejoin/EJ_SystemInterface.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-, 20232023, National Technology & Engineering Solutions +// Copyright(C) 1999-2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -36,12 +36,17 @@ class SystemInterface bool use_netcdf4() const { return useNetcdf4_; } bool ignore_element_ids() const { return ignoreElementIds_; } + int quantize_nsd() const { return quantizeNSD_; } + bool quantize() const { return quantizeNSD_ > 0; } int compression_level() const { return compressionLevel_; } bool zlib() const { return zlib_; } bool szip() const { return szip_; } - int step_min() const { return stepMin_; } - int step_max() const { return stepMax_; } - int step_interval() const { return stepInterval_; } + bool zstd() const { return zstd_; } + bool bz2() const { return bz2_; } + + int step_min() const { return stepMin_; } + int step_max() const { return stepMax_; } + int step_interval() const { return stepInterval_; } vector3d offset() const { return offset_; } const std::vector &information_record_parts() const { return infoRecordParts_; } @@ -88,6 +93,12 @@ class SystemInterface int stepMax_{INT_MAX}; int stepInterval_{1}; int compressionLevel_{0}; + int quantizeNSD_{0}; + bool zlib_{false}; + bool szip_{false}; + bool zstd_{false}; + bool bz2_{false}; + bool omitNodesets_{false}; bool omitSidesets_{false}; bool omitAssemblies_{false}; @@ -98,8 +109,7 @@ class SystemInterface bool ints64bit_{false}; bool useNetcdf4_{false}; bool ignoreElementIds_{false}; - bool zlib_{true}; - bool szip_{false}; + bool createAssemblies_{true}; std::string blockPrefix_{"p"}; diff --git a/packages/seacas/applications/ejoin/EJ_Version.h b/packages/seacas/applications/ejoin/EJ_Version.h index 9389859444c1..e90e9789568f 100644 --- a/packages/seacas/applications/ejoin/EJ_Version.h +++ b/packages/seacas/applications/ejoin/EJ_Version.h @@ -9,6 +9,6 @@ static const std::array qainfo{ "ejoin", - "2024/08/06", - "1.6.4", + "2024/08/29", + "1.6.5", }; diff --git a/packages/seacas/applications/ejoin/EJ_vector3d.C b/packages/seacas/applications/ejoin/EJ_vector3d.C index 4778bf3a3890..6bdc73954986 100644 --- a/packages/seacas/applications/ejoin/EJ_vector3d.C +++ b/packages/seacas/applications/ejoin/EJ_vector3d.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -7,17 +7,11 @@ #include "EJ_vector3d.h" #include -//---------------------------------------------------------------------------- -vector3d::vector3d() = default; - //---------------------------------------------------------------------------- vector3d::vector3d(double X, double Y, double Z) : x(X), y(Y), z(Z) {} //---------------------------------------------------------------------------- -vector3d::vector3d(double location[3]) : x(location[0]), y(location[1]), z(location[2]) {} - -//---------------------------------------------------------------------------- -vector3d::vector3d(const vector3d &from) = default; +vector3d::vector3d(const double location[3]) : x(location[0]), y(location[1]), z(location[2]) {} void vector3d::set(double X, double Y, double Z) { @@ -33,8 +27,6 @@ void vector3d::set(const double location[3]) z = location[2]; } -vector3d &vector3d::operator=(const vector3d &from) = default; - vector3d &vector3d::reverse() { x = -x; @@ -43,14 +35,14 @@ vector3d &vector3d::reverse() return *this; } -bool vector3d::operator==(const vector3d &from) const +bool operator==(const vector3d &lhs, const vector3d &rhs) { - return (x == from.x && y == from.y && z == from.z); + return (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z); } -bool vector3d::operator!=(const vector3d &from) const +bool operator!=(const vector3d &lhs, const vector3d &rhs) { - return (x != from.x || y != from.y || z != from.z); + return (lhs.x != rhs.x || lhs.y != rhs.y || lhs.z == rhs.z); } vector3d operator+(const vector3d &lhs, const vector3d &rhs) diff --git a/packages/seacas/applications/ejoin/EJ_vector3d.h b/packages/seacas/applications/ejoin/EJ_vector3d.h index 0afb3c9195b6..6dd4c6252f37 100644 --- a/packages/seacas/applications/ejoin/EJ_vector3d.h +++ b/packages/seacas/applications/ejoin/EJ_vector3d.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -8,17 +8,12 @@ class vector3d { public: - // construction - vector3d(); + vector3d() = default; vector3d(double X, double Y, double Z); - explicit vector3d(double location[3]); - vector3d(const vector3d &from); + explicit vector3d(const double location[3]); double x{}, y{}, z{}; - vector3d &operator=(const vector3d &from); - bool operator==(const vector3d &from) const; - bool operator!=(const vector3d &from) const; void set(double X, double Y, double Z); void set(const double location[3]); vector3d &reverse(); @@ -33,17 +28,20 @@ class vector3d vector3d &operator*=(double scalar); vector3d &operator/=(double scalar); + friend bool operator==(const vector3d &lhs, const vector3d &rhs); + friend bool operator!=(const vector3d &lhs, const vector3d &rhs); + + friend vector3d operator*(double scalar, const vector3d &from); + friend vector3d operator*(const vector3d &lhs, double scalar); + friend vector3d operator/(const vector3d &lhs, double scalar); + + friend vector3d operator+(const vector3d &lhs, const vector3d &rhs); + friend vector3d operator-(const vector3d &lhs, const vector3d &rhs); + double length() const; vector3d cross(const vector3d &from) const; }; -vector3d operator*(double scalar, const vector3d &from); -vector3d operator*(const vector3d &lhs, double scalar); -vector3d operator/(const vector3d &lhs, double scalar); - -vector3d operator+(const vector3d &lhs, const vector3d &rhs); -vector3d operator-(const vector3d &lhs, const vector3d &rhs); - //---------------------------------------------------------------------------- inline vector3d vector3d::cross(const vector3d &from) const { diff --git a/packages/seacas/applications/ejoin/EJoin.C b/packages/seacas/applications/ejoin/EJoin.C index 8cbbe7315c41..e21872a26882 100644 --- a/packages/seacas/applications/ejoin/EJoin.C +++ b/packages/seacas/applications/ejoin/EJoin.C @@ -31,6 +31,7 @@ #include #include #include +#include #include "EJ_CodeTypes.h" #include "EJ_SystemInterface.h" @@ -44,16 +45,22 @@ #endif namespace { + std::string tsFormat = "[%H:%M:%S] "; + unsigned int debug_level = 0; + bool valid_variable(const std::string &variable, size_t id, const StringIdVector &variable_list); - void define_global_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool check_variable_mismatch(const std::string &type, const StringIdVector &variable_list, + const Ioss::NameList &fields); + + bool define_global_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list); - void define_nodal_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_nodal_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list, SystemInterface &interFace); - void define_element_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_element_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list); - void define_nset_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_nset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list); - void define_sset_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_sset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list); void define_nodal_nodeset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list, SystemInterface &interFace); @@ -120,9 +127,6 @@ namespace { } } -} // namespace - -namespace { void transfer_elementblock(Ioss::Region ®ion, Ioss::Region &output_region, bool create_assemblies, bool debug); void transfer_assembly(const Ioss::Region ®ion, Ioss::Region &output_region, bool debug); @@ -138,17 +142,30 @@ namespace { void transfer_field_data_internal(Ioss::GroupingEntity *ige, Ioss::GroupingEntity *oge, const std::string &field_name); -} // namespace -std::string tsFormat = "[%H:%M:%S] "; + // Used when combining two or more input set into a single output set (WIP) + // May reequire other operations to completly combine the entities... + // This only handles the entity count. + void add_to_entity_count(Ioss::GroupingEntity *ge, int64_t entity_count_increment) + { + auto ec_property = ge->get_property("entity_count"); + auto old_count = ec_property.get_int(); + + auto origin = ec_property.get_origin(); + ge->property_erase("entity_count"); + ge->property_add(Ioss::Property("entity_count", entity_count_increment + old_count, origin)); -// prototypes + auto field_names = ge->field_describe(); + for (const auto &field_name : field_names) { + const auto &field_ref = ge->get_fieldref(field_name); + const_cast(field_ref).reset_count(entity_count_increment + old_count); + } + } +} // namespace template double ejoin(SystemInterface &interFace, std::vector &part_mesh, INT dummy); -unsigned int debug_level = 0; - int main(int argc, char *argv[]) { #ifdef SEACAS_HAVE_MPI @@ -292,15 +309,27 @@ double ejoin(SystemInterface &interFace, std::vector &part_mesh, properties.add(Ioss::Property("FILE_TYPE", "netcdf4")); } - if (interFace.compression_level() > 0 || interFace.szip()) { + if (interFace.compression_level() > 0 || interFace.szip() || interFace.quantize() || + interFace.zlib() || interFace.zstd() || interFace.bz2()) { properties.add(Ioss::Property("FILE_TYPE", "netcdf4")); properties.add(Ioss::Property("COMPRESSION_LEVEL", interFace.compression_level())); - properties.add(Ioss::Property("COMPRESSION_SHUFFLE", true)); - if (interFace.szip()) { + properties.add(Ioss::Property("COMPRESSION_SHUFFLE", 1)); + + if (interFace.zlib()) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + } + else if (interFace.szip()) { properties.add(Ioss::Property("COMPRESSION_METHOD", "szip")); } - else if (interFace.zlib()) { - properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + else if (interFace.zstd()) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zstd")); + } + else if (interFace.bz2()) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "bzip2")); + } + + if (interFace.quantize()) { + properties.add(Ioss::Property("COMPRESSION_QUANTIZE_NSD", interFace.quantize_nsd())); } } @@ -467,22 +496,29 @@ double ejoin(SystemInterface &interFace, std::vector &part_mesh, output_region.begin_mode(Ioss::STATE_DEFINE_TRANSIENT); - define_global_fields(output_region, part_mesh, interFace.global_var_names()); + bool error = false; + error |= define_global_fields(output_region, part_mesh, interFace.global_var_names()); - define_nodal_fields(output_region, part_mesh, interFace.node_var_names(), interFace); + error |= define_nodal_fields(output_region, part_mesh, interFace.node_var_names(), interFace); define_nodal_nodeset_fields(output_region, part_mesh, interFace.node_var_names(), interFace); - define_element_fields(output_region, part_mesh, interFace.elem_var_names()); + error |= define_element_fields(output_region, part_mesh, interFace.elem_var_names()); if (!interFace.omit_nodesets()) { - define_nset_fields(output_region, part_mesh, interFace.nset_var_names()); + error |= define_nset_fields(output_region, part_mesh, interFace.nset_var_names()); } if (!interFace.omit_sidesets()) { - define_sset_fields(output_region, part_mesh, interFace.sset_var_names()); + error |= define_sset_fields(output_region, part_mesh, interFace.sset_var_names()); } output_region.end_mode(Ioss::STATE_DEFINE_TRANSIENT); + if (error) { + fmt::print(stderr, + "ERROR: Specified field(s) (see above) were not found. Fix input and rerun.\n\n"); + exit(EXIT_FAILURE); + } + // Get database times... // Different parts can have either no times or the times must match //! \todo If ts_min, ts_max, ts_step is specified, then only check steps in that range... @@ -772,6 +808,8 @@ namespace { void define_nodal_nodeset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list, SystemInterface &interFace) { + // This routine does not check that all variables in `variable_list` have been + // found since the checking has already been done in define_nodal_fields. if (!variable_list.empty() && variable_list[0].first == "none") { return; } @@ -803,17 +841,27 @@ namespace { void transfer_nodesets(Ioss::Region ®ion, Ioss::Region &output_region, bool debug) { - const std::string &prefix = region.name(); + bool combine_similar = false; + const std::string &prefix = region.name(); const Ioss::NodeSetContainer &nss = region.get_nodesets(); for (const auto &ns : nss) { if (!entity_is_omitted(ns)) { std::string name = ns->name(); - if (output_region.get_nodeset(name) != nullptr) { - name = prefix + "_" + ns->name(); - if (output_region.get_nodeset(name) != nullptr) { - fmt::print(stderr, "ERROR: Duplicate node sets named '{}'\n", name); - exit(EXIT_FAILURE); + auto *ons = output_region.get_nodeset(name); + if (ons != nullptr) { + if (combine_similar) { + // Combine nodesets with similar names... + size_t count = ns->entity_count(); + add_to_entity_count(ons, count); + continue; + } + else { + name = prefix + "_" + ns->name(); + if (output_region.get_nodeset(name) != nullptr) { + fmt::print(stderr, "ERROR: Duplicate node sets named '{}'\n", name); + exit(EXIT_FAILURE); + } } } ns->property_add(Ioss::Property("name_in_output", name)); @@ -1328,11 +1376,12 @@ namespace { oge->put_field_data(field_name, data); } - void define_global_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_global_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list) { + bool error = false; if (!variable_list.empty() && variable_list[0].first == "none") { - return; + return error; } for (const auto &pm : part_mesh) { Ioss::NameList fields = pm->field_describe(Ioss::Field::REDUCTION); @@ -1343,13 +1392,23 @@ namespace { } } } + // Now that we have defined all fields, check `variable_list` and make + // sure that all fields that have been explicitly specified now exist + // on `output_region`... + if (!variable_list.empty() && variable_list[0].first != "all") { + // The user has specified at least one variable... + Ioss::NameList fields = output_region.field_describe(Ioss::Field::REDUCTION); + error = check_variable_mismatch("Global", variable_list, fields); + } + return error; } - void define_nodal_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_nodal_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list, SystemInterface &interFace) { + bool error = false; if (!variable_list.empty() && variable_list[0].first == "none") { - return; + return error; } Ioss::NodeBlock *onb = output_region.get_node_blocks()[0]; SMART_ASSERT(onb != nullptr); @@ -1369,15 +1428,28 @@ namespace { } } } + // Now that we have defined all fields, check `variable_list` and make + // sure that all fields that have been explicitly specified now exist + // on `output_region`... + if (!variable_list.empty() && variable_list[0].first != "all") { + // The user has specified at least one variable... + Ioss::NameList fields = onb->field_describe(Ioss::Field::REDUCTION); + error = check_variable_mismatch("Nodal", variable_list, fields); + } + return error; } - void define_element_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_element_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list) { + bool error = false; // Element Block Fields... if (!variable_list.empty() && variable_list[0].first == "none") { - return; + return error; } + bool subsetting_fields = !variable_list.empty() && variable_list[0].first != "all"; + Ioss::NameList defined_fields; + for (const auto &pm : part_mesh) { const Ioss::ElementBlockContainer &iebs = pm->get_element_blocks(); for (const auto &ieb : iebs) { @@ -1395,22 +1467,38 @@ namespace { if (valid_variable(field_name, id, variable_list)) { Ioss::Field field = ieb->get_field(field_name); oeb->field_add(std::move(field)); + if (subsetting_fields) { + defined_fields.push_back(field_name); + } } } } } } } + // Now that we have defined all fields, check `variable_list` and make + // sure that all fields that have been explicitly specified now exist + // on `output_region`... + if (subsetting_fields) { + // The user has specified at least one variable... + Ioss::Utils::uniquify(defined_fields); + error = check_variable_mismatch("Element", variable_list, defined_fields); + } + return error; } - void define_nset_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_nset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list) { + bool error = false; // Nodeset fields... if (!variable_list.empty() && variable_list[0].first == "none") { - return; + return error; } + bool subsetting_fields = !variable_list.empty() && variable_list[0].first != "all"; + Ioss::NameList defined_fields; + for (const auto &pm : part_mesh) { const Ioss::NodeSetContainer &ins = pm->get_nodesets(); for (const auto &in : ins) { @@ -1429,19 +1517,35 @@ namespace { if (valid_variable(field_name, id, variable_list)) { Ioss::Field field = in->get_field(field_name); ons->field_add(std::move(field)); + if (subsetting_fields) { + defined_fields.push_back(field_name); + } } } } } } + // Now that we have defined all fields, check `variable_list` and make + // sure that all fields that have been explicitly specified now exist + // on `output_region`... + if (subsetting_fields) { + // The user has specified at least one variable... + Ioss::Utils::uniquify(defined_fields); + error = check_variable_mismatch("Nodeset", variable_list, defined_fields); + } + return error; } - void define_sset_fields(Ioss::Region &output_region, RegionVector &part_mesh, + bool define_sset_fields(Ioss::Region &output_region, RegionVector &part_mesh, const StringIdVector &variable_list) { + bool error = false; if (!variable_list.empty() && variable_list[0].first == "none") { - return; + return error; } + bool subsetting_fields = !variable_list.empty() && variable_list[0].first != "all"; + Ioss::NameList defined_fields; + const auto &os = output_region.get_sidesets(); Ioss::SideBlockContainer out_eb; @@ -1469,6 +1573,9 @@ namespace { if (valid_variable(field_name, id, variable_list)) { Ioss::Field field = eb->get_field(field_name); (*II)->field_add(std::move(field)); + if (subsetting_fields) { + defined_fields.push_back(field_name); + } } } ++II; @@ -1476,6 +1583,15 @@ namespace { } } } + // Now that we have defined all fields, check `variable_list` and make + // sure that all fields that have been explicitly specified now exist + // on `output_region`... + if (subsetting_fields) { + // The user has specified at least one variable... + Ioss::Utils::uniquify(defined_fields); + error = check_variable_mismatch("Sideset", variable_list, defined_fields); + } + return error; } void transfer_fields(Ioss::GroupingEntity *ige, Ioss::GroupingEntity *oge, @@ -1516,6 +1632,25 @@ namespace { return false; } + bool check_variable_mismatch(const std::string &type, const StringIdVector &variable_list, + const Ioss::NameList &fields) + { + // Check all variables in `variable_list` and see if they are found in `fields` + if (variable_list.empty() || variable_list[0].first == "all") { + return false; // No error + } + + bool error = false; + for (const auto &var : variable_list) { + if (std::find(fields.begin(), fields.end(), var.first) == std::end(fields)) { + fmt::print(stderr, "ERROR: {} Variable '{}' was not found in the list of valid fields.\n", + type, var.first); + error = true; + } + } + return error; + } + void process_nset_omissions(RegionVector &part_mesh, const Omissions &omit) { size_t part_count = part_mesh.size(); diff --git a/packages/seacas/applications/epu/EP_ExodusFile.C b/packages/seacas/applications/epu/EP_ExodusFile.C index 5cf8f3e742b2..3ff4c5700729 100644 --- a/packages/seacas/applications/epu/EP_ExodusFile.C +++ b/packages/seacas/applications/epu/EP_ExodusFile.C @@ -360,8 +360,18 @@ bool Excn::ExodusFile::create_output(const SystemInterface &si, int cycle) else if (si.zlib()) { ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_ZLIB); } + else if (si.zstd()) { + ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_ZSTD); + } + else if (si.bz2()) { + ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_BZ2); + } ex_set_option(outputId_, EX_OPT_COMPRESSION_LEVEL, si.compress_data()); ex_set_option(outputId_, EX_OPT_COMPRESSION_SHUFFLE, 1); + + if (si.quantize()) { + ex_set_option(outputId_, EX_OPT_QUANTIZE_NSD, si.quantize_nsd()); + } } // EPU Can add a name of "processor_id_epu" which is 16 characters long. diff --git a/packages/seacas/applications/epu/EP_SystemInterface.C b/packages/seacas/applications/epu/EP_SystemInterface.C index ca97eb217f02..aafd4c1f3e94 100644 --- a/packages/seacas/applications/epu/EP_SystemInterface.C +++ b/packages/seacas/applications/epu/EP_SystemInterface.C @@ -162,9 +162,20 @@ void Excn::SystemInterface::enroll_options() options_.enroll("szip", GetLongOption::NoValue, "Use SZip compression. [exodus only, enables netcdf-4]", nullptr); - options_.enroll("compress_data", GetLongOption::MandatoryValue, - "The output database will be written using compression (netcdf-4 mode only).\n" - "\t\tValue ranges from 0..9 for zlib/gzip or even values 4..32 for szip.", + options_.enroll("zstd", GetLongOption::NoValue, + "Use Zstd compression. [exodus only, enables netcdf-4, experimental]", nullptr); + + options_.enroll("bzip2", GetLongOption::NoValue, + "Use Bzip2 compression. [exodus only, enables netcdf-4, experimental]", nullptr); + + options_.enroll("compress", GetLongOption::MandatoryValue, + "Specify the compression level to be used. Values depend on algorithm:\n" + "\t\tzlib/bzip2: 0..9\t\tszip: even, 4..32\t\tzstd: -131072..22", + nullptr); + + options_.enroll("quantize_nsd", GetLongOption::MandatoryValue, + "Use the lossy quantize compression method. Value specifies number of digits to " + "retain (1..15) [exodus only]", nullptr, nullptr, true); options_.enroll("append", GetLongOption::NoValue, @@ -383,17 +394,61 @@ bool Excn::SystemInterface::parse_options(int argc, char **argv) append_ = options_.retrieve("append") != nullptr; intIs64Bit_ = options_.retrieve("64") != nullptr; - if (options_.retrieve("szip") != nullptr) { - szip_ = true; - zlib_ = false; - } zlib_ = (options_.retrieve("zlib") != nullptr); + szip_ = (options_.retrieve("szip") != nullptr); + zstd_ = (options_.retrieve("zstd") != nullptr); + bz2_ = (options_.retrieve("bzip2") != nullptr); - if (szip_ && zlib_) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); + if ((szip_ ? 1 : 0) + (zlib_ ? 1 : 0) + (zstd_ ? 1 : 0) + (bz2_ ? 1 : 0) > 1) { + fmt::print(stderr, + "ERROR: Only one of 'szip' or 'zlib' or 'zstd' or 'bzip2' can be specified.\n"); } - compressData_ = options_.get_option_value("compress_data", compressData_); + { + const char *temp = options_.retrieve("compress"); + if (temp != nullptr) { + compressionLevel_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + + if (zlib_ || bz2_) { + if (compressionLevel_ < 0 || compressionLevel_ > 9) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 0 and 9 inclusive " + "for gzip/zlib compression.\n", + compressionLevel_); + return false; + } + } + else if (szip_) { + if (compressionLevel_ % 2 != 0) { + fmt::print( + stderr, + "ERROR: Bad compression level {}. Must be an even value for szip compression.\n", + compressionLevel_); + return false; + } + if (compressionLevel_ < 4 || compressionLevel_ > 32) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 4 and 32 inclusive " + "for szip compression.\n", + compressionLevel_); + return false; + } + } + } + } + + { + const char *temp = options_.retrieve("quantize_nsd"); + if (temp != nullptr) { + quantizeNSD_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + } + } sumSharedNodes_ = options_.retrieve("sum_shared_nodes") != nullptr; append_ = options_.retrieve("append") != nullptr; diff --git a/packages/seacas/applications/epu/EP_SystemInterface.h b/packages/seacas/applications/epu/EP_SystemInterface.h index f5b4c4159e64..42edd95120da 100644 --- a/packages/seacas/applications/epu/EP_SystemInterface.h +++ b/packages/seacas/applications/epu/EP_SystemInterface.h @@ -70,9 +70,13 @@ namespace Excn { bool omit_faceblocks() const { return omitFaceBlocks_; } bool int64() const { return intIs64Bit_; } void set_int64() const { intIs64Bit_ = true; } - int compress_data() const { return compressData_; } + int compress_data() const { return compressionLevel_; } bool zlib() const { return zlib_; } bool szip() const { return szip_; } + bool zstd() const { return zstd_; } + bool bz2() const { return bz2_; } + int quantize_nsd() const { return quantizeNSD_; } + bool quantize() const { return quantizeNSD_ > 0; } bool subcycle_join() const { return subcycleJoin_; } bool output_shared_nodes() const { return outputSharedNodes_; } bool is_auto() const { return auto_; } @@ -137,10 +141,13 @@ namespace Excn { int stepInterval_{1}; int subcycle_{-1}; int cycle_{-1}; - int compressData_{0}; + int compressionLevel_{0}; + int quantizeNSD_{0}; int maxOpenFiles_{0}; - bool zlib_{true}; + bool zlib_{false}; bool szip_{false}; + bool zstd_{false}; + bool bz2_{false}; bool sumSharedNodes_{false}; bool addProcessorIdField_{false}; bool addProcessorIdMap_{false}; diff --git a/packages/seacas/applications/epu/epu.C b/packages/seacas/applications/epu/epu.C index 79134fd827b7..dd5d6cdae1f4 100644 --- a/packages/seacas/applications/epu/epu.C +++ b/packages/seacas/applications/epu/epu.C @@ -1452,13 +1452,14 @@ int epu(SystemInterface &interFace, int start_part, int part_count, int cycle, T } for (int ig = 0; ig < global_vars.count(InOut::IN); ig++) { if (proc_global_values[ig] != global_values[ig]) { - fmt::print(stderr, - fmt::runtime("At step {:{}}, Global Variable {:{}}, P{:0{}} = {:15.8g}, P{:0{}} = " - "{:15.8g}\n"), - time_step + 1, ts_max + 1, ig + 1, - get_width(global_vars.count(InOut::IN)), start_part, - get_width(interFace.processor_count()), start_part + p, - get_width(interFace.processor_count()), proc_global_values[ig]); + fmt::print( + stderr, + fmt::runtime( + "At step {:{}}, Global Variable {:{}}, P{:0{}} = {:15.8g}, P{:0{}} = " + "{:15.8g}\n"), + time_step + 1, ts_max + 1, ig + 1, get_width(global_vars.count(InOut::IN)), + start_part, get_width(interFace.processor_count()), start_part + p, + get_width(interFace.processor_count()), proc_global_values[ig]); } } } diff --git a/packages/seacas/applications/exodiff/CMakeLists.txt b/packages/seacas/applications/exodiff/CMakeLists.txt index c508246c1367..60cc07f945c4 100644 --- a/packages/seacas/applications/exodiff/CMakeLists.txt +++ b/packages/seacas/applications/exodiff/CMakeLists.txt @@ -18,7 +18,7 @@ SET(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/ED_SystemInterface.C ${CMAKE_CURRENT_SOURCE_DIR}/node_set.C ${CMAKE_CURRENT_SOURCE_DIR}/edge_block.C ${CMAKE_CURRENT_SOURCE_DIR}/side_set.C - ${CMAKE_CURRENT_SOURCE_DIR}/exoII_read.C + ${CMAKE_CURRENT_SOURCE_DIR}/exo_read.C ${CMAKE_CURRENT_SOURCE_DIR}/stringx.C ${CMAKE_CURRENT_SOURCE_DIR}/exo_block.C ${CMAKE_CURRENT_SOURCE_DIR}/util.C) diff --git a/packages/seacas/applications/exodiff/ED_SystemInterface.C b/packages/seacas/applications/exodiff/ED_SystemInterface.C index 44d5dce68784..5c68c68cebf5 100644 --- a/packages/seacas/applications/exodiff/ED_SystemInterface.C +++ b/packages/seacas/applications/exodiff/ED_SystemInterface.C @@ -31,8 +31,7 @@ namespace { } std::string Parse_Variables(std::string xline, std::ifstream &cmd_file, bool &all_flag, - Tolerance &def_tol, std::vector &names, - std::vector &toler); + Tolerance &def_tol, NameList &names, std::vector &toler); bool str_equal(const std::string &s1, const std::string &s2) { @@ -137,7 +136,7 @@ namespace { } } - void Check_Parsed_Names(const std::vector &names, bool &all_flag) + void Check_Parsed_Names(const NameList &names, bool &all_flag) { int num_include = 0; int num_exclude = 0; @@ -326,13 +325,6 @@ void SystemInterface::enroll_options() options_.enroll("ignore_steps", GetLongOption::NoValue, "Don't compare any transient data; compare mesh only.", nullptr); - options_.enroll( - "x", GetLongOption::MandatoryValue, - "Exclude time steps. Does not consider the time steps given in the list of integers.\n" - "\t\tThe format is comma-separated and ranged integers (with no spaces), such as " - "\"1,5-9,28\".\n" - "\t\tThe first time step is the number '1'.", - nullptr); options_.enroll( "exclude", GetLongOption::MandatoryValue, "Exclude time steps. Does not consider the time steps given in the list of integers.\n" @@ -496,6 +488,8 @@ void SystemInterface::enroll_options() nullptr); options_.enroll("T", GetLongOption::MandatoryValue, "Backward-compatible option for -TimeStepOffset", nullptr); + options_.enroll("x", GetLongOption::MandatoryValue, "Backward-compatible option for -exclude", + nullptr); } bool SystemInterface::parse_options(int argc, char **argv) @@ -662,7 +656,7 @@ bool SystemInterface::parse_options(int argc, char **argv) if (temp != nullptr) { // temp should be of the form : where ts# is either a timestep number // (1-based) or 'last' - std::vector tokens = SLIB::tokenize(temp, ":"); + NameList tokens = SLIB::tokenize(temp, ":"); if (tokens.size() == 2) { if (str_equal(tokens[0], "last")) { explicit_steps.first = -1; @@ -1380,8 +1374,7 @@ void SystemInterface::Parse_Command_File() namespace { std::string Parse_Variables(std::string xline, std::ifstream &cmd_file, bool &all_flag, - Tolerance &def_tol, std::vector &names, - std::vector &toler) + Tolerance &def_tol, NameList &names, std::vector &toler) { toler.clear(); names.clear(); diff --git a/packages/seacas/applications/exodiff/ED_SystemInterface.h b/packages/seacas/applications/exodiff/ED_SystemInterface.h index f78794d70bdd..e186a793984a 100644 --- a/packages/seacas/applications/exodiff/ED_SystemInterface.h +++ b/packages/seacas/applications/exodiff/ED_SystemInterface.h @@ -48,37 +48,37 @@ class SystemInterface int max_warnings{100}; - std::vector glob_var_names{}; - Tolerance glob_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector glob_var{}; + NameList glob_var_names{}; + Tolerance glob_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector glob_var{}; - std::vector node_var_names{}; - Tolerance node_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector node_var{}; + NameList node_var_names{}; + Tolerance node_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector node_var{}; - std::vector elmt_var_names{}; - Tolerance elmt_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector elmt_var{}; + NameList elmt_var_names{}; + Tolerance elmt_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector elmt_var{}; - std::vector elmt_att_names{}; - Tolerance elmt_att_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector elmt_att{}; + NameList elmt_att_names{}; + Tolerance elmt_att_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector elmt_att{}; - std::vector ns_var_names{}; - Tolerance ns_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector ns_var{}; + NameList ns_var_names{}; + Tolerance ns_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector ns_var{}; - std::vector ss_var_names{}; - Tolerance ss_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector ss_var{}; + NameList ss_var_names{}; + Tolerance ss_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector ss_var{}; - std::vector eb_var_names{}; - Tolerance eb_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector eb_var{}; + NameList eb_var_names{}; + Tolerance eb_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector eb_var{}; - std::vector fb_var_names{}; - Tolerance fb_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; - std::vector fb_var{}; + NameList fb_var_names{}; + Tolerance fb_var_default{ToleranceMode::RELATIVE_, 1.0e-6, 0.0}; + std::vector fb_var{}; // time step exclusion data std::vector exclude_steps{}; diff --git a/packages/seacas/applications/exodiff/assembly.h b/packages/seacas/applications/exodiff/assembly.h index 838db12bcc40..3bf079bd920f 100644 --- a/packages/seacas/applications/exodiff/assembly.h +++ b/packages/seacas/applications/exodiff/assembly.h @@ -10,7 +10,7 @@ #include -template class ExoII_Read; +template class Exo_Read; template class Assembly : public Exo_Entity { @@ -36,5 +36,5 @@ template class Assembly : public Exo_Entity ex_entity_type assembly_type{EX_INVALID}; std::vector entities{}; - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/check.C b/packages/seacas/applications/exodiff/check.C index d6d0bc4fe70c..7578917e2f3e 100644 --- a/packages/seacas/applications/exodiff/check.C +++ b/packages/seacas/applications/exodiff/check.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -12,8 +12,8 @@ #include "ED_SystemInterface.h" #include "Tolerance.h" #include "assembly.h" -#include "exoII_read.h" #include "exo_block.h" +#include "exo_read.h" #include "exodusII.h" #include "fmt/ostream.h" #include "fmt/ranges.h" @@ -25,17 +25,17 @@ namespace { template - bool Check_Nodal(ExoII_Read &file1, ExoII_Read &file2, const std::vector &node_map, + bool Check_Nodal(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const INT *id_map, bool check_only); template - bool Check_Element_Block(ExoII_Read &file1, ExoII_Read &file2, + bool Check_Element_Block(Exo_Read &file1, Exo_Read &file2, const std::vector &elmt_map, const std::vector &node_map); template - bool Check_Nodeset(ExoII_Read &file1, ExoII_Read &file2, - const std::vector &node_map, bool check_only); + bool Check_Nodeset(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, + bool check_only); template - bool Check_Sideset(ExoII_Read &file1, ExoII_Read &file2, - const std::vector &elmt_map, bool check_only); + bool Check_Sideset(Exo_Read &file1, Exo_Read &file2, const std::vector &elmt_map, + bool check_only); template bool Check_Element_Block_Params(const Exo_Block *block1, const Exo_Block *block2); @@ -43,13 +43,13 @@ namespace { bool Check_Element_Block_Connectivity(Exo_Block *block1, Exo_Block *block2, const std::vector &elmt_map, const std::vector &node_map); - template bool Check_Assembly(ExoII_Read &file1, ExoII_Read &file2); + template bool Check_Assembly(Exo_Read &file1, Exo_Read &file2); template bool Check_Assembly_Params(const Assembly *assembly1, const Assembly *assembly2); bool close_compare(const std::string &st1, const std::string &st2); } // namespace -template bool Check_Global(ExoII_Read &file1, ExoII_Read &file2) +template bool Check_Global(Exo_Read &file1, Exo_Read &file2) { bool is_same = true; if (file1.Dimension() != file2.Dimension()) { @@ -82,7 +82,7 @@ template bool Check_Global(ExoII_Read &file1, ExoII_Read -void Check_Compatible_Meshes(ExoII_Read &file1, ExoII_Read &file2, bool check_only, +void Check_Compatible_Meshes(Exo_Read &file1, Exo_Read &file2, bool check_only, const std::vector &node_map, const std::vector &elmt_map, const INT *node_id_map) { @@ -124,7 +124,7 @@ void Check_Compatible_Meshes(ExoII_Read &file1, ExoII_Read &file2, boo namespace { template - bool Check_Nodal(ExoII_Read &file1, ExoII_Read &file2, const std::vector &node_map, + bool Check_Nodal(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const INT *id_map, bool check_only) { bool is_same = true; @@ -204,7 +204,7 @@ namespace { } template - bool Check_Element_Block(ExoII_Read &file1, ExoII_Read &file2, + bool Check_Element_Block(Exo_Read &file1, Exo_Read &file2, const std::vector &elmt_map, const std::vector &node_map) { bool is_same = true; @@ -244,7 +244,7 @@ namespace { return is_same; } - template bool Check_Assembly(ExoII_Read &file1, ExoII_Read &file2) + template bool Check_Assembly(Exo_Read &file1, Exo_Read &file2) { bool is_same = true; if (file1.Num_Assembly() != file2.Num_Assembly()) { @@ -479,8 +479,8 @@ namespace { } template - bool Check_Nodeset(ExoII_Read &file1, ExoII_Read &file2, - const std::vector &node_map, bool /*unused*/) + bool Check_Nodeset(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, + bool /*unused*/) { // Currently don't set diff flag for most of these since we // can continue (somewhat) with these differences... @@ -605,8 +605,8 @@ namespace { } template - bool Check_Sideset(ExoII_Read &file1, ExoII_Read &file2, - const std::vector &elmt_map, bool /*unused*/) + bool Check_Sideset(Exo_Read &file1, Exo_Read &file2, const std::vector &elmt_map, + bool /*unused*/) { // Currently don't set diff flag for most of these since we // can continue (somewhat) with these differences... @@ -781,13 +781,13 @@ namespace { } } // namespace -template bool Check_Global(ExoII_Read &file1, ExoII_Read &file2); -template void Check_Compatible_Meshes(ExoII_Read &file1, ExoII_Read &file2, - bool check_only, const std::vector &node_map, +template bool Check_Global(Exo_Read &file1, Exo_Read &file2); +template void Check_Compatible_Meshes(Exo_Read &file1, Exo_Read &file2, bool check_only, + const std::vector &node_map, const std::vector &elmt_map, const int *node_id_map); -template bool Check_Global(ExoII_Read &file1, ExoII_Read &file2); -template void Check_Compatible_Meshes(ExoII_Read &file1, ExoII_Read &file2, +template bool Check_Global(Exo_Read &file1, Exo_Read &file2); +template void Check_Compatible_Meshes(Exo_Read &file1, Exo_Read &file2, bool check_only, const std::vector &node_map, const std::vector &elmt_map, const int64_t *node_id_map); diff --git a/packages/seacas/applications/exodiff/create_file.C b/packages/seacas/applications/exodiff/create_file.C index df52f5de01ea..c23fc192c1e6 100644 --- a/packages/seacas/applications/exodiff/create_file.C +++ b/packages/seacas/applications/exodiff/create_file.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -17,29 +17,28 @@ #include // for nullptr #include // for string, char_traits, etc #include // for vector -template class ExoII_Read; +template class Exo_Read; namespace { - void build_variable_names(const char *type, std::vector &names, - std::vector &tols, const Tolerance &default_tol, - bool do_all_flag, const std::vector &var_names1, - const std::vector &var_names2, bool *diff_found); + void build_variable_names(const char *type, NameList &names, std::vector &tols, + const Tolerance &default_tol, bool do_all_flag, + const NameList &var_names1, const NameList &var_names2, + bool *diff_found); template - void build_truth_table(EXOTYPE type, const char *label, std::vector &names, - size_t num_entity, ExoII_Read &file1, ExoII_Read &file2, - const std::vector &var_names1, - const std::vector &var_names2, std::vector &truth_tab, - bool quiet_flag, bool *diff_found); - - void output_exodus_names(int file_id, EXOTYPE type, const std::vector &names); - void output_diff_names(const char *type, const std::vector &names); - void output_compare_names(const char *type, const std::vector &names, + void build_truth_table(EXOTYPE type, const char *label, NameList &names, size_t num_entity, + Exo_Read &file1, Exo_Read &file2, const NameList &var_names1, + const NameList &var_names2, std::vector &truth_tab, bool quiet_flag, + bool *diff_found); + + void output_exodus_names(int file_id, EXOTYPE type, const NameList &names); + void output_diff_names(const char *type, const NameList &names); + void output_compare_names(const char *type, const NameList &names, const std::vector &tol, int num_vars1, int num_vars2); } // namespace template -void Build_Variable_Names(ExoII_Read &file1, ExoII_Read &file2, bool *diff_found) +void Build_Variable_Names(Exo_Read &file1, Exo_Read &file2, bool *diff_found) { // Build (and compare) global variable names. build_variable_names("global", interFace.glob_var_names, interFace.glob_var, @@ -85,7 +84,7 @@ void Build_Variable_Names(ExoII_Read &file1, ExoII_Read &file2, bool * } template -int Create_File(ExoII_Read &file1, ExoII_Read &file2, const std::string &diffile_name, +int Create_File(Exo_Read &file1, Exo_Read &file2, const std::string &diffile_name, bool *diff_found) { // Multiple modes: @@ -261,7 +260,7 @@ int Create_File(ExoII_Read &file1, ExoII_Read &file2, const std::strin } namespace { - void output_exodus_names(int file_id, EXOTYPE type, const std::vector &names) + void output_exodus_names(int file_id, EXOTYPE type, const NameList &names) { if (!names.empty()) { std::vector vars(names.size()); @@ -272,7 +271,7 @@ namespace { } } - void output_compare_names(const char *type, const std::vector &names, + void output_compare_names(const char *type, const NameList &names, const std::vector &tol, int num_vars1, int num_vars2) { if (!names.empty()) { @@ -296,7 +295,7 @@ namespace { } } - void output_diff_names(const char *type, const std::vector &names) + void output_diff_names(const char *type, const NameList &names) { if (!names.empty()) { fmt::print("{} variables to be differenced:\n", type); @@ -309,12 +308,12 @@ namespace { } } - void build_variable_names(const char *type, std::vector &names, - std::vector &tols, const Tolerance &default_tol, - bool do_all_flag, const std::vector &var_names1, - const std::vector &var_names2, bool *diff_found) + void build_variable_names(const char *type, NameList &names, std::vector &tols, + const Tolerance &default_tol, bool do_all_flag, + const NameList &var_names1, const NameList &var_names2, + bool *diff_found) { - std::vector x_list; // exclusion list + NameList x_list; // exclusion list for (auto name : names) { chop_whitespace(name); SMART_ASSERT(!name.empty()); @@ -380,8 +379,8 @@ namespace { } } - std::vector tmp_list; - std::vector tmp_tols; + NameList tmp_list; + std::vector tmp_tols; for (size_t n = 0; n < names.size(); ++n) { std::string name = names[n]; chop_whitespace(name); @@ -425,11 +424,10 @@ namespace { } template - void build_truth_table(EXOTYPE type, const char *label, std::vector &names, - size_t num_entity, ExoII_Read &file1, ExoII_Read &file2, - const std::vector &var_names1, - const std::vector &var_names2, std::vector &truth_tab, - bool quiet_flag, bool *diff_found) + void build_truth_table(EXOTYPE type, const char *label, NameList &names, size_t num_entity, + Exo_Read &file1, Exo_Read &file2, const NameList &var_names1, + const NameList &var_names2, std::vector &truth_tab, bool quiet_flag, + bool *diff_found) { if (!names.empty()) { int num_vars = names.size(); @@ -500,12 +498,11 @@ namespace { } } // End of namespace -template int Create_File(ExoII_Read &file1, ExoII_Read &file2, +template int Create_File(Exo_Read &file1, Exo_Read &file2, const std::string &diffile_name, bool *diff_found); -template void Build_Variable_Names(ExoII_Read &file1, ExoII_Read &file2, - bool *diff_found); +template void Build_Variable_Names(Exo_Read &file1, Exo_Read &file2, bool *diff_found); -template int Create_File(ExoII_Read &file1, ExoII_Read &file2, +template int Create_File(Exo_Read &file1, Exo_Read &file2, const std::string &diffile_name, bool *diff_found); -template void Build_Variable_Names(ExoII_Read &file1, ExoII_Read &file2, +template void Build_Variable_Names(Exo_Read &file1, Exo_Read &file2, bool *diff_found); diff --git a/packages/seacas/applications/exodiff/edge_block.C b/packages/seacas/applications/exodiff/edge_block.C index 6696ecdf980a..afc198e2e2fa 100644 --- a/packages/seacas/applications/exodiff/edge_block.C +++ b/packages/seacas/applications/exodiff/edge_block.C @@ -50,12 +50,13 @@ template void Edge_Block::entity_load_params() if (num_edges_per_elmt < 0 || num_attr < 0) { Error(fmt::format( - fmt::runtime("Edge_Block::entity_load_params(): Data appears corrupt for edge block {}!\n" - "\tnum elmts = {}\n" - "\tnum edges per elmt = {}\n" - "\tnum attributes = {}\n" - " ... Aborting...\n"), - fmt::group_digits(numEntity), num_edges_per_elmt, num_attr)); + fmt::runtime( + "Edge_Block::entity_load_params(): Data appears corrupt for edge block {}!\n" + "\tnum elmts = {}\n" + "\tnum edges per elmt = {}\n" + "\tnum attributes = {}\n" + " ... Aborting...\n"), + fmt::group_digits(numEntity), num_edges_per_elmt, num_attr)); } } diff --git a/packages/seacas/applications/exodiff/edge_block.h b/packages/seacas/applications/exodiff/edge_block.h index f730cd914864..868196261ab9 100644 --- a/packages/seacas/applications/exodiff/edge_block.h +++ b/packages/seacas/applications/exodiff/edge_block.h @@ -8,7 +8,7 @@ #include "exo_entity.h" #include -template class ExoII_Read; +template class Exo_Read; template class Edge_Block : public Exo_Entity { @@ -34,5 +34,5 @@ template class Edge_Block : public Exo_Entity std::string elmt_type{}; int num_edges_per_elmt{-1}; - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/exo_block.C b/packages/seacas/applications/exodiff/exo_block.C index 4eb93464c746..072936673afe 100644 --- a/packages/seacas/applications/exodiff/exo_block.C +++ b/packages/seacas/applications/exodiff/exo_block.C @@ -53,12 +53,13 @@ template void Exo_Block::entity_load_params() elmt_type = block.topology; if (num_nodes_per_elmt < 0 || num_attr < 0) { - Error(fmt::format(fmt::runtime("Exo_Block::entity_load_params(): Data appears corrupt for block {}!\n" - "\tnum elmts = {}\n" - "\tnum nodes per elmt = {}\n" - "\tnum attributes = {}\n" - " ... Aborting...\n"), - fmt::group_digits(numEntity), num_nodes_per_elmt, num_attr)); + Error(fmt::format( + fmt::runtime("Exo_Block::entity_load_params(): Data appears corrupt for block {}!\n" + "\tnum elmts = {}\n" + "\tnum nodes per elmt = {}\n" + "\tnum attributes = {}\n" + " ... Aborting...\n"), + fmt::group_digits(numEntity), num_nodes_per_elmt, num_attr)); } } diff --git a/packages/seacas/applications/exodiff/exo_block.h b/packages/seacas/applications/exodiff/exo_block.h index 25496a522144..c55c29cc3d78 100644 --- a/packages/seacas/applications/exodiff/exo_block.h +++ b/packages/seacas/applications/exodiff/exo_block.h @@ -6,11 +6,13 @@ #pragma once #include "exo_entity.h" +#include "util.h" + #include #include -template class ExoII_Read; +template class Exo_Read; template class Exo_Block : public Exo_Entity { @@ -49,5 +51,5 @@ template class Exo_Block : public Exo_Entity int64_t offset_{0}; std::vector conn{}; // Array; holds a matrix, num_elmts by num_nodes_per_elmt. - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/exo_entity.C b/packages/seacas/applications/exodiff/exo_entity.C index a8907ad8962e..e8efe4d953e6 100644 --- a/packages/seacas/applications/exodiff/exo_entity.C +++ b/packages/seacas/applications/exodiff/exo_entity.C @@ -359,7 +359,7 @@ void Exo_Entity::internal_load_params() int err = ex_get_attr_names(fileId, exodus_type(), id_, names); if (err < 0) { Error(fmt::format( - "ExoII_Read::Get_Init_Data(): Failed to get {} attribute names! Aborting...\n", + "Exo_Read::Get_Init_Data(): Failed to get {} attribute names! Aborting...\n", label())); } diff --git a/packages/seacas/applications/exodiff/exo_entity.h b/packages/seacas/applications/exodiff/exo_entity.h index c6fdf920f286..055df6aadb61 100644 --- a/packages/seacas/applications/exodiff/exo_entity.h +++ b/packages/seacas/applications/exodiff/exo_entity.h @@ -5,6 +5,8 @@ // See packages/seacas/LICENSE for details #pragma once +#include "util.h" + #include #include #include @@ -20,7 +22,7 @@ using EXOTYPE = int; using EXOTYPE = int; #endif -template class ExoII_Read; +template class Exo_Read; class Exo_Entity { @@ -52,10 +54,10 @@ class Exo_Entity const double *Get_Attributes(int attr_index) const; void Free_Attributes(); - const std::string &Get_Attribute_Name(int attr_index) const; - const std::string &Name() const { return name_; } - const std::vector &Attribute_Names() const { return attributeNames; } - int Find_Attribute_Index(const std::string &name) const; + const std::string &Get_Attribute_Name(int attr_index) const; + const std::string &Name() const { return name_; } + const NameList &Attribute_Names() const { return attributeNames; } + int Find_Attribute_Index(const std::string &name) const; // Return "Element Block", "Nodeset", "Sideset, depending on underlying type. virtual const char *label() const = 0; @@ -90,7 +92,7 @@ class Exo_Entity int numAttr{0}; // Total number of attributes in the file. std::vector attributes_{}; // Array of pointers (length numAttr) // to arrays of attributes (length num_entity). - std::vector attributeNames{}; + NameList attributeNames{}; - template friend class ExoII_Read; + template friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/exoII_read.C b/packages/seacas/applications/exodiff/exo_read.C similarity index 83% rename from packages/seacas/applications/exodiff/exoII_read.C rename to packages/seacas/applications/exodiff/exo_read.C index 00fb6981b106..ce1bb2505339 100644 --- a/packages/seacas/applications/exodiff/exoII_read.C +++ b/packages/seacas/applications/exodiff/exo_read.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -7,8 +7,8 @@ #include "ED_SystemInterface.h" // for SystemInterface, etc #include "assembly.h" #include "edge_block.h" // for Edge_Block -#include "exoII_read.h" #include "exo_block.h" // for Exo_Block +#include "exo_read.h" #include "exodusII.h" // for ex_init_params, ex_opts, etc #include "face_block.h" // for Face_Block #include "fmt/ostream.h" @@ -32,13 +32,11 @@ namespace { std::vector &varlist); } // namespace -template ExoII_Read::ExoII_Read() = default; +template Exo_Read::Exo_Read() = default; -template ExoII_Read::ExoII_Read(std::string fname) : file_name(std::move(fname)) -{ -} +template Exo_Read::Exo_Read(std::string fname) : file_name(std::move(fname)) {} -template ExoII_Read::~ExoII_Read() +template Exo_Read::~Exo_Read() { try { SMART_ASSERT(Check_State()); @@ -46,7 +44,7 @@ template ExoII_Read::~ExoII_Read() if (file_id >= 0) { std::string err = Close_File(); if (!err.empty()) { - Error(fmt::format("ExoII_Read destructor(): closing file: \"{}\"\n", err)); + Error(fmt::format("Exo_Read destructor(): closing file: \"{}\"\n", err)); } } @@ -54,7 +52,6 @@ template ExoII_Read::~ExoII_Read() delete[] nsets; delete[] ssets; delete[] nodes; - delete[] times; delete[] edge_blocks; delete[] face_blocks; delete[] assemblies; @@ -69,13 +66,12 @@ template ExoII_Read::~ExoII_Read() delete[] global_vals2; delete[] node_map; delete[] elmt_map; - delete[] elmt_order; } catch (...) { } } -template std::string ExoII_Read::Close_File() +template std::string Exo_Read::Close_File() { SMART_ASSERT(Check_State()); @@ -85,7 +81,7 @@ template std::string ExoII_Read::Close_File() int err = ex_close(file_id); if (err < 0) { - Error(fmt::format("ExoII_Read::Close_File(): {}: Unable to close file! Aborting...\n", err)); + Error(fmt::format("Exo_Read::Close_File(): {}: Unable to close file! Aborting...\n", err)); } if (err > 0) { return fmt::format("WARNING: {} issued upon close", err); @@ -96,63 +92,63 @@ template std::string ExoII_Read::Close_File() return ""; } -template double ExoII_Read::Time(int time_num) const +template double Exo_Read::Time(int time_num) const { SMART_ASSERT(Check_State()); - SMART_ASSERT(time_num > 0 && time_num <= num_times)(time_num)(num_times); + SMART_ASSERT(time_num > 0 && time_num <= Num_Times())(time_num)(Num_Times()); return times[time_num - 1]; } -template const std::string &ExoII_Read::Global_Var_Name(int index) const +template const std::string &Exo_Read::Global_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < global_vars.size()); return global_vars[index]; } -template const std::string &ExoII_Read::Nodal_Var_Name(int index) const +template const std::string &Exo_Read::Nodal_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < nodal_vars.size()); return nodal_vars[index]; } -template const std::string &ExoII_Read::Element_Var_Name(int index) const +template const std::string &Exo_Read::Element_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < elmt_vars.size()); return elmt_vars[index]; } -template const std::string &ExoII_Read::Element_Att_Name(int index) const +template const std::string &Exo_Read::Element_Att_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < elmt_atts.size()); return elmt_atts[index]; } -template const std::string &ExoII_Read::NS_Var_Name(int index) const +template const std::string &Exo_Read::NS_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < ns_vars.size()); return ns_vars[index]; } -template const std::string &ExoII_Read::SS_Var_Name(int index) const +template const std::string &Exo_Read::SS_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < ss_vars.size()); return ss_vars[index]; } -template const std::string &ExoII_Read::EB_Var_Name(int index) const +template const std::string &Exo_Read::EB_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < eb_vars.size()); return eb_vars[index]; } -template const std::string &ExoII_Read::FB_Var_Name(int index) const +template const std::string &Exo_Read::FB_Var_Name(int index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(index >= 0 && (unsigned)index < fb_vars.size()); @@ -160,14 +156,14 @@ template const std::string &ExoII_Read::FB_Var_Name(int inde } template -Exo_Block *ExoII_Read::Get_Element_Block_by_Index(size_t block_index) const +Exo_Block *Exo_Read::Get_Element_Block_by_Index(size_t block_index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(block_index < num_elmt_blocks); return &eblocks[block_index]; } -template Exo_Block *ExoII_Read::Get_Element_Block_by_Id(size_t id) const +template Exo_Block *Exo_Read::Get_Element_Block_by_Id(size_t id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_elmt_blocks; i++) { @@ -179,7 +175,7 @@ template Exo_Block *ExoII_Read::Get_Element_Block_by_Id } template -Exo_Block *ExoII_Read::Get_Element_Block_by_Name(const std::string &name) const +Exo_Block *Exo_Read::Get_Element_Block_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_elmt_blocks; i++) { @@ -191,7 +187,7 @@ Exo_Block *ExoII_Read::Get_Element_Block_by_Name(const std::string &na } template -Assembly *ExoII_Read::Get_Assembly_by_Index(size_t block_index) const +Assembly *Exo_Read::Get_Assembly_by_Index(size_t block_index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(block_index < num_assemblies); @@ -199,7 +195,7 @@ Assembly *ExoII_Read::Get_Assembly_by_Index(size_t block_index) const } template -Assembly *ExoII_Read::Get_Assembly_by_Name(const std::string &name) const +Assembly *Exo_Read::Get_Assembly_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_assemblies; i++) { @@ -210,7 +206,7 @@ Assembly *ExoII_Read::Get_Assembly_by_Name(const std::string &name) co return nullptr; } -template Assembly *ExoII_Read::Get_Assembly_by_Id(size_t set_id) const +template Assembly *Exo_Read::Get_Assembly_by_Id(size_t set_id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_assemblies; i++) { @@ -222,7 +218,7 @@ template Assembly *ExoII_Read::Get_Assembly_by_Id(size_ } template -Exo_Entity *ExoII_Read::Get_Entity_by_Index(EXOTYPE type, size_t block_index) const +Exo_Entity *Exo_Read::Get_Entity_by_Index(EXOTYPE type, size_t block_index) const { SMART_ASSERT(Check_State()); @@ -237,7 +233,7 @@ Exo_Entity *ExoII_Read::Get_Entity_by_Index(EXOTYPE type, size_t block_inde } } -template Exo_Entity *ExoII_Read::Get_Entity_by_Id(EXOTYPE type, size_t id) const +template Exo_Entity *Exo_Read::Get_Entity_by_Id(EXOTYPE type, size_t id) const { SMART_ASSERT(Check_State()); switch (type) { @@ -289,7 +285,7 @@ template Exo_Entity *ExoII_Read::Get_Entity_by_Id(EXOTYPE ty } template -Exo_Entity *ExoII_Read::Get_Entity_by_Name(EXOTYPE type, const std::string &name) const +Exo_Entity *Exo_Read::Get_Entity_by_Name(EXOTYPE type, const std::string &name) const { SMART_ASSERT(Check_State()); switch (type) { @@ -340,7 +336,7 @@ Exo_Entity *ExoII_Read::Get_Entity_by_Name(EXOTYPE type, const std::string return nullptr; } -template Node_Set *ExoII_Read::Get_Node_Set_by_Id(size_t set_id) const +template Node_Set *Exo_Read::Get_Node_Set_by_Id(size_t set_id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_node_sets; i++) { @@ -352,7 +348,7 @@ template Node_Set *ExoII_Read::Get_Node_Set_by_Id(size_ } template -Node_Set *ExoII_Read::Get_Node_Set_by_Name(const std::string &name) const +Node_Set *Exo_Read::Get_Node_Set_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_node_sets; i++) { @@ -363,7 +359,7 @@ Node_Set *ExoII_Read::Get_Node_Set_by_Name(const std::string &name) co return nullptr; } -template Side_Set *ExoII_Read::Get_Side_Set_by_Id(size_t set_id) const +template Side_Set *Exo_Read::Get_Side_Set_by_Id(size_t set_id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_side_sets; i++) { @@ -375,7 +371,7 @@ template Side_Set *ExoII_Read::Get_Side_Set_by_Id(size_ } template -Side_Set *ExoII_Read::Get_Side_Set_by_Name(const std::string &name) const +Side_Set *Exo_Read::Get_Side_Set_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_side_sets; i++) { @@ -386,8 +382,7 @@ Side_Set *ExoII_Read::Get_Side_Set_by_Name(const std::string &name) co return nullptr; } -template -Edge_Block *ExoII_Read::Get_Edge_Block_by_Id(size_t block_id) const +template Edge_Block *Exo_Read::Get_Edge_Block_by_Id(size_t block_id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_edge_blocks; i++) { @@ -399,7 +394,7 @@ Edge_Block *ExoII_Read::Get_Edge_Block_by_Id(size_t block_id) const } template -Edge_Block *ExoII_Read::Get_Edge_Block_by_Name(const std::string &name) const +Edge_Block *Exo_Read::Get_Edge_Block_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_edge_blocks; i++) { @@ -410,8 +405,7 @@ Edge_Block *ExoII_Read::Get_Edge_Block_by_Name(const std::string &name return nullptr; } -template -Face_Block *ExoII_Read::Get_Face_Block_by_Id(size_t block_id) const +template Face_Block *Exo_Read::Get_Face_Block_by_Id(size_t block_id) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_face_blocks; i++) { @@ -423,7 +417,7 @@ Face_Block *ExoII_Read::Get_Face_Block_by_Id(size_t block_id) const } template -Face_Block *ExoII_Read::Get_Face_Block_by_Name(const std::string &name) const +Face_Block *Exo_Read::Get_Face_Block_by_Name(const std::string &name) const { SMART_ASSERT(Check_State()); for (size_t i = 0; i < num_face_blocks; i++) { @@ -435,7 +429,7 @@ Face_Block *ExoII_Read::Get_Face_Block_by_Name(const std::string &name } template -std::string ExoII_Read::Load_Element_Block_Description(size_t block_index) const +std::string Exo_Read::Load_Element_Block_Description(size_t block_index) const { SMART_ASSERT(Check_State()); if (!Open()) { @@ -450,7 +444,7 @@ std::string ExoII_Read::Load_Element_Block_Description(size_t block_index) return ""; } -template std::string ExoII_Read::Load_Element_Block_Descriptions() const +template std::string Exo_Read::Load_Element_Block_Descriptions() const { SMART_ASSERT(Check_State()); if (!Open()) { @@ -463,7 +457,7 @@ template std::string ExoII_Read::Load_Element_Block_Descript return ""; } -template std::string ExoII_Read::Free_Element_Block(size_t block_index) const +template std::string Exo_Read::Free_Element_Block(size_t block_index) const { SMART_ASSERT(Check_State()); @@ -475,7 +469,7 @@ template std::string ExoII_Read::Free_Element_Block(size_t b return ""; } -template std::string ExoII_Read::Free_Element_Blocks() const +template std::string Exo_Read::Free_Element_Blocks() const { SMART_ASSERT(Check_State()); @@ -487,14 +481,14 @@ template std::string ExoII_Read::Free_Element_Blocks() const return ""; } -template size_t ExoII_Read::Block_Id(size_t block_index) const +template size_t Exo_Read::Block_Id(size_t block_index) const { SMART_ASSERT(Check_State()); SMART_ASSERT(block_index < num_elmt_blocks); return eblocks[block_index].Id(); } -template std::string ExoII_Read::Load_Node_Map() +template std::string Exo_Read::Load_Node_Map() { SMART_ASSERT(Check_State()); @@ -523,7 +517,7 @@ template std::string ExoII_Read::Load_Node_Map() return ""; } -template std::string ExoII_Read::Free_Node_Map() +template std::string Exo_Read::Free_Node_Map() { SMART_ASSERT(Check_State()); @@ -533,7 +527,7 @@ template std::string ExoII_Read::Free_Node_Map() return ""; } -template std::string ExoII_Read::Load_Element_Map() +template std::string Exo_Read::Load_Element_Map() { SMART_ASSERT(Check_State()); @@ -562,7 +556,7 @@ template std::string ExoII_Read::Load_Element_Map() return ""; } -template std::string ExoII_Read::Free_Element_Map() +template std::string Exo_Read::Free_Element_Map() { SMART_ASSERT(Check_State()); @@ -572,7 +566,7 @@ template std::string ExoII_Read::Free_Element_Map() return ""; } -template std::string ExoII_Read::Load_Nodal_Coordinates() +template std::string Exo_Read::Load_Nodal_Coordinates() { SMART_ASSERT(Check_State()); @@ -610,7 +604,7 @@ template std::string ExoII_Read::Load_Nodal_Coordinates() return ""; } -template void ExoII_Read::Free_Nodal_Coordinates() +template void Exo_Read::Free_Nodal_Coordinates() { SMART_ASSERT(Check_State()); delete[] nodes; @@ -618,10 +612,10 @@ template void ExoII_Read::Free_Nodal_Coordinates() } template -std::string ExoII_Read::Load_Nodal_Results(int time_step_num, int var_index) +std::string Exo_Read::Load_Nodal_Results(int time_step_num, int var_index) { SMART_ASSERT(Check_State()); - SMART_ASSERT(time_step_num > 0 && time_step_num <= num_times); + SMART_ASSERT(time_step_num > 0 && time_step_num <= Num_Times()); SMART_ASSERT(var_index >= 0 && (unsigned)var_index < nodal_vars.size()); if (!Open()) { @@ -641,13 +635,13 @@ std::string ExoII_Read::Load_Nodal_Results(int time_step_num, int var_index int err = ex_get_var(file_id, cur_time, EX_NODAL, var_index + 1, 0, num_nodes, results[var_index]); if (err < 0) { - Error("ExoII_Read::Load_Nodal_Results(): Failed to get " + Error("Exo_Read::Load_Nodal_Results(): Failed to get " "nodal variable values! Aborting...\n"); } else if (err > 0) { delete[] results[var_index]; results[var_index] = nullptr; - return fmt::format("ExoII_Read::Load_Nodal_Results(): WARNING: " + return fmt::format("Exo_Read::Load_Nodal_Results(): WARNING: " "Exodus issued warning \"{}\" on call to ex_get_var()!" " I'm not going to keep what it gave me for values.", err); @@ -660,15 +654,15 @@ std::string ExoII_Read::Load_Nodal_Results(int time_step_num, int var_index } template -const double *ExoII_Read::Get_Nodal_Results(int t1, int t2, double proportion, - int var_index) const // Interpolated results. +const double *Exo_Read::Get_Nodal_Results(int t1, int t2, double proportion, + int var_index) const // Interpolated results. { static std::vector st_results; static std::vector st_results2; SMART_ASSERT(Check_State()); - SMART_ASSERT(t1 > 0 && t1 <= num_times); - SMART_ASSERT(t2 > 0 && t2 <= num_times); + SMART_ASSERT(t1 > 0 && t1 <= Num_Times()); + SMART_ASSERT(t2 > 0 && t2 <= Num_Times()); SMART_ASSERT(var_index >= 0 && (unsigned)var_index < nodal_vars.size()); if (!Open()) { @@ -681,7 +675,7 @@ const double *ExoII_Read::Get_Nodal_Results(int t1, int t2, double proporti int err = ex_get_var(file_id, t1, EX_NODAL, var_index + 1, 0, num_nodes, st_results.data()); if (err < 0) { - Error("ExoII_Read::Get_Nodal_Results(): Failed to get " + Error("Exo_Read::Get_Nodal_Results(): Failed to get " "nodal variable values! Aborting...\n"); } @@ -692,7 +686,7 @@ const double *ExoII_Read::Get_Nodal_Results(int t1, int t2, double proporti err = ex_get_var(file_id, t2, EX_NODAL, var_index + 1, 0, num_nodes, st_results2.data()); if (err < 0) { - Error("ExoII_Read::Load_Nodal_Results(): Failed to get " + Error("Exo_Read::Load_Nodal_Results(): Failed to get " "nodal variable values! Aborting...\n"); } @@ -704,7 +698,7 @@ const double *ExoII_Read::Get_Nodal_Results(int t1, int t2, double proporti return st_results.data(); } -template void ExoII_Read::Free_Nodal_Results() +template void Exo_Read::Free_Nodal_Results() { SMART_ASSERT(Check_State()); if (results) { @@ -715,7 +709,7 @@ template void ExoII_Read::Free_Nodal_Results() } } -template void ExoII_Read::Free_Nodal_Results(int var_index) +template void Exo_Read::Free_Nodal_Results(int var_index) { SMART_ASSERT(Check_State()); if (results) { @@ -726,7 +720,7 @@ template void ExoII_Read::Free_Nodal_Results(int var_index) } } -template const double *ExoII_Read::Get_Nodal_Results(int var_index) const +template const double *Exo_Read::Get_Nodal_Results(int var_index) const { SMART_ASSERT(Check_State()); if (cur_time == 0) { @@ -737,10 +731,10 @@ template const double *ExoII_Read::Get_Nodal_Results(int var return results[var_index]; } -template std::string ExoII_Read::Load_Global_Results(int time_step_num) +template std::string Exo_Read::Load_Global_Results(int time_step_num) { SMART_ASSERT(Check_State()); - SMART_ASSERT(time_step_num > 0 && time_step_num <= num_times); + SMART_ASSERT(time_step_num > 0 && time_step_num <= Num_Times()); if (!Open()) { return "WARNING: File not open!"; @@ -761,11 +755,11 @@ template std::string ExoII_Read::Load_Global_Results(int tim int err = ex_get_var(file_id, time_step_num, EX_GLOBAL, 1, 1, global_vars.size(), global_vals); if (err < 0) { - Error("ExoII_Read::Load_Global_Results(): Failed to get " + Error("Exo_Read::Load_Global_Results(): Failed to get " "global variable values! Aborting...\n"); } else if (err > 0) { - return fmt::format("ExoII_Read::Load_Global_Results(): WARNING: " + return fmt::format("Exo_Read::Load_Global_Results(): WARNING: " "Exodus issued warning \"{}\" on call to ex_get_glob_vars()!", err); } @@ -773,11 +767,11 @@ template std::string ExoII_Read::Load_Global_Results(int tim } template -std::string ExoII_Read::Load_Global_Results(int t1, int t2, double proportion) +std::string Exo_Read::Load_Global_Results(int t1, int t2, double proportion) { SMART_ASSERT(Check_State()); - SMART_ASSERT(t1 > 0 && t1 <= num_times); - SMART_ASSERT(t2 > 0 && t2 <= num_times); + SMART_ASSERT(t1 > 0 && t1 <= Num_Times()); + SMART_ASSERT(t2 > 0 && t2 <= Num_Times()); if (!Open()) { return "WARNING: File not open!"; @@ -802,14 +796,14 @@ std::string ExoII_Read::Load_Global_Results(int t1, int t2, double proporti int err = ex_get_var(file_id, t1, EX_GLOBAL, 1, 1, global_vars.size(), global_vals); if (err < 0) { - Error("ExoII_Read::Load_Global_Results(): Failed to get " + Error("Exo_Read::Load_Global_Results(): Failed to get " "global variable values! Aborting...\n"); } if (t2 != t1) { err = ex_get_var(file_id, t2, EX_GLOBAL, 1, 1, global_vars.size(), global_vals2); if (err < 0) { - Error("ExoII_Read::Load_Global_Results(): Failed to get " + Error("Exo_Read::Load_Global_Results(): Failed to get " "global variable values! Aborting...\n"); } @@ -822,7 +816,7 @@ std::string ExoII_Read::Load_Global_Results(int t1, int t2, double proporti } template -Side_Set *ExoII_Read::Get_Side_Set_by_Index(size_t side_set_index) const +Side_Set *Exo_Read::Get_Side_Set_by_Index(size_t side_set_index) const { SMART_ASSERT(Check_State()); @@ -833,8 +827,7 @@ Side_Set *ExoII_Read::Get_Side_Set_by_Index(size_t side_set_index) con return &ssets[side_set_index]; } -template -Node_Set *ExoII_Read::Get_Node_Set_by_Index(size_t set_index) const +template Node_Set *Exo_Read::Get_Node_Set_by_Index(size_t set_index) const { SMART_ASSERT(Check_State()); @@ -846,7 +839,7 @@ Node_Set *ExoII_Read::Get_Node_Set_by_Index(size_t set_index) const } template -Edge_Block *ExoII_Read::Get_Edge_Block_by_Index(size_t edge_block_index) const +Edge_Block *Exo_Read::Get_Edge_Block_by_Index(size_t edge_block_index) const { SMART_ASSERT(Check_State()); @@ -858,7 +851,7 @@ Edge_Block *ExoII_Read::Get_Edge_Block_by_Index(size_t edge_block_inde } template -Face_Block *ExoII_Read::Get_Face_Block_by_Index(size_t face_block_index) const +Face_Block *Exo_Read::Get_Face_Block_by_Index(size_t face_block_index) const { SMART_ASSERT(Check_State()); @@ -874,7 +867,7 @@ Face_Block *ExoII_Read::Get_Face_Block_by_Index(size_t face_block_inde // This function converts an Exodus global element number (1-offset) into // its block index (0-offset) and block element index (0-offset). template -std::pair ExoII_Read::Global_to_Block_Local(size_t global_elmt_num) const +std::pair Exo_Read::Global_to_Block_Local(size_t global_elmt_num) const { SMART_ASSERT(Check_State()); @@ -896,7 +889,7 @@ std::pair ExoII_Read::Global_to_Block_Local(size_t global_elmt return std::make_pair(block_index, global_elmt_num - total - 1); } -template int ExoII_Read::Check_State() const +template int Exo_Read::Check_State() const { SMART_ASSERT(file_id >= -1); SMART_ASSERT(db_version >= 0.0); @@ -912,17 +905,16 @@ template int ExoII_Read::Check_State() const SMART_ASSERT(!(num_nodes == 0 && nodes)); - SMART_ASSERT(num_times >= 0); - SMART_ASSERT(!(num_times > 0 && !times)); + SMART_ASSERT(Num_Times() >= 0); - SMART_ASSERT(cur_time >= 0 && cur_time <= num_times); + SMART_ASSERT(cur_time >= 0 && cur_time <= Num_Times()); SMART_ASSERT(!(!nodal_vars.empty() && !results)); SMART_ASSERT(!(nodal_vars.empty() && results)); return 1; } -template std::string ExoII_Read::File_Name(const char *fname) +template std::string Exo_Read::File_Name(const char *fname) { SMART_ASSERT(Check_State()); @@ -937,7 +929,7 @@ template std::string ExoII_Read::File_Name(const char *fname return ""; } -template std::string ExoII_Read::Open_File(const char *fname) +template std::string Exo_Read::Open_File(const char *fname) { SMART_ASSERT(Check_State()); @@ -984,7 +976,7 @@ template std::string ExoII_Read::Open_File(const char *fname return ""; } -template void ExoII_Read::Get_Init_Data() +template void Exo_Read::Get_Init_Data() { SMART_ASSERT(Check_State()); SMART_ASSERT(file_id >= 0); @@ -1306,7 +1298,7 @@ template void ExoII_Read::Get_Init_Data() read_vars(file_id, EX_FACE_BLOCK, "Faceblock", num_face_vars, fb_vars); // Times: - num_times = ex_inquire_int(file_id, EX_INQ_TIME); + int num_times = ex_inquire_int(file_id, EX_INQ_TIME); if (num_times < 0) { Error(fmt::format("Number of time steps came back negative ({})! Aborting...\n", num_times)); } @@ -1319,9 +1311,8 @@ template void ExoII_Read::Get_Init_Data() } if (num_times) { - times = new double[num_times]; - SMART_ASSERT(times != nullptr); - ex_get_all_times(file_id, times); + times.resize(num_times); + ex_get_all_times(file_id, times.data()); if (time_scale != 1.0 || time_offset != 0.0) { for (int i = 0; i < num_times; i++) { times[i] = time_scale * times[i] + time_offset; @@ -1346,8 +1337,7 @@ template void ExoII_Read::Get_Init_Data() } // End of EXODIFF namespace { - void read_vars(int file_id, EXOTYPE flag, const char *type, int num_vars, - std::vector &varlist) + void read_vars(int file_id, EXOTYPE flag, const char *type, int num_vars, NameList &varlist) { if (num_vars != 0) { int name_size = ex_inquire_int(file_id, EX_INQ_MAX_READ_NAME_LENGTH); @@ -1388,5 +1378,5 @@ namespace { } } } // namespace -template class ExoII_Read; -template class ExoII_Read; +template class Exo_Read; +template class Exo_Read; diff --git a/packages/seacas/applications/exodiff/exoII_read.h b/packages/seacas/applications/exodiff/exo_read.h similarity index 68% rename from packages/seacas/applications/exodiff/exoII_read.h rename to packages/seacas/applications/exodiff/exo_read.h index fc423d057d72..bf2504feab4d 100644 --- a/packages/seacas/applications/exodiff/exoII_read.h +++ b/packages/seacas/applications/exodiff/exo_read.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -6,6 +6,7 @@ #pragma once #include "exo_entity.h" +#include "util.h" #include #include @@ -29,14 +30,14 @@ template class Edge_Block; template class Face_Block; template class Assembly; -template class ExoII_Read +template class Exo_Read { public: - ExoII_Read(); - explicit ExoII_Read(std::string fname); - virtual ~ExoII_Read(); - const ExoII_Read &operator=(const ExoII_Read &) = delete; - ExoII_Read(const ExoII_Read &) = delete; + Exo_Read(); + explicit Exo_Read(std::string fname); + virtual ~Exo_Read(); + const Exo_Read &operator=(const Exo_Read &) = delete; + Exo_Read(const Exo_Read &) = delete; // File operations: @@ -68,28 +69,27 @@ template class ExoII_Read size_t Num_Assembly() const { return num_assemblies; } // Times: - - int Num_Times() const { return num_times; } + int Num_Times() const { return (int)times.size(); } double Time(int time_num) const; // Variables: - size_t Num_Global_Vars() const { return global_vars.size(); } - size_t Num_Nodal_Vars() const { return nodal_vars.size(); } - size_t Num_Element_Vars() const { return elmt_vars.size(); } - size_t Num_Element_Atts() const { return elmt_atts.size(); } - size_t Num_NS_Vars() const { return ns_vars.size(); } - size_t Num_SS_Vars() const { return ss_vars.size(); } - size_t Num_EB_Vars() const { return eb_vars.size(); } - size_t Num_FB_Vars() const { return fb_vars.size(); } - const std::vector &Global_Var_Names() const { return global_vars; } - const std::vector &Nodal_Var_Names() const { return nodal_vars; } - const std::vector &Element_Var_Names() const { return elmt_vars; } - const std::vector &Element_Att_Names() const { return elmt_atts; } - const std::vector &NS_Var_Names() const { return ns_vars; } - const std::vector &SS_Var_Names() const { return ss_vars; } - const std::vector &EB_Var_Names() const { return eb_vars; } - const std::vector &FB_Var_Names() const { return fb_vars; } + size_t Num_Global_Vars() const { return global_vars.size(); } + size_t Num_Nodal_Vars() const { return nodal_vars.size(); } + size_t Num_Element_Vars() const { return elmt_vars.size(); } + size_t Num_Element_Atts() const { return elmt_atts.size(); } + size_t Num_NS_Vars() const { return ns_vars.size(); } + size_t Num_SS_Vars() const { return ss_vars.size(); } + size_t Num_EB_Vars() const { return eb_vars.size(); } + size_t Num_FB_Vars() const { return fb_vars.size(); } + const NameList &Global_Var_Names() const { return global_vars; } + const NameList &Nodal_Var_Names() const { return nodal_vars; } + const NameList &Element_Var_Names() const { return elmt_vars; } + const NameList &Element_Att_Names() const { return elmt_atts; } + const NameList &NS_Var_Names() const { return ns_vars; } + const NameList &SS_Var_Names() const { return ss_vars; } + const NameList &EB_Var_Names() const { return eb_vars; } + const NameList &FB_Var_Names() const { return fb_vars; } const std::string &Global_Var_Name(int index) const; const std::string &Nodal_Var_Name(int index) const; @@ -115,9 +115,8 @@ template class ExoII_Read std::string Load_Element_Map(); std::string Free_Element_Map(); const INT *Get_Element_Map() { return elmt_map; } - inline INT Node_Map(size_t node_num) const; // numbers are global, 1-offset - inline INT Element_Map(size_t elmt_num) const; // numbers are global, 1-offset - inline INT Element_Order(size_t elmt_num) const; // numbers are global, 1-offset + inline INT Node_Map(size_t node_num) const; // numbers are global, 1-offset + inline INT Element_Map(size_t elmt_num) const; // numbers are global, 1-offset // Nodal data: @@ -198,22 +197,22 @@ template class ExoII_Read // GENESIS info: - std::string title{}; - std::vector coord_names{}; - size_t num_nodes{0}; - int dimension{0}; - size_t num_elmts{0}; - size_t num_faces{0}; - size_t num_edges{0}; - size_t num_elmt_blocks{0}; - size_t num_node_sets{0}; - size_t num_side_sets{0}; - size_t num_edge_blocks{0}; - size_t num_face_blocks{0}; - size_t num_assemblies{0}; - float db_version{0.0}; - float api_version{0.0}; - int io_word_size{0}; // Note: The "compute word size" is always 8. + std::string title{}; + NameList coord_names{}; + size_t num_nodes{0}; + int dimension{0}; + size_t num_elmts{0}; + size_t num_faces{0}; + size_t num_edges{0}; + size_t num_elmt_blocks{0}; + size_t num_node_sets{0}; + size_t num_side_sets{0}; + size_t num_edge_blocks{0}; + size_t num_face_blocks{0}; + size_t num_assemblies{0}; + float db_version{0.0}; + float api_version{0.0}; + int io_word_size{0}; // Note: The "compute word size" is always 8. Exo_Block *eblocks{nullptr}; // Array. Node_Set *nsets{nullptr}; // Array. @@ -225,26 +224,27 @@ template class ExoII_Read double *nodes{nullptr}; // Matrix; dimension by num_nodes (row major form). // I.e., all x's then all y's, etc. - INT *node_map{nullptr}; // Array; num_nodes long when filled. - INT *elmt_map{nullptr}; // Array; num_elmts long when filled. - INT *elmt_order{nullptr}; // Array; num_elmts long when filled. + INT *node_map{nullptr}; // Array; num_nodes long when filled. + INT *elmt_map{nullptr}; // Array; num_elmts long when filled. // RESULTS info: - std::vector global_vars{}; - std::vector nodal_vars{}; - std::vector elmt_vars{}; - std::vector elmt_atts{}; - std::vector ns_vars{}; - std::vector ss_vars{}; - std::vector eb_vars{}; - std::vector fb_vars{}; + NameList global_vars{}; + NameList nodal_vars{}; + NameList elmt_vars{}; + NameList elmt_atts{}; + NameList ns_vars{}; + NameList ss_vars{}; + NameList eb_vars{}; + NameList fb_vars{}; + + std::vector change_set_ids{}; + NameList change_set_names{}; - int num_times{0}; double time_scale{1.0}; double time_offset{0.0}; - double *times{nullptr}; + std::vector times{}; int cur_time{0}; // Current timestep number of the results (0 means none). double **results{nullptr}; // Array of pointers (to arrays of results data); @@ -257,7 +257,7 @@ template class ExoII_Read void Get_Init_Data(); // Gets bunch of initial data. }; -template inline INT ExoII_Read::Node_Map(size_t node_num) const +template inline INT Exo_Read::Node_Map(size_t node_num) const { SMART_ASSERT(Check_State()); SMART_ASSERT(node_num <= num_nodes); @@ -268,7 +268,7 @@ template inline INT ExoII_Read::Node_Map(size_t node_num) co return 0; } -template inline INT ExoII_Read::Element_Map(size_t elmt_num) const +template inline INT Exo_Read::Element_Map(size_t elmt_num) const { SMART_ASSERT(Check_State()); SMART_ASSERT(elmt_num <= num_elmts); @@ -278,14 +278,3 @@ template inline INT ExoII_Read::Element_Map(size_t elmt_num) } return 0; } - -template inline INT ExoII_Read::Element_Order(size_t elmt_num) const -{ - SMART_ASSERT(Check_State()); - SMART_ASSERT(elmt_num <= num_elmts); - - if (elmt_order) { - return elmt_order[elmt_num - 1]; - } - return 0; -} diff --git a/packages/seacas/applications/exodiff/exodiff.C b/packages/seacas/applications/exodiff/exodiff.C index 5da26dca13ce..6ab3f4212bd3 100644 --- a/packages/seacas/applications/exodiff/exodiff.C +++ b/packages/seacas/applications/exodiff/exodiff.C @@ -23,8 +23,8 @@ #include "Norm.h" #include "Tolerance.h" #include "edge_block.h" -#include "exoII_read.h" #include "exo_block.h" +#include "exo_read.h" #include "exodiff.h" #include "exodusII.h" #include "face_block.h" @@ -95,17 +95,17 @@ void Print_Banner(const char *prefix) // different blocks. template -extern void Build_Variable_Names(ExoII_Read &file1, ExoII_Read &file2, bool *diff_found); +extern void Build_Variable_Names(Exo_Read &file1, Exo_Read &file2, bool *diff_found); -template extern bool Check_Global(ExoII_Read &file1, ExoII_Read &file2); +template extern bool Check_Global(Exo_Read &file1, Exo_Read &file2); template -extern void Check_Compatible_Meshes(ExoII_Read &file1, ExoII_Read &file2, bool check_only, +extern void Check_Compatible_Meshes(Exo_Read &file1, Exo_Read &file2, bool check_only, const std::vector &node_map, const std::vector &elmt_map, const INT *node_id_map); template -int Create_File(ExoII_Read &file1, ExoII_Read &file2, const std::string &diffile_name, +int Create_File(Exo_Read &file1, Exo_Read &file2, const std::string &diffile_name, bool *diff_found); double To_Double(const std::string &str_val); @@ -114,78 +114,78 @@ double FileDiff(double v1, double v2, ToleranceMode type); void Die_TS(double ts); -template size_t global_elmt_num(ExoII_Read &file, size_t b_idx, size_t e_idx); +template size_t global_elmt_num(Exo_Read &file, size_t b_idx, size_t e_idx); -template double Find_Min_Coord_Sep(ExoII_Read &file); +template double Find_Min_Coord_Sep(Exo_Read &file); int timeStepIsExcluded(int ts); template -const double *get_nodal_values(ExoII_Read &filen, int time_step, size_t idx, size_t fno, +const double *get_nodal_values(Exo_Read &filen, int time_step, size_t idx, size_t fno, const std::string &name, bool *diff_flag); template -const double *get_nodal_values(ExoII_Read &filen, const TimeInterp &t, size_t idx, size_t fno, +const double *get_nodal_values(Exo_Read &filen, const TimeInterp &t, size_t idx, size_t fno, const std::string &name, bool *diff_flag); template -void do_summaries(ExoII_Read &file, int time_step, std::vector &mm_glob, +void do_summaries(Exo_Read &file, int time_step, std::vector &mm_glob, std::vector &mm_node, std::vector &mm_elmt, std::vector &mm_ns, std::vector &mm_ss, std::vector &mm_eb, std::vector &mm_fb, const std::vector &elmt_map, bool *diff_flag); template -void do_diffs(ExoII_Read &file1, ExoII_Read &file2, int time_step1, const TimeInterp &t2, +void do_diffs(Exo_Read &file1, Exo_Read &file2, int time_step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &node_map, const INT *node_id_map, const std::vector &elmt_map, const INT *elem_id_map, Exo_Block **blocks2, std::vector &var_vals, bool *diff_flag); template -bool summarize_globals(ExoII_Read &file, int step, std::vector &mm_glob); +bool summarize_globals(Exo_Read &file, int step, std::vector &mm_glob); template -bool summarize_nodals(ExoII_Read &file, int step, std::vector &mm_node); +bool summarize_nodals(Exo_Read &file, int step, std::vector &mm_node); template -bool summarize_element(ExoII_Read &file, int step, const std::vector &elmt_map, +bool summarize_element(Exo_Read &file, int step, const std::vector &elmt_map, std::vector &mm_elmt); template -bool summarize_nodeset(ExoII_Read &file, int step, std::vector &mm_ns); +bool summarize_nodeset(Exo_Read &file, int step, std::vector &mm_ns); template -bool summarize_sideset(ExoII_Read &file, int step, std::vector &mm_ss); +bool summarize_sideset(Exo_Read &file, int step, std::vector &mm_ss); template -bool summarize_edgeblock(ExoII_Read &file, int step, std::vector &mm_eb); +bool summarize_edgeblock(Exo_Read &file, int step, std::vector &mm_eb); template -bool summarize_faceblock(ExoII_Read &file, int step, std::vector &mm_fb); +bool summarize_faceblock(Exo_Read &file, int step, std::vector &mm_fb); template -bool diff_globals(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_globals(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, std::vector &gvals); template -bool diff_nodals(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_nodals(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &node_map, const INT *id_map, std::vector &nvals); template -bool diff_element(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_element(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &elmt_map, const INT *id_map, Exo_Block **blocks2, std::vector &evals); template -bool diff_element_attributes(ExoII_Read &file1, ExoII_Read &file2, +bool diff_element_attributes(Exo_Read &file1, Exo_Read &file2, const std::vector &elmt_map, const INT *id_map, Exo_Block **blocks2); template -bool diff_nodeset(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_nodeset(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT *id_map, std::vector &vals); template -bool diff_sideset(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_sideset(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT *id_map, std::vector &vals); template -bool diff_sideset_df(ExoII_Read &file1, ExoII_Read &file2, const INT *id_map); +bool diff_sideset_df(Exo_Read &file1, Exo_Read &file2, const INT *id_map); template -void output_summary(ExoII_Read &file1, MinMaxData &mm_time, std::vector &mm_glob, +void output_summary(Exo_Read &file1, MinMaxData &mm_time, std::vector &mm_glob, std::vector &mm_node, std::vector &mm_elmt, std::vector &mm_ns, std::vector &mm_ss, std::vector &mm_eb, std::vector &mm_fb, @@ -246,7 +246,7 @@ namespace { return size; } - template TimeInterp get_surrounding_times(double time, ExoII_Read &file) + template TimeInterp get_surrounding_times(double time, Exo_Read &file) { TimeInterp tprop; tprop.time = time; @@ -292,7 +292,7 @@ namespace { return tprop; } - template void output_init(ExoII_Read &file, int count, const char *prefix) + template void output_init(Exo_Read &file, int count, const char *prefix) { FileInfo fi(file.File_Name()); fmt::print( @@ -319,7 +319,7 @@ namespace { } } - template bool exodiff(ExoII_Read &file1, ExoII_Read &file2); + template bool exodiff(Exo_Read &file1, Exo_Read &file2); } // namespace int main(int argc, char *argv[]) @@ -388,16 +388,16 @@ int main(int argc, char *argv[]) bool diff_flag = true; if (int_size == 4) { // Open input files. - ExoII_Read file1(file1_name); + Exo_Read file1(file1_name); file1.modify_time_values(interFace.time_value_scale, interFace.time_value_offset); - ExoII_Read file2(file2_name); + Exo_Read file2(file2_name); diff_flag = exodiff(file1, file2); } else { // Open input files. - ExoII_Read file1(file1_name); - ExoII_Read file2(file2_name); + Exo_Read file1(file1_name); + Exo_Read file2(file2_name); diff_flag = exodiff(file1, file2); } #if 0 @@ -416,7 +416,7 @@ int main(int argc, char *argv[]) } namespace { - template bool exodiff(ExoII_Read &file1, ExoII_Read &file2) + template bool exodiff(Exo_Read &file1, Exo_Read &file2) { if (!interFace.quiet_flag && !interFace.summary_flag) { fmt::print("Reading first file ... \n"); @@ -1020,7 +1020,7 @@ void Die_TS(double ts) } } -template size_t global_elmt_num(ExoII_Read &file, size_t b_idx, size_t e_idx) +template size_t global_elmt_num(Exo_Read &file, size_t b_idx, size_t e_idx) { SMART_ASSERT(b_idx < file.Num_Element_Blocks()); @@ -1076,7 +1076,7 @@ bool Equal_Values(const double *values, size_t count, double *value) } template -const double *get_nodal_values(ExoII_Read &filen, int time_step, size_t idx, int fno, +const double *get_nodal_values(Exo_Read &filen, int time_step, size_t idx, int fno, const std::string &name, bool *diff_flag) { const double *vals = nullptr; @@ -1095,7 +1095,7 @@ const double *get_nodal_values(ExoII_Read &filen, int time_step, size_t idx } template -const double *get_nodal_values(ExoII_Read &filen, const TimeInterp &t, size_t idx, int fno, +const double *get_nodal_values(Exo_Read &filen, const TimeInterp &t, size_t idx, int fno, const std::string &name, bool *diff_flag) { const double *vals = nullptr; @@ -1113,7 +1113,7 @@ const double *get_nodal_values(ExoII_Read &filen, const TimeInterp &t, size } template -bool summarize_globals(ExoII_Read &file, int step, std::vector &mm_glob) +bool summarize_globals(Exo_Read &file, int step, std::vector &mm_glob) { bool diff_flag = false; if (interFace.glob_var_names.empty()) { @@ -1139,7 +1139,7 @@ bool summarize_globals(ExoII_Read &file, int step, std::vector } template -bool summarize_nodals(ExoII_Read &file, int step, std::vector &mm_node) +bool summarize_nodals(Exo_Read &file, int step, std::vector &mm_node) { bool diff_flag = false; for (unsigned n_idx = 0; n_idx < interFace.node_var_names.size(); ++n_idx) { @@ -1222,7 +1222,7 @@ const double *get_validated_variable(Exo_Entity *entity, const TimeInterp &t2, i } template -bool summarize_element(ExoII_Read &file, int step, const std::vector &elmt_map, +bool summarize_element(Exo_Read &file, int step, const std::vector &elmt_map, std::vector &mm_elmt) { bool diff_flag = false; @@ -1263,7 +1263,7 @@ bool summarize_element(ExoII_Read &file, int step, const std::vector & } template -bool summarize_nodeset(ExoII_Read &file, int step, std::vector &mm_ns) +bool summarize_nodeset(Exo_Read &file, int step, std::vector &mm_ns) { bool diff_flag = false; for (unsigned e_idx = 0; e_idx < interFace.ns_var_names.size(); ++e_idx) { @@ -1293,7 +1293,7 @@ bool summarize_nodeset(ExoII_Read &file, int step, std::vector } template -bool summarize_sideset(ExoII_Read &file, int step, std::vector &mm_ss) +bool summarize_sideset(Exo_Read &file, int step, std::vector &mm_ss) { bool diff_flag = false; for (unsigned e_idx = 0; e_idx < interFace.ss_var_names.size(); ++e_idx) { @@ -1323,7 +1323,7 @@ bool summarize_sideset(ExoII_Read &file, int step, std::vector } template -bool summarize_edgeblock(ExoII_Read &file, int step, std::vector &mm_eb) +bool summarize_edgeblock(Exo_Read &file, int step, std::vector &mm_eb) { bool diff_flag = false; for (unsigned e_idx = 0; e_idx < interFace.eb_var_names.size(); ++e_idx) { @@ -1354,7 +1354,7 @@ bool summarize_edgeblock(ExoII_Read &file, int step, std::vector -bool summarize_faceblock(ExoII_Read &file, int step, std::vector &mm_fb) +bool summarize_faceblock(Exo_Read &file, int step, std::vector &mm_fb) { bool diff_flag = false; for (unsigned f_idx = 0; f_idx < interFace.fb_var_names.size(); ++f_idx) { @@ -1385,7 +1385,7 @@ bool summarize_faceblock(ExoII_Read &file, int step, std::vector -void do_diffs(ExoII_Read &file1, ExoII_Read &file2, int time_step1, const TimeInterp &t2, +void do_diffs(Exo_Read &file1, Exo_Read &file2, int time_step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &node_map, const INT *node_id_map, const std::vector &elmt_map, const INT *elem_id_map, Exo_Block **blocks2, std::vector &var_vals, bool *diff_flag) @@ -1442,7 +1442,7 @@ void do_diffs(ExoII_Read &file1, ExoII_Read &file2, int time_step1, co } template -void do_summaries(ExoII_Read &file, int time_step, std::vector &mm_glob, +void do_summaries(Exo_Read &file, int time_step, std::vector &mm_glob, std::vector &mm_node, std::vector &mm_elmt, std::vector &mm_ns, std::vector &mm_ss, std::vector &mm_eb, std::vector &mm_fb, @@ -1489,7 +1489,7 @@ void output_norms(Norm &norm, const std::string &name) } template -bool diff_globals(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_globals(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, std::vector &gvals) { bool diff_flag = false; @@ -1570,7 +1570,7 @@ bool diff_globals(ExoII_Read &file1, ExoII_Read &file2, int step1, con } template -bool diff_nodals(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_nodals(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &node_map, const INT *id_map, std::vector &nvals) { @@ -1700,7 +1700,7 @@ bool diff_nodals(ExoII_Read &file1, ExoII_Read &file2, int step1, cons } template -bool diff_element(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_element(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const std::vector &elmt_map, const INT *id_map, Exo_Block **blocks2, std::vector &evals) { @@ -1886,7 +1886,7 @@ bool diff_element(ExoII_Read &file1, ExoII_Read &file2, int step1, con } template -bool diff_nodeset(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_nodeset(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT *id_map, std::vector &vals) { bool diff_flag = false; @@ -1995,7 +1995,7 @@ bool diff_nodeset(ExoII_Read &file1, ExoII_Read &file2, int step1, con } template -bool diff_sideset(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_sideset(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT *id_map, std::vector &vals) { bool diff_flag = false; @@ -2107,7 +2107,7 @@ bool diff_sideset(ExoII_Read &file1, ExoII_Read &file2, int step1, con } template -bool diff_sideset_df(ExoII_Read &file1, ExoII_Read &file2, const INT *id_map) +bool diff_sideset_df(Exo_Read &file1, Exo_Read &file2, const INT *id_map) { bool diff_flag = false; @@ -2251,7 +2251,7 @@ bool diff_sideset_df(ExoII_Read &file1, ExoII_Read &file2, const INT * } template -bool diff_edgeblock(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_edgeblock(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT * /* id_map */, std::vector &vals) { @@ -2361,7 +2361,7 @@ bool diff_edgeblock(ExoII_Read &file1, ExoII_Read &file2, int step1, c } template -bool diff_faceblock(ExoII_Read &file1, ExoII_Read &file2, int step1, const TimeInterp &t2, +bool diff_faceblock(Exo_Read &file1, Exo_Read &file2, int step1, const TimeInterp &t2, int out_file_id, int output_step, const INT * /* id_map */, std::vector &vals) { @@ -2470,7 +2470,7 @@ bool diff_faceblock(ExoII_Read &file1, ExoII_Read &file2, int step1, c } template -bool diff_element_attributes(ExoII_Read &file1, ExoII_Read &file2, +bool diff_element_attributes(Exo_Read &file1, Exo_Read &file2, const std::vector & /*elmt_map*/, const INT *id_map, Exo_Block ** /*blocks2*/) { @@ -2615,7 +2615,7 @@ bool diff_element_attributes(ExoII_Read &file1, ExoII_Read &f } template -void output_summary(ExoII_Read &file1, MinMaxData &mm_time, std::vector &mm_glob, +void output_summary(Exo_Read &file1, MinMaxData &mm_time, std::vector &mm_glob, std::vector &mm_node, std::vector &mm_elmt, std::vector &mm_ns, std::vector &mm_ss, std::vector &mm_eb, std::vector &mm_fb, diff --git a/packages/seacas/applications/exodiff/face_block.C b/packages/seacas/applications/exodiff/face_block.C index d8d8b7a21f7e..ed1d6ebe2310 100644 --- a/packages/seacas/applications/exodiff/face_block.C +++ b/packages/seacas/applications/exodiff/face_block.C @@ -50,11 +50,12 @@ template void Face_Block::entity_load_params() if (num_faces_per_elmt < 0 || num_attr < 0) { Error(fmt::format( - fmt::runtime("Face_Block::entity_load_params(): Data appears corrupt for face block {}!\n" - "\tnum elmts = {}\n" - "\tnum faces per elmt = {}\n" - "\tnum attributes = {}\n" - " ... Aborting...\n"), + fmt::runtime( + "Face_Block::entity_load_params(): Data appears corrupt for face block {}!\n" + "\tnum elmts = {}\n" + "\tnum faces per elmt = {}\n" + "\tnum attributes = {}\n" + " ... Aborting...\n"), fmt::group_digits(numEntity), num_faces_per_elmt, num_attr)); } } diff --git a/packages/seacas/applications/exodiff/face_block.h b/packages/seacas/applications/exodiff/face_block.h index 9d7e4804b61b..6e0fe94d17a4 100644 --- a/packages/seacas/applications/exodiff/face_block.h +++ b/packages/seacas/applications/exodiff/face_block.h @@ -8,7 +8,7 @@ #include "exo_entity.h" #include -template class ExoII_Read; +template class Exo_Read; template class Face_Block : public Exo_Entity { @@ -33,5 +33,5 @@ template class Face_Block : public Exo_Entity std::string elmt_type{}; int num_faces_per_elmt{-1}; - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/map.C b/packages/seacas/applications/exodiff/map.C index 62b872ccc7c5..207c6b0ae8f2 100644 --- a/packages/seacas/applications/exodiff/map.C +++ b/packages/seacas/applications/exodiff/map.C @@ -12,8 +12,8 @@ #include "ED_SystemInterface.h" #include "Tolerance.h" -#include "exoII_read.h" #include "exo_block.h" +#include "exo_read.h" #include "fmt/ostream.h" #include "iqsort.h" #include "smart_assert.h" @@ -28,12 +28,12 @@ namespace { const std::vector &id, int dim, bool ignore_dups); template - void Compute_Node_Map(std::vector &node_map, ExoII_Read &file1, ExoII_Read &file2); + void Compute_Node_Map(std::vector &node_map, Exo_Read &file1, Exo_Read &file2); } // namespace template -void Compute_Maps(std::vector &node_map, std::vector &elmt_map, ExoII_Read &file1, - ExoII_Read &file2) +void Compute_Maps(std::vector &node_map, std::vector &elmt_map, Exo_Read &file1, + Exo_Read &file2) { SMART_ASSERT(file1.Open()); SMART_ASSERT(file2.Open()); @@ -313,7 +313,7 @@ void Compute_Maps(std::vector &node_map, std::vector &elmt_map, ExoII_ template void Compute_Partial_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2) + Exo_Read &file1, Exo_Read &file2) { SMART_ASSERT(file1.Open()); SMART_ASSERT(file2.Open()); @@ -637,7 +637,7 @@ namespace { template void Compute_FileId_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2) + Exo_Read &file1, Exo_Read &file2) { // Compute map of nodes and elements in file1 to nodes and elements in file2 // Use the internal exodus node and element number maps in file1 and file2 to @@ -679,7 +679,7 @@ void Compute_FileId_Maps(std::vector &node_map, std::vector &elmt_map, template void Dump_Maps(const std::vector &node_map, const std::vector &elmt_map, - ExoII_Read &file1) + Exo_Read &file1) { size_t ijk; fmt::print("\n=== node number map (file1 -> file2) local ids\n"); @@ -724,7 +724,7 @@ void Dump_Maps(const std::vector &node_map, const std::vector &elmt_ma namespace { template - void Compute_Node_Map(std::vector &node_map, ExoII_Read &file1, ExoII_Read &file2) + void Compute_Node_Map(std::vector &node_map, Exo_Read &file1, Exo_Read &file2) { // This function is called if and only if there are nodes that were // not matched in the Compute_Map function. This is typically the @@ -935,7 +935,7 @@ namespace { } } // namespace -template double Find_Min_Coord_Sep(ExoII_Read &file) +template double Find_Min_Coord_Sep(Exo_Read &file) { size_t num_nodes = file.Num_Nodes(); if (num_nodes < 2) { @@ -1083,7 +1083,7 @@ bool Compare_Maps_Internal(const std::vector &entity_map, bool partial_flag } template -bool Compare_Maps(ExoII_Read &file1, ExoII_Read &file2, const std::vector &node_map, +bool Compare_Maps(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const std::vector &elmt_map, bool partial_flag) { // Check whether the node and element number maps from both file1 @@ -1124,29 +1124,29 @@ bool Compare_Maps(ExoII_Read &file1, ExoII_Read &file2, const std::vec } template void Compute_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); -template bool Compare_Maps(ExoII_Read &file1, ExoII_Read &file2, + Exo_Read &file1, Exo_Read &file2); +template bool Compare_Maps(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const std::vector &elmt_map, bool partial_flag); template void Compute_Partial_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Compute_FileId_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Dump_Maps(const std::vector &node_map, const std::vector &elmt_map, - ExoII_Read &file1); -template double Find_Min_Coord_Sep(ExoII_Read &file); + Exo_Read &file1); +template double Find_Min_Coord_Sep(Exo_Read &file); template void Compute_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); -template bool Compare_Maps(ExoII_Read &file1, ExoII_Read &file2, + Exo_Read &file1, Exo_Read &file2); +template bool Compare_Maps(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const std::vector &elmt_map, bool partial_flag); template void Compute_Partial_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Compute_FileId_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Dump_Maps(const std::vector &node_map, const std::vector &elmt_map, - ExoII_Read &file1); -template double Find_Min_Coord_Sep(ExoII_Read &file); + Exo_Read &file1); +template double Find_Min_Coord_Sep(Exo_Read &file); diff --git a/packages/seacas/applications/exodiff/map.h b/packages/seacas/applications/exodiff/map.h index 3fb92b77c0cd..99d69a53f619 100644 --- a/packages/seacas/applications/exodiff/map.h +++ b/packages/seacas/applications/exodiff/map.h @@ -4,30 +4,30 @@ // // See packages/seacas/LICENSE for details #pragma once -#include "exoII_read.h" +#include "exo_read.h" enum class MapType { FILE_ORDER = 0, PARTIAL, USE_FILE_IDS, DISTANCE }; template -void Compute_Maps(std::vector &node_map, std::vector &elmt_map, ExoII_Read &file1, - ExoII_Read &file2); +void Compute_Maps(std::vector &node_map, std::vector &elmt_map, Exo_Read &file1, + Exo_Read &file2); template void Compute_Partial_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Compute_FileId_Maps(std::vector &node_map, std::vector &elmt_map, - ExoII_Read &file1, ExoII_Read &file2); + Exo_Read &file1, Exo_Read &file2); template void Dump_Maps(const std::vector &node_map, const std::vector &elmt_map, - ExoII_Read &file1); + Exo_Read &file1); template bool Check_Maps(const std::vector &node_map, const std::vector &elmt_map, - const ExoII_Read &file1, const ExoII_Read &file2); + const Exo_Read &file1, const Exo_Read &file2); template -bool Compare_Maps(ExoII_Read &file1, ExoII_Read &file2, const std::vector &node_map, +bool Compare_Maps(Exo_Read &file1, Exo_Read &file2, const std::vector &node_map, const std::vector &elmt_map, bool partial_flag); diff --git a/packages/seacas/applications/exodiff/node_set.h b/packages/seacas/applications/exodiff/node_set.h index cd7a56b5896d..1a6203c008ec 100644 --- a/packages/seacas/applications/exodiff/node_set.h +++ b/packages/seacas/applications/exodiff/node_set.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -6,9 +6,9 @@ #pragma once #include "exo_entity.h" -#include "side_set.h" // for Side_Set +#include "util.h" -template class ExoII_Read; +template class Exo_Read; template class Node_Set : public Exo_Entity { @@ -45,5 +45,5 @@ template class Node_Set : public Exo_Entity mutable INT *nodeIndex{nullptr}; // An index array which orders the nodelist in sorted order. mutable double *dist_factors{nullptr}; // Array. - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/side_set.h b/packages/seacas/applications/exodiff/side_set.h index 27ce8c3b07a8..25925b8fb801 100644 --- a/packages/seacas/applications/exodiff/side_set.h +++ b/packages/seacas/applications/exodiff/side_set.h @@ -8,7 +8,7 @@ #include "exo_entity.h" #include -template class ExoII_Read; +template class Exo_Read; template class Side_Set : public Exo_Entity { @@ -50,5 +50,5 @@ template class Side_Set : public Exo_Entity mutable INT *dfIndex{nullptr}; mutable double *dist_factors{nullptr}; - friend class ExoII_Read; + friend class Exo_Read; }; diff --git a/packages/seacas/applications/exodiff/stringx.C b/packages/seacas/applications/exodiff/stringx.C index a3a366fdbfce..70e699ef1591 100644 --- a/packages/seacas/applications/exodiff/stringx.C +++ b/packages/seacas/applications/exodiff/stringx.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -6,6 +6,7 @@ #include "smart_assert.h" // for SMART_ASSERT #include "stringx.h" + #include // for tolower, isspace #include // for strspn, strcspn #include // for string, operator== @@ -151,7 +152,7 @@ int count_tokens(const std::string &s, const char *delimiters) return 0; } -int max_string_length(const std::vector &names) +int max_string_length(const NameList &names) { if (names.empty()) { return 0; @@ -182,7 +183,7 @@ char first_character(const std::string &s) return 0; } -int find_string(const std::vector &lst, const std::string &s, bool nocase) +int find_string(const NameList &lst, const std::string &s, bool nocase) { if (nocase) { for (unsigned i = 0; i < lst.size(); ++i) { diff --git a/packages/seacas/applications/exodiff/stringx.h b/packages/seacas/applications/exodiff/stringx.h index f624bb76a31d..0bd980286dd5 100644 --- a/packages/seacas/applications/exodiff/stringx.h +++ b/packages/seacas/applications/exodiff/stringx.h @@ -1,10 +1,11 @@ -// Copyright(C) 1999-2022 National Technology & Engineering Solutions +// Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // // See packages/seacas/LICENSE for details #pragma once +#include "util.h" #include #include @@ -30,7 +31,7 @@ std::string extract_token(std::string &s, const char *delimiters = " \t\n\r"); int count_tokens(const std::string &s, const char *delimiters = " \t\n\r"); //! Runs each string in the vector and returns the maximum size. -int max_string_length(const std::vector &names); +int max_string_length(const NameList &names); //! Replaces each character of the string with its lower case equivalent. void to_lower(std::string &s); @@ -42,4 +43,4 @@ char first_character(const std::string &s); //! Searches the list of strings for a particular string value. Letter case //! will be ignored if the last argument is true. Returns the index of the //! string in the vector if found, otherwise returns -1. -int find_string(const std::vector &lst, const std::string &s, bool nocase); +int find_string(const NameList &lst, const std::string &s, bool nocase); diff --git a/packages/seacas/applications/exodiff/util.h b/packages/seacas/applications/exodiff/util.h index fd25ed12f1ca..b34861081225 100644 --- a/packages/seacas/applications/exodiff/util.h +++ b/packages/seacas/applications/exodiff/util.h @@ -11,6 +11,8 @@ #include #include +using NameList = std::vector; + int name_length(); char **get_name_array(int size, int length); void free_name_array(char **names, int size); diff --git a/packages/seacas/applications/exomatlab/exomatlab.C b/packages/seacas/applications/exomatlab/exomatlab.C index 5afd22d83557..ddc61e4eb652 100644 --- a/packages/seacas/applications/exomatlab/exomatlab.C +++ b/packages/seacas/applications/exomatlab/exomatlab.C @@ -51,7 +51,7 @@ namespace { // ======================================================================== namespace { - std::string codename; + std::string codename; } // namespace int main(int argc, char *argv[]) diff --git a/packages/seacas/applications/explore/CMakeLists.txt b/packages/seacas/applications/explore/CMakeLists.txt index fe46e26a2b84..2818c9fc49b3 100644 --- a/packages/seacas/applications/explore/CMakeLists.txt +++ b/packages/seacas/applications/explore/CMakeLists.txt @@ -26,7 +26,7 @@ TRIBITS_ADD_EXECUTABLE( if (explore_added) if (${CMAKE_PROJECT_NAME} STREQUAL "Seacas") - InstallSymLink(explore ${CMAKE_INSTALL_PREFIX}/bin/grope) + InstallSymLink(explore ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/grope) endif() endif() diff --git a/packages/seacas/applications/explore/exp_comand.f b/packages/seacas/applications/explore/exp_comand.f index d9ce8cb28845..0324234b2ac9 100644 --- a/packages/seacas/applications/explore/exp_comand.f +++ b/packages/seacas/applications/explore/exp_comand.f @@ -170,7 +170,7 @@ SUBROUTINE COMAND (A, IA, EXODUS, DBNAME, QAREC, INFO, 4 'GVARS ', 'NVARS ', 'EVARS ', 'NSVARS ', 'SSVARS ', 5 ' ' / DATA LISTBL / - 1 'TITLE ', 'VARS ', 'QAINFO ', 'QA', 'INFORMATION', + 1 'TITLE ', 'VARS ', 'QAINFO ', 'QA', 'INFORMATION', 2 'COORDINA', 'MAP ', 'NMAP ', 'NODEMAP ', 3 'BLOCKS ', 'MATERIAL', 'LINK ', 'CONNECTI', 'ATTRIBUT', 4 'NSETS ', 'NNODES ', 'NFACTORS', 'INVCON ', diff --git a/packages/seacas/applications/explore/exp_dbsbel.f b/packages/seacas/applications/explore/exp_dbsbel.f index 7fdf59d59a0f..4f4895fa170f 100644 --- a/packages/seacas/applications/explore/exp_dbsbel.f +++ b/packages/seacas/applications/explore/exp_dbsbel.f @@ -1,7 +1,7 @@ -C Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. -C +C C See packages/seacas/LICENSE for details C======================================================================= SUBROUTINE DBSBEL (NELBLK, NUMEL, LENE, INEL, NLISEL, LISEL, ADD) diff --git a/packages/seacas/applications/explore/exp_preb1.f b/packages/seacas/applications/explore/exp_preb1.f index a2eb8706e121..9a20654fbec9 100644 --- a/packages/seacas/applications/explore/exp_preb1.f +++ b/packages/seacas/applications/explore/exp_preb1.f @@ -1,7 +1,7 @@ -C Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. -C +C C See packages/seacas/LICENSE for details C======================================================================= SUBROUTINE PREB1 (OPTION, NOUT, IEL0, NLISEL, LISEL, @@ -157,9 +157,9 @@ SUBROUTINE PREB1 (OPTION, NOUT, IEL0, NLISEL, LISEL, end do end if end if - + RETURN - + 10000 FORMAT (1X, ' Blk Index Global ID ', A, ' ', A) 10001 FORMAT (1X, ' Blk Index Local ID ', A, ' ', A) 10010 FORMAT (1X, I11, I11, 5X, 8I11, :, /, diff --git a/packages/seacas/applications/explore/exp_prelem.f b/packages/seacas/applications/explore/exp_prelem.f index 8d1b17ebf30d..49601e03a741 100644 --- a/packages/seacas/applications/explore/exp_prelem.f +++ b/packages/seacas/applications/explore/exp_prelem.f @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -75,7 +75,7 @@ SUBROUTINE PRELEM (OPTION, NOUT, IF (NLISEL(IELB) .GT. 0) THEN IX0 = LENE(IELB-1) - IXB = LENE(IELB) - LENE(IELB-1) + IXB = LENE(IELB) - LENE(IELB-1) DO IX = 1, IXB IEL = LISEL(IX0+IX) IF (iel .eq. 0) cycle diff --git a/packages/seacas/applications/explore/exp_rmixint.f b/packages/seacas/applications/explore/exp_rmixint.f index e124532300b8..c9ce38b65996 100644 --- a/packages/seacas/applications/explore/exp_rmixint.f +++ b/packages/seacas/applications/explore/exp_rmixint.f @@ -1,7 +1,7 @@ -C Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. -C +C C See packages/seacas/LICENSE for details C======================================================================= diff --git a/packages/seacas/applications/gjoin/gj_munnps.f b/packages/seacas/applications/gjoin/gj_munnps.f index 42db35fd468c..8111bd191299 100644 --- a/packages/seacas/applications/gjoin/gj_munnps.f +++ b/packages/seacas/applications/gjoin/gj_munnps.f @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -51,7 +51,7 @@ SUBROUTINE MUNNPS (NUMNPS, ISTAT, LNPSNL, INTEGER NODSCR(*) character*(namlen) namns(*) character*(namlen) namsc(*) - + IF (NUMNPS .LE. 0) RETURN JNPS = 0 diff --git a/packages/seacas/applications/grepos/gp_attrot.blk b/packages/seacas/applications/grepos/gp_attrot.blk index 66821cdd46ff..4c2c0cc211a6 100644 --- a/packages/seacas/applications/grepos/gp_attrot.blk +++ b/packages/seacas/applications/grepos/gp_attrot.blk @@ -1,11 +1,11 @@ -C Copyright(C) 1999-2020 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C C See packages/seacas/LICENSE for details C -*- Mode: fortran -*- - COMMON /ATTROT/ ATTIND, ATTBLK, + COMMON /ATTROT/ ATTIND, ATTBLK, * ROTATT(3,3), REVATT, ROTALL, ROTTYP INTEGER ATTBLK, ATTIND LOGICAL REVATT diff --git a/packages/seacas/applications/grepos/gp_mapvar.f b/packages/seacas/applications/grepos/gp_mapvar.f index d55dd4d39152..6abb7e341edb 100644 --- a/packages/seacas/applications/grepos/gp_mapvar.f +++ b/packages/seacas/applications/grepos/gp_mapvar.f @@ -46,7 +46,7 @@ subroutine mapvar(nold, nnew, nvar, map, vars, scr) if (isseq) then return end if - + do 30 ivar = 1, nvar do 10 i = 1, nnew scr(i) = vars(map(i) + nold * (ivar-1) ) diff --git a/packages/seacas/applications/mapvar-kd/mapvar-kd.f b/packages/seacas/applications/mapvar-kd/mapvar-kd.f index 48e1f183f3a7..122c16880f63 100644 --- a/packages/seacas/applications/mapvar-kd/mapvar-kd.f +++ b/packages/seacas/applications/mapvar-kd/mapvar-kd.f @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -516,7 +516,7 @@ PROGRAM MAPVAR ICOMPL = 1 IF (IM .GT. 1)THEN C ... Get the block b id from the previous time through... -C `IA(NMAP)` is the root of the `MP(1:3,1:MBLK)` array. +C `IA(NMAP)` is the root of the `MP(1:3,1:MBLK)` array. C ida idb isc ida ida idb isc C Memory ordering (1,1), (2,1), (3,1), (1,2), (2,2), (3,2), ..., (3,3)- C +0 +1 +2 +3 +4 +5 diff --git a/packages/seacas/applications/mapvar/mapvar.f b/packages/seacas/applications/mapvar/mapvar.f index f8d2ca255009..53117046c42a 100644 --- a/packages/seacas/applications/mapvar/mapvar.f +++ b/packages/seacas/applications/mapvar/mapvar.f @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -638,7 +638,7 @@ PROGRAM MAPVAR ICOMPL = 1 IF (IM .GT. 1)THEN C ... Get the block b id from the previous time through... -C `IA(NMAP)` is the root of the `MP(1:3,1:MBLK)` array. +C `IA(NMAP)` is the root of the `MP(1:3,1:MBLK)` array. C ida idb isc ida ida idb isc C Memory ordering (1,1), (2,1), (3,1), (1,2), (2,2), (3,2), ..., (3,3)- C +0 +1 +2 +3 +4 +5 diff --git a/packages/seacas/applications/nem_slice/elb.h b/packages/seacas/applications/nem_slice/elb.h index 6255820f5106..77c42a993f86 100644 --- a/packages/seacas/applications/nem_slice/elb.h +++ b/packages/seacas/applications/nem_slice/elb.h @@ -14,16 +14,11 @@ #include #include -#define ELB_VERSION "5.04 (2024/08/19)" +#define ELB_VERSION "5.04 (2024-10-02)" #define UTIL_NAME "nem_slice" #define ELB_FALSE 0 #define ELB_TRUE 1 -/* Macro for maximum value */ -#ifndef MAX -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -#endif - /* * Constants for memory allocation of graph structures. The smaller these * values, the more memory-efficient the code will be. Larger values @@ -53,28 +48,52 @@ template void vec_free(std::vector &V) /* Prototype for timing function */ extern double get_time(); +/* Machine types */ +enum class MachineType { INVALID, MESH, HCUBE, HYPERCUBE, CLUSTER }; + /* Structure used for the description of the machine for which the * load balance is to be constructed. */ struct Machine_Description { - int type{-1}; - int num_dims{-1}; - int dim[3]{}; - int num_boxes{-1}; /* added for cluster type machines */ - int procs_per_box{-1}; /* added for cluster type machines, if there is only - one box, then this is the same as num_procs */ + MachineType type{MachineType::INVALID}; + int num_dims{-1}; + int dim[3]{-1, -1, -1}; + int num_boxes{-1}; /* added for cluster type machines */ + int procs_per_box{-1}; /* added for cluster type machines, if there is only + one box, then this is the same as num_procs */ int num_procs{-1}; +}; - Machine_Description() { dim[0] = dim[1] = dim[2] = -1; } +/* Load balance types */ +enum class Balance { + INVALID, + MULTIKL, + SPECTRAL, + INERTIAL, + LINEAR, + RANDOM, + SCATTERED, + INFILE, + KL_REFINE, + NO_REFINE, + NUM_SECTS, + CNCT_DOM, + OUTFILE, + ZPINCH, + BRICK, + ZOLTAN_RCB, + ZOLTAN_RIB, + ZOLTAN_HSFC, + IGNORE_Z }; /* Structure used for the description of what type of load balance is * to be performed. */ template struct LB_Description { - int type{-1}; + Balance type{-1}; int ignore_z{0}; - int refine{-1}; + Balance refine{-1}; int num_sects{-1}; int cnctd_dom{-1}; int outfile{-1}; @@ -97,22 +116,22 @@ template struct LB_Description std::vector> e_cmap_sides{}; std::vector> e_cmap_procs{}; std::vector> e_cmap_neigh{}; - - LB_Description() = default; }; +enum class DecompType { NODAL, ELEMENTAL }; + /* Structure for the problem description. */ struct Problem_Description { - int type{-1}; - int read_coords{-1}; - int coarse_flag{-1}; - int alloc_graph{-1}; - size_t num_vertices{0}; - int vis_out{-1}; - int skip_checks{-1}; /* put in to skip some error checks for some meshes */ - int face_adj{-1}; /* true if using face definition of adjacencies */ - int partial_adj{0}; /* true if allowing partial (3/4) of nodes to */ + DecompType type{-1}; + int read_coords{-1}; + int coarse_flag{-1}; + int alloc_graph{-1}; + size_t num_vertices{0}; + int vis_out{-1}; + int skip_checks{-1}; /* put in to skip some error checks for some meshes */ + int face_adj{-1}; /* true if using face definition of adjacencies */ + int partial_adj{0}; /* true if allowing partial (3/4) of nodes to */ /* determine adjacencies */ int global_mech{-1}; /* true if looking for mechanisms in original mesh */ int local_mech{-1}; /* true if looking for mechanisms in subdivided mesh */ @@ -126,20 +145,30 @@ struct Problem_Description int num_groups{-1}; int int64db{0}; /* integer types for output mesh database */ int int64api{0}; /* integer types for exodus api calls */ - - Problem_Description() = default; }; +/* Solver options */ +enum class SolverOptions { INVALID, TOLER, USE_RQI, VMAX }; + /* Structure for parameters needed for the Eigensolver in Chaco */ struct Solver_Description { - double tolerance{-1.0}; - int rqi_flag{-1}; - int vmax{-1}; - - Solver_Description() = default; + double tolerance{-1.0}; + SolverOptions rqi_flag{SolverOptions::INVALID}; + int vmax{-1}; }; +/* Weighting options */ +/* + * NOTE: the position of NO_WEIGHT, READ_EXO, EL_BLK, and EWGT_ON + * should not be changed. These are the possible values for the + * "type" variable in the Weight struct. They need to b 0, 1, 2, & 4 + * to allow bit masking for the type. The other variables are not + * currently used in the type, but are needed since they appear + * on the command line. + */ +enum WeightingOptions { NO_WEIGHT, READ_EXO, EL_BLK, VAR_INDX, EDGE_WGT, TIME_INDX, VAR_NAME }; + /* Structure used to store information about the weighting scheme, if * any, that is to be used. */ struct Weight_Description @@ -165,31 +194,27 @@ struct Weight_Description std::vector vertices{}; std::vector edges{}; - - Weight_Description() = default; }; /* Structure used to store information about the FEM mesh */ template struct Mesh_Description { - size_t num_nodes{0}; - size_t num_elems{0}; - size_t num_dims{0}; - size_t num_el_blks{0}; - std::vector eb_cnts{}; - std::vector eb_ids{}; - std::vector eb_npe{}; - std::vector eb_type{}; - size_t num_node_sets{0}; - size_t num_side_sets{0}; - size_t max_np_elem{0}; - size_t ns_list_len{0}; - char title[MAX_LINE_LENGTH + 1]{}; - std::vector coords{}; - std::vector elem_type{}; - INT **connect; - - Mesh_Description() : connect(nullptr) {} + size_t num_nodes{0}; + size_t num_elems{0}; + size_t num_dims{0}; + size_t num_el_blks{0}; + std::vector eb_cnts{}; + std::vector eb_ids{}; + std::vector eb_npe{}; + std::vector eb_type{}; + size_t num_node_sets{0}; + size_t num_side_sets{0}; + size_t max_np_elem{0}; + size_t ns_list_len{0}; + char title[MAX_LINE_LENGTH + 1]{}; + std::vector coords{}; + std::vector elem_type{}; + INT **connect{nullptr}; }; /* Structure for handling meshes with spheres */ @@ -199,8 +224,6 @@ struct Sphere_Info std::vector adjust{}; std::vector begin{}; std::vector end{}; - - Sphere_Info() = default; }; /* Structure used to store various information about the graph */ @@ -211,52 +234,11 @@ template struct Graph_Description std::vector adj{}; std::vector start{}; std::vector> sur_elem; - Graph_Description() = default; }; /* Various constants */ -enum DecompType { NODAL, ELEMENTAL }; #define UTIL_NAME "nem_slice" -/* Load balance types */ -enum Balance { - MULTIKL, - SPECTRAL, - INERTIAL, - LINEAR, - RANDOM, - SCATTERED, - INFILE, - KL_REFINE, - NO_REFINE, - NUM_SECTS, - CNCT_DOM, - OUTFILE, - ZPINCH, - BRICK, - ZOLTAN_RCB, - ZOLTAN_RIB, - ZOLTAN_HSFC, - IGNORE_Z -}; - -/* Machine types */ -enum MachineType { MESH, HCUBE, HYPERCUBE, CLUSTER }; - -/* Solver options */ -enum SolverOptions { TOLER, USE_RQI, VMAX }; - /* ISSUES options */ -enum Issues { LOCAL_ISSUES, GLOBAL_ISSUES }; - -/* Weighting options */ -/* - * NOTE: the position of NO_WEIGHT, READ_EXO, EL_BLK, and EWGT_ON - * should not be changed. These are the possible values for the - * "type" variable in the Weight struct. They need to b 0, 1, 2, & 4 - * to allow bit masking for the type. The other variables are not - * currently used in the type, but are needed since they appear - * on the command line. - */ -enum WeightingOptions { NO_WEIGHT, READ_EXO, EL_BLK, VAR_INDX, EDGE_WGT, TIME_INDX, VAR_NAME }; +enum class Issues { LOCAL_ISSUES, GLOBAL_ISSUES }; diff --git a/packages/seacas/applications/nem_slice/elb_elem.C b/packages/seacas/applications/nem_slice/elb_elem.C index f706c25dee7b..d7affc06fe49 100644 --- a/packages/seacas/applications/nem_slice/elb_elem.C +++ b/packages/seacas/applications/nem_slice/elb_elem.C @@ -38,32 +38,32 @@ namespace { * Need the number of dimensions in order to distinguish between * TRI elements in a 2d mesh from TRI elements in a 3d mesh. *****************************************************************************/ -const char *elem_name_from_enum(const E_Type elem_type) +const char *elem_name_from_enum(const ElementType elem_type) { - static const char *elem_names[NULL_EL] = { + static const char *elem_names[(int)ElementType::NULL_EL] = { "SPHERE", "BAR2", "BAR3", "QUAD4", "QUAD8", "QUAD9", "SHELL4", "SHELL8", "SHELL9", "TRI3", "TRI4", "TRI6", "TRI7", "TSHELL3", "TSHELL4", "TSHELL6", "TSHELL7", "HEX8", "HEX16", "HEX20", "HEX27", "HEXSHELL", "TET4", "TET10", "TET8", "TET14", "TET15", "WEDGE6", "WEDGE12", "WEDGE15", "WEDGE16", "WEDGE20", "WEDGE21", "PYRAMID5", "PYRAMID13", - "PYRAMID14", "PYRAMID18", "PYRAMID19", "SHELL2", "SHELL3"}; - return elem_names[elem_type]; + "PYRAMID14", "PYRAMID18", "PYRAMID19", "SHELL2", "SHELL3", "BAR1D2", "BAR1D3"}; + return elem_names[(int)elem_type]; } -E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_dim) +ElementType get_elem_type(const char *elem_name, const int num_nodes, const int num_dim) { - E_Type answer = NULL_EL; + ElementType answer = ElementType::NULL_EL; switch (elem_name[0]) { case 'h': case 'H': if (strncasecmp(elem_name, "HEX", 3) == 0) { switch (num_nodes) { - case 8: answer = HEX8; break; - case 12: answer = HEXSHELL; break; - case 16: answer = HEX16; break; - case 20: answer = HEX20; break; - case 27: answer = HEX27; break; + case 8: answer = ElementType::HEX8; break; + case 12: answer = ElementType::HEXSHELL; break; + case 16: answer = ElementType::HEX16; break; + case 20: answer = ElementType::HEX20; break; + case 27: answer = ElementType::HEX27; break; default: Gen_Error(0, "fatal: unsupported HEX element"); error_report(); @@ -75,20 +75,20 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d case 'c': case 'C': if (strncasecmp(elem_name, "CIRCLE", 6) == 0) { - answer = SPHERE; + answer = ElementType::SPHERE; } break; case 's': case 'S': if (strncasecmp(elem_name, "SPHERE", 6) == 0) { - answer = SPHERE; + answer = ElementType::SPHERE; } else if (strncasecmp(elem_name, "SHELL", 5) == 0) { switch (num_nodes) { case 2: if (num_dim == 2) { - answer = SHELL2; + answer = ElementType::SHELL2; } else { Gen_Error(0, "fatal: unsupported SHELL element"); @@ -98,7 +98,7 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d break; case 3: if (num_dim == 2) { - answer = SHELL3; + answer = ElementType::SHELL3; } else { Gen_Error(0, "fatal: unsupported SHELL element"); @@ -106,9 +106,9 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d exit(1); } break; - case 4: answer = SHELL4; break; - case 8: answer = SHELL8; break; - case 9: answer = SHELL9; break; + case 4: answer = ElementType::SHELL4; break; + case 8: answer = ElementType::SHELL8; break; + case 9: answer = ElementType::SHELL9; break; default: Gen_Error(0, "fatal: unsupported SHELL element"); error_report(); @@ -126,8 +126,8 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d if (strncasecmp(elem_name, "BEAM", 4) == 0 || strncasecmp(elem_name, "TRUSS", 5) == 0 || strncasecmp(elem_name, "ROD", 3) == 0 || strncasecmp(elem_name, "BAR", 3) == 0) { switch (num_nodes) { - case 2: answer = BAR2; break; - case 3: answer = BAR3; break; + case 2: answer = num_dim == 1 ? ElementType::BAR1D2 : ElementType::BAR2; break; + case 3: answer = num_dim == 1 ? ElementType::BAR1D3 : ElementType::BAR3; break; default: Gen_Error(0, "fatal: unsupported BAR/BEAM/TRUSS element"); error_report(); @@ -138,34 +138,34 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d switch (num_nodes) { case 3: if (num_dim == 2) { - answer = TRI3; + answer = ElementType::TRI3; } else { - answer = TSHELL3; + answer = ElementType::TSHELL3; } break; case 4: if (num_dim == 2) { - answer = TRI4; + answer = ElementType::TRI4; } else { - answer = TSHELL4; + answer = ElementType::TSHELL4; } break; case 6: if (num_dim == 2) { - answer = TRI6; + answer = ElementType::TRI6; } else { - answer = TSHELL6; + answer = ElementType::TSHELL6; } break; case 7: if (num_dim == 2) { - answer = TRI7; + answer = ElementType::TRI7; } else { - answer = TSHELL7; + answer = ElementType::TSHELL7; } break; default: @@ -176,11 +176,11 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d } else if (strncasecmp(elem_name, "TET", 3) == 0) { switch (num_nodes) { - case 4: answer = TET4; break; - case 8: answer = TET8; break; - case 10: answer = TET10; break; - case 14: answer = TET14; break; - case 15: answer = TET15; break; + case 4: answer = ElementType::TET4; break; + case 8: answer = ElementType::TET8; break; + case 10: answer = ElementType::TET10; break; + case 14: answer = ElementType::TET14; break; + case 15: answer = ElementType::TET15; break; default: Gen_Error(0, "fatal: unsupported TET element"); error_report(); @@ -195,26 +195,26 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d switch (num_nodes) { case 4: if (num_dim == 2) { - answer = QUAD4; + answer = ElementType::QUAD4; } else { - answer = SHELL4; + answer = ElementType::SHELL4; } break; case 8: if (num_dim == 2) { - answer = QUAD8; + answer = ElementType::QUAD8; } else { - answer = SHELL8; + answer = ElementType::SHELL8; } break; case 9: if (num_dim == 2) { - answer = QUAD9; + answer = ElementType::QUAD9; } else { - answer = SHELL9; + answer = ElementType::SHELL9; } break; default: @@ -229,12 +229,12 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d case 'W': if (strncasecmp(elem_name, "WEDGE", 5) == 0) { switch (num_nodes) { - case 6: answer = WEDGE6; break; - case 12: answer = WEDGE12; break; - case 15: answer = WEDGE15; break; - case 16: answer = WEDGE16; break; - case 20: answer = WEDGE20; break; - case 21: answer = WEDGE21; break; + case 6: answer = ElementType::WEDGE6; break; + case 12: answer = ElementType::WEDGE12; break; + case 15: answer = ElementType::WEDGE15; break; + case 16: answer = ElementType::WEDGE16; break; + case 20: answer = ElementType::WEDGE20; break; + case 21: answer = ElementType::WEDGE21; break; default: Gen_Error(0, "fatal: unsupported WEDGE element"); error_report(); @@ -247,11 +247,11 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d case 'P': if (strncasecmp(elem_name, "PYR", 3) == 0) { switch (num_nodes) { - case 5: answer = PYRAMID5; break; - case 13: answer = PYRAMID13; break; - case 14: answer = PYRAMID14; break; - case 18: answer = PYRAMID18; break; - case 19: answer = PYRAMID19; break; + case 5: answer = ElementType::PYRAMID5; break; + case 13: answer = ElementType::PYRAMID13; break; + case 14: answer = ElementType::PYRAMID14; break; + case 18: answer = ElementType::PYRAMID18; break; + case 19: answer = ElementType::PYRAMID19; break; default: Gen_Error(0, "fatal: unsupported PYRAMID element"); error_report(); @@ -263,7 +263,7 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d default: break; } - if (answer == NULL_EL) { + if (answer == ElementType::NULL_EL) { std::string errstr; errstr = fmt::format("fatal: unknown element type '{}' read", elem_name); Gen_Error(0, errstr); @@ -280,33 +280,35 @@ E_Type get_elem_type(const char *elem_name, const int num_nodes, const int num_d /*****************************************************************************/ /* Convenience functions for code readability *****************************************************************************/ -int is_hex(E_Type etype) +bool is_hex(ElementType etype) { - return static_cast(etype == HEX8 || etype == HEX27 || etype == HEX20 || etype == HEXSHELL); + return etype == ElementType::HEX8 || etype == ElementType::HEX27 || etype == ElementType::HEX20 || + etype == ElementType::HEXSHELL; } -int is_tet(E_Type etype) +bool is_tet(ElementType etype) { - return static_cast(etype == TET4 || etype == TET10 || etype == TET8 || etype == TET14 || - etype == TET15); + return etype == ElementType::TET4 || etype == ElementType::TET10 || etype == ElementType::TET8 || + etype == ElementType::TET14 || etype == ElementType::TET15; } -int is_wedge(E_Type etype) +bool is_wedge(ElementType etype) { - return static_cast(etype == WEDGE6 || etype == WEDGE15 || etype == WEDGE16 || - etype == WEDGE20 || etype == WEDGE21); + return etype == ElementType::WEDGE6 || etype == ElementType::WEDGE15 || + etype == ElementType::WEDGE16 || etype == ElementType::WEDGE20 || + etype == ElementType::WEDGE21; } -int is_pyramid(E_Type etype) +bool is_pyramid(ElementType etype) { - return static_cast(etype == PYRAMID5 || etype == PYRAMID13 || etype == PYRAMID14 || - etype == PYRAMID18 || etype == PYRAMID19); + return etype == ElementType::PYRAMID5 || etype == ElementType::PYRAMID13 || + etype == ElementType::PYRAMID14 || etype == ElementType::PYRAMID18 || + etype == ElementType::PYRAMID19; } -int is_3d_element(E_Type etype) +bool is_3d_element(ElementType etype) { - return static_cast((is_hex(etype) != 0) || (is_tet(etype) != 0) || (is_wedge(etype) != 0) || - (is_pyramid(etype) != 0)); + return is_hex(etype) || is_tet(etype) || is_wedge(etype) || is_pyramid(etype); } /*****************************************************************************/ @@ -316,19 +318,19 @@ int is_3d_element(E_Type etype) *---------------------------------------------------------------------------- * This function returns various information about the input element type. *****************************************************************************/ -int get_elem_info(const int req, const E_Type etype) +int get_elem_info(const ElementInfo req, const ElementType etype) { int answer = 0; switch (etype) /* Switch over the element type */ { - case BAR2: + case ElementType::BAR1D2: switch (req) { - case NNODES: answer = 2; break; - case NSIDE_NODES: answer = 1; break; - case NSIDES: answer = 2; break; - case NDIM: /* number of physical dimensions */ answer = 1; break; + case ElementInfo::NNODES: answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 1; break; + case ElementInfo::NSIDES: answer = 2; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -336,12 +338,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case SHELL2: + case ElementType::BAR2: switch (req) { - case NNODES: answer = 2; break; - case NSIDE_NODES: answer = 2; break; - case NSIDES: answer = 1; break; - case NDIM: /* number of physical dimensions */ answer = 1; break; + case ElementInfo::NNODES: answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 1; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -349,12 +351,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case SHELL3: + case ElementType::SHELL2: switch (req) { - case NNODES: answer = 3; break; - case NSIDE_NODES: answer = 2; break; - case NSIDES: answer = 1; break; - case NDIM: /* number of physical dimensions */ answer = 1; break; + case ElementInfo::NNODES: answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 1; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -362,12 +364,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case BAR3: + case ElementType::SHELL3: switch (req) { - case NNODES: answer = 3; break; - case NSIDE_NODES: answer = 1; break; - case NSIDES: answer = 2; break; - case NDIM: /* number of physical dimensions */ answer = 1; break; + case ElementInfo::NNODES: answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 1; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -375,22 +377,48 @@ int get_elem_info(const int req, const E_Type etype) } break; - case SPHERE: + case ElementType::BAR1D3: switch (req) { - case NNODES: answer = 1; break; - case NSIDE_NODES: answer = 0; break; - case NSIDES: answer = 0; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 1; break; + case ElementInfo::NSIDES: answer = 2; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; + default: + Gen_Error(0, "fatal: unknown quantity"); + error_report(); + exit(1); } break; - case QUAD4: /* First order quad */ - switch (req) /* select type of information required*/ + case ElementType::BAR3: + switch (req) { + case ElementInfo::NNODES: answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 1; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 1; break; + default: + Gen_Error(0, "fatal: unknown quantity"); + error_report(); + exit(1); + } + break; + + case ElementType::SPHERE: + switch (req) { + case ElementInfo::NNODES: answer = 1; break; + case ElementInfo::NSIDE_NODES: answer = 0; break; + case ElementInfo::NSIDES: answer = 0; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + } + break; + + case ElementType::QUAD4: /* First order quad */ + switch (req) /* select type of information required*/ { - case NNODES: /* number of nodes */ answer = 4; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 2; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 4; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal:unknown quantity"); error_report(); @@ -398,13 +426,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case QUAD8: /* 2nd order serendipity quad */ - switch (req) /* select type of information required */ + case ElementType::QUAD8: /* 2nd order serendipity quad */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 8; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 3; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 8; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 3; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -412,13 +440,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case QUAD9: /* biquadratic quadrilateral */ - switch (req) /* select type of information required */ + case ElementType::QUAD9: /* biquadratic quadrilateral */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 9; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 3; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 9; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 3; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -427,11 +455,11 @@ int get_elem_info(const int req, const E_Type etype) break; /* NOTE: cannot determine NSIDE_NODES for SHELL element */ - case SHELL4: + case ElementType::SHELL4: switch (req) { - case NNODES: answer = 4; break; - case NSIDES: answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NNODES: answer = 4; break; + case ElementInfo::NSIDES: answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -439,11 +467,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case SHELL8: + case ElementType::SHELL8: switch (req) { - case NNODES: answer = 8; break; - case NSIDES: answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NNODES: answer = 8; break; + case ElementInfo::NSIDES: answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -451,11 +479,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case SHELL9: + case ElementType::SHELL9: switch (req) { - case NNODES: answer = 9; break; - case NSIDES: answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NNODES: answer = 9; break; + case ElementInfo::NSIDES: answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -463,13 +491,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TRI3: + case ElementType::TRI3: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 3; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 2; break; - case NSIDES: answer = 3; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 3; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -477,13 +505,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TRI4: + case ElementType::TRI4: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 4; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 2; break; - case NSIDES: answer = 3; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 4; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 2; break; + case ElementInfo::NSIDES: answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -491,13 +519,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TRI6: + case ElementType::TRI6: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 3; break; - case NSIDES: answer = 3; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 3; break; + case ElementInfo::NSIDES: answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -505,13 +533,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TRI7: + case ElementType::TRI7: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 7; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDE_NODES: answer = 3; break; - case NSIDES: answer = 3; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 7; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDE_NODES: answer = 3; break; + case ElementInfo::NSIDES: answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -520,12 +548,12 @@ int get_elem_info(const int req, const E_Type etype) break; /* NOTE: cannot determine NSIDE_NODES for TSHELL element */ - case TSHELL3: + case ElementType::TSHELL3: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 3; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDES: answer = 5; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 3; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDES: answer = 5; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -533,12 +561,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TSHELL4: + case ElementType::TSHELL4: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 4; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDES: answer = 5; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 4; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDES: answer = 5; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -546,12 +574,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TSHELL6: + case ElementType::TSHELL6: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDES: answer = 5; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDES: answer = 5; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -559,12 +587,12 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TSHELL7: + case ElementType::TSHELL7: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 7; break; - case NDIM: /* number of physical dimensions */ answer = 2; break; - case NSIDES: answer = 5; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 7; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 2; break; + case ElementInfo::NSIDES: answer = 5; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -572,13 +600,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case HEX8: /* trilinear hexahedron */ - switch (req) /* select type of information required */ + case ElementType::HEX8: /* trilinear hexahedron */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 8; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 4; break; - case NSIDES: answer = 6; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 8; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 4; break; + case ElementInfo::NSIDES: answer = 6; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -586,11 +614,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case HEX16: /* localization element NSNODES is not consistent... */ + case ElementType::HEX16: /* localization element NSNODES is not consistent... */ switch (req) { - case NNODES: /* number of nodes */ answer = 16; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDES: answer = 6; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 16; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDES: answer = 6; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -598,13 +626,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case HEX20: /* serendipity triquadratic hexahedron */ - switch (req) /* select type of information required */ + case ElementType::HEX20: /* serendipity triquadratic hexahedron */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 20; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 8; break; - case NSIDES: answer = 6; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 20; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 8; break; + case ElementInfo::NSIDES: answer = 6; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -612,13 +640,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case HEX27: /* triquadratic hexahedron */ - switch (req) /* select type of information required*/ + case ElementType::HEX27: /* triquadratic hexahedron */ + switch (req) /* select type of information required*/ { - case NNODES: /* number of nodes */ answer = 27; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 9; break; - case NSIDES: answer = 6; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 27; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 9; break; + case ElementInfo::NSIDES: answer = 6; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -627,11 +655,11 @@ int get_elem_info(const int req, const E_Type etype) break; /* NOTE: cannot determine NSIDE_NODES for HEXSHELL element */ - case HEXSHELL: + case ElementType::HEXSHELL: switch (req) { - case NNODES: answer = 12; break; - case NSIDES: answer = 6; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 12; break; + case ElementInfo::NSIDES: answer = 6; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -639,13 +667,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TET4: /* trilinear tetrahedron */ - switch (req) /* select type of information required*/ + case ElementType::TET4: /* trilinear tetrahedron */ + switch (req) /* select type of information required*/ { - case NNODES: /* number of nodes */ answer = 4; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 3; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 4; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 3; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -653,13 +681,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TET10: /* triquadradic tetrahedron */ - switch (req) /* select type of information required */ + case ElementType::TET10: /* triquadradic tetrahedron */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 10; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 6; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 10; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 6; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -667,13 +695,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TET14: + case ElementType::TET14: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 14; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 7; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 14; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 7; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -681,13 +709,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TET15: + case ElementType::TET15: switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 15; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 7; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 15; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 7; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -695,13 +723,13 @@ int get_elem_info(const int req, const E_Type etype) } break; - case TET8: /* 8-node (midface nodes) tetrahedron */ - switch (req) /* select type of information required */ + case ElementType::TET8: /* 8-node (midface nodes) tetrahedron */ + switch (req) /* select type of information required */ { - case NNODES: /* number of nodes */ answer = 8; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; - case NSIDE_NODES: answer = 4; break; - case NSIDES: answer = 4; break; + case ElementInfo::NNODES: /* number of nodes */ answer = 8; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NSIDE_NODES: answer = 4; break; + case ElementInfo::NSIDES: answer = 4; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -710,11 +738,11 @@ int get_elem_info(const int req, const E_Type etype) break; /* NOTE: cannot determine NSIDE_NODES for WEDGE elements */ - case WEDGE6: + case ElementType::WEDGE6: switch (req) { - case NNODES: answer = 6; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 6; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -722,11 +750,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case WEDGE12: + case ElementType::WEDGE12: switch (req) { - case NNODES: answer = 12; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 12; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -734,11 +762,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case WEDGE15: + case ElementType::WEDGE15: switch (req) { - case NNODES: answer = 15; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 15; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -746,11 +774,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case WEDGE16: + case ElementType::WEDGE16: switch (req) { - case NNODES: answer = 16; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 16; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -758,11 +786,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case WEDGE20: + case ElementType::WEDGE20: switch (req) { - case NNODES: answer = 20; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 20; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -770,11 +798,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case WEDGE21: + case ElementType::WEDGE21: switch (req) { - case NNODES: answer = 21; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 21; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -783,11 +811,11 @@ int get_elem_info(const int req, const E_Type etype) break; /* NOTE: cannot determine NSIDE_NODES for PYRAMID element */ - case PYRAMID5: + case ElementType::PYRAMID5: switch (req) { - case NNODES: answer = 5; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 5; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -795,11 +823,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case PYRAMID13: + case ElementType::PYRAMID13: switch (req) { - case NNODES: answer = 13; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 13; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -807,11 +835,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case PYRAMID14: + case ElementType::PYRAMID14: switch (req) { - case NNODES: answer = 14; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 14; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -819,11 +847,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case PYRAMID18: + case ElementType::PYRAMID18: switch (req) { - case NNODES: answer = 18; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 18; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -831,11 +859,11 @@ int get_elem_info(const int req, const E_Type etype) } break; - case PYRAMID19: + case ElementType::PYRAMID19: switch (req) { - case NNODES: answer = 19; break; - case NSIDES: answer = 5; break; - case NDIM: /* number of physical dimensions */ answer = 3; break; + case ElementInfo::NNODES: answer = 19; break; + case ElementInfo::NSIDES: answer = 5; break; + case ElementInfo::NDIM: /* number of physical dimensions */ answer = 3; break; default: Gen_Error(0, "fatal: unknown quantity"); error_report(); @@ -866,18 +894,16 @@ int get_elem_info(const int req, const E_Type etype) * * Now supoports degenerate faces in HEX elements. *****************************************************************************/ -template int get_side_id(const E_Type etype, const int *connect, const int nsnodes, +template int get_side_id(const ElementType etype, const int *connect, const int nsnodes, int side_nodes[], const int skip_check, const int partial_adj); -template int get_side_id(const E_Type etype, const int64_t *connect, const int nsnodes, +template int get_side_id(const ElementType etype, const int64_t *connect, const int nsnodes, int64_t side_nodes[], const int skip_check, const int partial_adj); template -int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT side_nodes[], +int get_side_id(const ElementType etype, const INT *connect, const int nsnodes, INT side_nodes[], const int skip_check, const int partial_adj) { - int dup; - int location[9]; - int count; + int count = 0; /* min_match for hex elements means that min_match+1 nodes on a face of a hex must match to return the side of the hex on which the nodes exist, i.e., if 3/4 nodes of a hex @@ -891,7 +917,8 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s /* const int min_match = 2; */ /* check if this is a degenerate face */ - dup = 0; + int dup = 0; + std::array location{}; for (int i = 0; i < (nsnodes - 1); i++) { for (int j = (i + 1); j < nsnodes; j++) { if (side_nodes[i] == side_nodes[j]) { @@ -900,7 +927,7 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s } } - int nnodes = get_elem_info(NNODES, etype); + int nnodes = get_elem_info(ElementInfo::NNODES, etype); /* Find all of the side nodes in the connect table */ int num = 0; @@ -943,8 +970,8 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s /* Find the side ID */ switch (etype) { - case BAR2: - case BAR3: + case ElementType::BAR1D2: + case ElementType::BAR1D3: /* SIDE 1 */ if (side_nodes[0] == connect[0]) { return 1; @@ -954,16 +981,18 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s } break; - case SHELL2: - case SHELL3: + case ElementType::BAR2: + case ElementType::BAR3: + case ElementType::SHELL2: + case ElementType::SHELL3: /* SIDE 1 */ if (side_nodes[0] == connect[0] && side_nodes[1] == connect[1]) { return 1; } break; - case QUAD4: - case QUAD8: - case QUAD9: + case ElementType::QUAD4: + case ElementType::QUAD8: + case ElementType::QUAD9: /* SIDE 1 */ if (side_nodes[0] == connect[0] && side_nodes[1] == connect[1]) { return 1; @@ -986,10 +1015,10 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case TRI3: - case TRI4: - case TRI6: - case TRI7: + case ElementType::TRI3: + case ElementType::TRI4: + case ElementType::TRI6: + case ElementType::TRI7: /* SIDE 1 */ if (side_nodes[0] == connect[0] && side_nodes[1] == connect[1]) { return 1; @@ -1007,11 +1036,11 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case TET4: - case TET10: - case TET14: - case TET15: - case TET8: + case ElementType::TET4: + case ElementType::TET10: + case ElementType::TET14: + case ElementType::TET15: + case ElementType::TET8: /* check the # of side nodes */ if (nsnodes < 3) { return 0; @@ -1039,11 +1068,11 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case HEX8: - case HEX16: - case HEX20: - case HEX27: - case HEXSHELL: /* this should be the same as a HEX element */ + case ElementType::HEX8: + case ElementType::HEX16: + case ElementType::HEX20: + case ElementType::HEX27: + case ElementType::HEXSHELL: /* this should be the same as a HEX element */ /* check the # of side nodes */ if (nsnodes < 4) { return 0; @@ -1213,9 +1242,9 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case SHELL4: - case SHELL8: - case SHELL9: + case ElementType::SHELL4: + case ElementType::SHELL8: + case ElementType::SHELL9: /* 2D sides */ if (nsnodes == 2 || nsnodes == 3) { @@ -1258,12 +1287,12 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case WEDGE6: - case WEDGE12: - case WEDGE15: - case WEDGE16: - case WEDGE20: - case WEDGE21: + case ElementType::WEDGE6: + case ElementType::WEDGE12: + case ElementType::WEDGE15: + case ElementType::WEDGE16: + case ElementType::WEDGE20: + case ElementType::WEDGE21: /* quad sides */ if (nsnodes == 4 || nsnodes == 8 || nsnodes == 9) { @@ -1303,13 +1332,14 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case TSHELL3: - case TSHELL4: - case TSHELL6: - case TSHELL7: + case ElementType::TSHELL3: + case ElementType::TSHELL4: + case ElementType::TSHELL6: + case ElementType::TSHELL7: /* 2D sides */ - if (nsnodes == 2 || (etype == TSHELL6 && nsnodes == 3) || (etype == TSHELL7 && nsnodes == 3)) { + if (nsnodes == 2 || (etype == ElementType::TSHELL6 && nsnodes == 3) || + (etype == ElementType::TSHELL7 && nsnodes == 3)) { /* SIDE 3 */ if (side_nodes[0] == connect[0] && side_nodes[1] == connect[1]) { return 3; @@ -1340,11 +1370,11 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case PYRAMID5: - case PYRAMID13: - case PYRAMID14: - case PYRAMID18: - case PYRAMID19: + case ElementType::PYRAMID5: + case ElementType::PYRAMID13: + case ElementType::PYRAMID14: + case ElementType::PYRAMID18: + case ElementType::PYRAMID19: /* triangular sides */ if (nsnodes == 3 || nsnodes == 6 || nsnodes == 7) { /* SIDE 1 */ @@ -1384,7 +1414,7 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s break; - case SPHERE: break; + case ElementType::SPHERE: break; default: { std::string err_buff; @@ -1410,29 +1440,25 @@ int get_side_id(const E_Type etype, const INT *connect, const int nsnodes, INT s * connected to a side of a hex, there are only three nodes connecting * the two. In this case a side id can be found. *****************************************************************************/ -template int get_side_id_hex_tet(const E_Type etype, const int *connect, int nsnodes, +template int get_side_id_hex_tet(const ElementType etype, const int *connect, int nsnodes, const int side_nodes[]); -template int get_side_id_hex_tet(const E_Type etype, const int64_t *connect, int nsnodes, +template int get_side_id_hex_tet(const ElementType etype, const int64_t *connect, int nsnodes, const int64_t side_nodes[]); template -int get_side_id_hex_tet(const E_Type etype, /* The element type */ - const INT *connect, /* The element connectivity */ - int nsnodes, /* The number of side nodes */ - const INT side_nodes[]) /* The list of side node IDs */ +int get_side_id_hex_tet(const ElementType etype, /* The element type */ + const INT *connect, /* The element connectivity */ + int nsnodes, /* The number of side nodes */ + const INT side_nodes[]) /* The list of side node IDs */ { - int nnodes; - int lcnt; - int i1; - int i2; - std::vector loc_node_ids(MAX_SIDE_NODES); + std::array loc_node_ids{}; - nnodes = get_elem_info(NNODES, etype); + int nnodes = get_elem_info(ElementInfo::NNODES, etype); /* Find the local node numbers for nodes forming the side */ - lcnt = 0; - for (i1 = 0; i1 < nnodes; i1++) { - for (i2 = 0; i2 < nsnodes; i2++) { + int lcnt = 0; + for (int i1 = 0; i1 < nnodes; i1++) { + for (int i2 = 0; i2 < nsnodes; i2++) { if (connect[i1] == side_nodes[i2]) { loc_node_ids[lcnt++] = i1 + 1; break; @@ -1444,11 +1470,11 @@ int get_side_id_hex_tet(const E_Type etype, /* The element type */ } switch (etype) { - case TET4: - case TET10: - case TET8: - case TET14: - case TET15: { + case ElementType::TET4: + case ElementType::TET10: + case ElementType::TET8: + case ElementType::TET14: + case ElementType::TET15: { auto il1 = in_list(1, lcnt, Data(loc_node_ids)) >= 0; auto il2 = in_list(2, lcnt, Data(loc_node_ids)) >= 0; auto il3 = in_list(3, lcnt, Data(loc_node_ids)) >= 0; @@ -1471,10 +1497,10 @@ int get_side_id_hex_tet(const E_Type etype, /* The element type */ } } break; - case HEX8: - case HEX16: - case HEX20: - case HEX27: { + case ElementType::HEX8: + case ElementType::HEX16: + case ElementType::HEX20: + case ElementType::HEX27: { auto il1 = in_list(1, lcnt, Data(loc_node_ids)) >= 0 ? 1 : 0; auto il2 = in_list(2, lcnt, Data(loc_node_ids)) >= 0 ? 1 : 0; auto il3 = in_list(3, lcnt, Data(loc_node_ids)) >= 0 ? 1 : 0; @@ -1532,16 +1558,16 @@ int get_side_id_hex_tet(const E_Type etype, /* The element type */ * the element type, and the side id. It also returns the number of nodes * in that side. *****************************************************************************/ -template int ss_to_node_list(const E_Type etype, const int *connect, int side_num, +template int ss_to_node_list(const ElementType etype, const int *connect, int side_num, int ss_node_list[]); -template int ss_to_node_list(const E_Type etype, const int64_t *connect, int side_num, +template int ss_to_node_list(const ElementType etype, const int64_t *connect, int side_num, int64_t ss_node_list[]); template -int ss_to_node_list(const E_Type etype, /* The element type */ - const INT *connect, /* The element connectivity */ - int side_num, /* The element side number */ - INT ss_node_list[]) /* The list of side node IDs */ +int ss_to_node_list(const ElementType etype, /* The element type */ + const INT *connect, /* The element connectivity */ + int side_num, /* The element side number */ + INT ss_node_list[]) /* The list of side node IDs */ { int i = 0; @@ -1670,394 +1696,337 @@ int ss_to_node_list(const E_Type etype, /* The element type */ {1, 4, 3, 2, 9, 8, 7, 6, 14} // side 5 (quad) }; - static int shell_bar_table[1][3] = {{1, 2, 3}}; - static int bar_table[2][1] = {{1}, {2}}; + static int bar_table[1][3] = {{1, 2, 3}}; /* Locally decrement side_num */ side_num--; /* Switch over the element type. */ switch (etype) { - case BAR3: - case BAR2: - /* Bar1 has 2 sides, each is a single node */ - for (i = 0; i < 1; i++) { - ss_node_list[i] = connect[(bar_table[side_num][i] - 1)]; - } + case ElementType::BAR1D2: + case ElementType::BAR1D3: + ss_node_list[0] = connect[side_num]; + i = 1; break; - case SHELL2: + case ElementType::BAR2: + case ElementType::SHELL2: /* Bar1 has 1 side */ for (i = 0; i < 2; i++) { - ss_node_list[i] = connect[(shell_bar_table[side_num][i] - 1)]; + ss_node_list[i] = connect[bar_table[side_num][i] - 1]; } break; - case SHELL3: + case ElementType::BAR3: + case ElementType::SHELL3: /* Bar has 1 side */ for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(shell_bar_table[side_num][i] - 1)]; + ss_node_list[i] = connect[bar_table[side_num][i] - 1]; } break; - case QUAD4: + case ElementType::QUAD4: for (i = 0; i < 2; i++) { - ss_node_list[i] = connect[(quad_table[side_num][i] - 1)]; + ss_node_list[i] = connect[quad_table[side_num][i] - 1]; } break; - case QUAD8: - case QUAD9: + case ElementType::QUAD8: + case ElementType::QUAD9: for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(quad_table[side_num][i] - 1)]; + ss_node_list[i] = connect[quad_table[side_num][i] - 1]; } break; - case SHELL4: - switch (side_num) { - case 0: - case 1: + case ElementType::SHELL4: + if (side_num == 0 || side_num == 1) { for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(shell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[shell_table[side_num][i] - 1]; } - break; - - default: + } + else { /* * sides 3, 4, 5, & 6 correspond to sides 1, 2, 3, & 4 * of the quad element. */ for (i = 0; i < 2; i++) { - ss_node_list[i] = connect[(quad_table[(side_num - 2)][i] - 1)]; + ss_node_list[i] = connect[quad_table[side_num - 2][i] - 1]; } - break; } break; - case SHELL8: - switch (side_num) { - case 0: - case 1: + case ElementType::SHELL8: + if (side_num == 0 || side_num == 1) { for (i = 0; i < 8; i++) { - ss_node_list[i] = connect[(shell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[shell_table[side_num][i] - 1]; } - break; - - default: + } + else { /* * sides 3, 4, 5, & 6 correspond to sides 1, 2, 3, & 4 * of the quad element. */ for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(quad_table[(side_num - 2)][i] - 1)]; + ss_node_list[i] = connect[quad_table[side_num - 2][i] - 1]; } - break; } break; - case SHELL9: - switch (side_num) { - case 0: - case 1: + case ElementType::SHELL9: + if (side_num == 0 || side_num == 1) { for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(shell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[shell_table[side_num][i] - 1]; } - break; - - default: + } + else { /* * sides 3, 4, 5, & 6 correspond to sides 1, 2, 3, & 4 * of the quad element. */ for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(quad_table[(side_num - 2)][i] - 1)]; + ss_node_list[i] = connect[quad_table[(side_num - 2)][i] - 1]; } - break; } break; - case TRI3: - case TRI4: + case ElementType::TRI3: + case ElementType::TRI4: for (i = 0; i < 2; i++) { - ss_node_list[i] = connect[(tri_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tri_table[side_num][i] - 1]; } break; - case TRI6: - case TRI7: + case ElementType::TRI6: + case ElementType::TRI7: for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(tri_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tri_table[side_num][i] - 1]; } break; - case TSHELL3: - case TSHELL4: - switch (side_num) { - case 0: - case 1: + case ElementType::TSHELL3: + case ElementType::TSHELL4: + if (side_num == 0 || side_num == 1) { for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(tshell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tshell_table[side_num][i] - 1]; } - break; - - default: + } + else { /* * sides 3, 4 & 5 correspond to sides 1, 2 & 3 * of the tri element. */ for (i = 0; i < 2; i++) { - ss_node_list[i] = connect[(tri_table[(side_num - 2)][i] - 1)]; + ss_node_list[i] = connect[tri_table[(side_num - 2)][i] - 1]; } - break; } break; - case TSHELL6: - case TSHELL7: - switch (side_num) { - case 0: - case 1: + case ElementType::TSHELL6: + case ElementType::TSHELL7: + if (side_num == 0 || side_num == 1) { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(tshell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tshell_table[side_num][i] - 1]; } - break; - - default: + } + else { /* * sides 3, 4 & 5 correspond to sides 1, 2 & 3 * of the tri element. */ for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(tri_table[(side_num - 2)][i] - 1)]; + ss_node_list[i] = connect[tri_table[(side_num - 2)][i] - 1]; } - break; } break; - case HEX8: + case ElementType::HEX8: for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(hex_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hex_table[side_num][i] - 1]; } break; - case HEX16: - switch (side_num) { - case 4: - case 5: + case ElementType::HEX16: + if (side_num == 4 || side_num == 5) { for (i = 0; i < 8; i++) { - ss_node_list[i] = connect[(hex16_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hex16_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(hex16_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hex16_table[side_num][i] - 1]; } - break; } break; - case HEX20: + case ElementType::HEX20: for (i = 0; i < 8; i++) { - ss_node_list[i] = connect[(hex_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hex_table[side_num][i] - 1]; } break; - case HEX27: + case ElementType::HEX27: for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(hex_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hex_table[side_num][i] - 1]; } break; - case TET4: + case ElementType::TET4: for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(tetra_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tetra_table[side_num][i] - 1]; } break; - case TET10: + case ElementType::TET10: for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(tetra_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tetra_table[side_num][i] - 1]; } break; - case TET14: - case TET15: + case ElementType::TET14: + case ElementType::TET15: for (i = 0; i < 7; i++) { - ss_node_list[i] = connect[(tetra_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tetra_table[side_num][i] - 1]; } break; - case TET8: + case ElementType::TET8: for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(tetra_table[side_num][i] - 1)]; + ss_node_list[i] = connect[tetra_table[side_num][i] - 1]; } break; - case WEDGE6: - switch (side_num) { - case 3: - case 4: + case ElementType::WEDGE6: + if (side_num == 3 || side_num == 4) { for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(wedge6_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge6_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(wedge6_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge6_table[side_num][i] - 1]; } - break; } break; - case WEDGE12: + case ElementType::WEDGE12: for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(wedge12_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge12_table[side_num][i] - 1]; } break; - case WEDGE15: - case WEDGE16: - switch (side_num) { - case 3: - case 4: + case ElementType::WEDGE15: + case ElementType::WEDGE16: + if (side_num == 3 || side_num == 4) { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(wedge15_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge15_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 8; i++) { - ss_node_list[i] = connect[(wedge15_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge15_table[side_num][i] - 1]; } - break; } break; - case WEDGE20: - switch (side_num) { - case 3: - case 4: + case ElementType::WEDGE20: + if (side_num == 3 || side_num == 4) { for (i = 0; i < 7; i++) { - ss_node_list[i] = connect[(wedge20_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge20_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(wedge20_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge20_table[side_num][i] - 1]; } - break; } break; - case WEDGE21: - switch (side_num) { - case 3: - case 4: + case ElementType::WEDGE21: + if (side_num == 3 || side_num == 4) { for (i = 0; i < 7; i++) { - ss_node_list[i] = connect[(wedge21_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge21_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(wedge21_table[side_num][i] - 1)]; + ss_node_list[i] = connect[wedge21_table[side_num][i] - 1]; } - break; } break; - case HEXSHELL: - switch (side_num) { - case 4: - case 5: + case ElementType::HEXSHELL: + if (side_num == 4 || side_num == 5) { for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(hexshell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hexshell_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(hexshell_table[side_num][i] - 1)]; + ss_node_list[i] = connect[hexshell_table[side_num][i] - 1]; } - break; } break; - case PYRAMID5: - switch (side_num) { - case 4: + case ElementType::PYRAMID5: + if (side_num == 4) { for (i = 0; i < 4; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 3; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; } break; - case PYRAMID13: - switch (side_num) { - case 4: + case ElementType::PYRAMID13: + if (side_num == 4) { for (i = 0; i < 8; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; } break; - case PYRAMID14: - switch (side_num) { - case 4: + case ElementType::PYRAMID14: + if (side_num == 4) { for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 6; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; } break; - case PYRAMID18: - case PYRAMID19: /* Pyramid18 with mid-volume node */ - switch (side_num) { - case 4: + case ElementType::PYRAMID18: + case ElementType::PYRAMID19: /* Pyramid18 with mid-volume node */ + if (side_num == 4) { for (i = 0; i < 9; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; - - default: + } + else { for (i = 0; i < 7; i++) { - ss_node_list[i] = connect[(pyramid_table[side_num][i] - 1)]; + ss_node_list[i] = connect[pyramid_table[side_num][i] - 1]; } - break; } break; - case SPHERE: /* SHPERE's have no side sets */ - case NULL_EL: i = 0; break; + case ElementType::SPHERE: /* SHPERE's have no side sets */ + case ElementType::NULL_EL: i = 0; break; } /* End "switch (etype)" */ /* the variable "i" should be the number of positions that I filled */ - return (i); + return i; } /*-------------------------End ss_to_node_list()---------------------------*/ @@ -2070,16 +2039,16 @@ int ss_to_node_list(const E_Type etype, /* The element type */ * given. This will be the node list of a face that is connected * to this element on this face. *****************************************************************************/ -template int get_ss_mirror(const E_Type etype, const int *ss_node_list, int side_num, +template int get_ss_mirror(const ElementType etype, const int *ss_node_list, int side_num, int mirror_node_list[]); -template int get_ss_mirror(const E_Type etype, const int64_t *ss_node_list, int side_num, +template int get_ss_mirror(const ElementType etype, const int64_t *ss_node_list, int side_num, int64_t mirror_node_list[]); template -int get_ss_mirror(const E_Type etype, /* The element type */ - const INT *ss_node_list, /* The list of side node IDs */ - int side_num, /* The element side number */ - INT mirror_node_list[] /* The list of the mirror side node IDs */ +int get_ss_mirror(const ElementType etype, /* The element type */ + const INT *ss_node_list, /* The list of side node IDs */ + int side_num, /* The element side number */ + INT mirror_node_list[] /* The list of the mirror side node IDs */ ) { int i = 0; @@ -2105,32 +2074,39 @@ int get_ss_mirror(const E_Type etype, /* The element type */ /* Switch over the element type. */ switch (etype) { - case BAR2: - case SHELL2: + case ElementType::BAR1D2: + case ElementType::BAR1D3: + // Side is a single node... + mirror_node_list[0] = ss_node_list[0]; + i = 1; + break; + + case ElementType::BAR2: + case ElementType::SHELL2: for (i = 0; i < 2; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case BAR3: - case SHELL3: + case ElementType::BAR3: + case ElementType::SHELL3: for (i = 0; i < 3; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case QUAD4: + case ElementType::QUAD4: for (i = 0; i < 2; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case QUAD8: - case QUAD9: + case ElementType::QUAD8: + case ElementType::QUAD9: for (i = 0; i < 3; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case SHELL4: + case ElementType::SHELL4: switch (side_num) { case 1: case 2: @@ -2147,7 +2123,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case SHELL8: + case ElementType::SHELL8: switch (side_num) { case 1: case 2: @@ -2164,7 +2140,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case SHELL9: + case ElementType::SHELL9: switch (side_num) { case 1: case 2: @@ -2181,21 +2157,21 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case TRI3: - case TRI4: + case ElementType::TRI3: + case ElementType::TRI4: for (i = 0; i < 2; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case TRI6: - case TRI7: + case ElementType::TRI6: + case ElementType::TRI7: for (i = 0; i < 3; i++) { mirror_node_list[i] = ss_node_list[line_table[i]]; } break; - case TSHELL3: + case ElementType::TSHELL3: switch (side_num) { case 1: case 2: @@ -2212,7 +2188,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case TSHELL4: + case ElementType::TSHELL4: switch (side_num) { case 1: case 2: @@ -2229,7 +2205,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case TSHELL6: + case ElementType::TSHELL6: switch (side_num) { case 1: case 2: @@ -2246,7 +2222,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case TSHELL7: + case ElementType::TSHELL7: switch (side_num) { case 1: case 2: @@ -2263,13 +2239,13 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case HEX8: + case ElementType::HEX8: for (i = 0; i < 4; i++) { mirror_node_list[i] = ss_node_list[sqr_table[i]]; } break; - case HEX16: + case ElementType::HEX16: switch (side_num) { case 4: case 5: @@ -2285,44 +2261,44 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case HEX27: + case ElementType::HEX27: for (i = 0; i < 9; i++) { mirror_node_list[i] = ss_node_list[sqr_table[i]]; } break; - case HEX20: + case ElementType::HEX20: for (i = 0; i < 8; i++) { mirror_node_list[i] = ss_node_list[sqr_table[i]]; } break; - case TET4: + case ElementType::TET4: for (i = 0; i < 3; i++) { mirror_node_list[i] = ss_node_list[tri_table[i]]; } break; - case TET8: + case ElementType::TET8: for (i = 0; i < 4; i++) { mirror_node_list[i] = ss_node_list[tri_table[i]]; } break; - case TET10: + case ElementType::TET10: for (i = 0; i < 6; i++) { mirror_node_list[i] = ss_node_list[tri_table[i]]; } break; - case TET14: - case TET15: + case ElementType::TET14: + case ElementType::TET15: for (i = 0; i < 7; i++) { mirror_node_list[i] = ss_node_list[tri_table[i]]; } break; - case WEDGE6: + case ElementType::WEDGE6: switch (side_num) { case 4: case 5: @@ -2339,14 +2315,14 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case WEDGE12: + case ElementType::WEDGE12: for (i = 0; i < 6; i++) { mirror_node_list[i] = ss_node_list[tri_table[i]]; } break; - case WEDGE15: - case WEDGE16: + case ElementType::WEDGE15: + case ElementType::WEDGE16: switch (side_num) { case 4: case 5: @@ -2363,8 +2339,8 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case WEDGE20: - case WEDGE21: + case ElementType::WEDGE20: + case ElementType::WEDGE21: switch (side_num) { case 4: case 5: @@ -2381,7 +2357,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case HEXSHELL: + case ElementType::HEXSHELL: switch (side_num) { case 5: case 6: @@ -2398,7 +2374,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case PYRAMID5: + case ElementType::PYRAMID5: switch (side_num) { case 5: for (i = 0; i < 4; i++) { @@ -2414,7 +2390,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case PYRAMID13: + case ElementType::PYRAMID13: switch (side_num) { case 5: for (i = 0; i < 8; i++) { @@ -2430,7 +2406,7 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case PYRAMID14: + case ElementType::PYRAMID14: switch (side_num) { case 5: for (i = 0; i < 9; i++) { @@ -2446,8 +2422,8 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case PYRAMID18: - case PYRAMID19: + case ElementType::PYRAMID18: + case ElementType::PYRAMID19: switch (side_num) { case 5: for (i = 0; i < 9; i++) { @@ -2463,12 +2439,12 @@ int get_ss_mirror(const E_Type etype, /* The element type */ } break; - case SPHERE: /* SHPERE's have no side sets */ - case NULL_EL: i = 0; break; + case ElementType::SPHERE: /* SHPERE's have no side sets */ + case ElementType::NULL_EL: i = 0; break; } /* End "switch (etype)" */ /* the variable "i" should be the number of positions that I filled */ - return (i); + return i; } /*-------------------------Ed get_ss_mirror()---------------------------*/ diff --git a/packages/seacas/applications/nem_slice/elb_elem.h b/packages/seacas/applications/nem_slice/elb_elem.h index 5c7a5c5045e0..36f8b75b3be5 100644 --- a/packages/seacas/applications/nem_slice/elb_elem.h +++ b/packages/seacas/applications/nem_slice/elb_elem.h @@ -7,8 +7,11 @@ */ #pragma once +/* Define element info requests */ +enum class ElementInfo { NNODES = 0, NDIM = 2, NSIDE_NODES = 4, NSIDES = 5 }; + /* Define element types */ -enum E_Type { +enum class ElementType { SPHERE, BAR2, BAR3, @@ -49,61 +52,57 @@ enum E_Type { PYRAMID19, SHELL2, SHELL3, + BAR1D2, + BAR1D3, NULL_EL }; -extern const char *elem_name_from_enum(E_Type elem_type); +extern const char *elem_name_from_enum(ElementType elem_type); -extern E_Type get_elem_type(const char *elem_name, /* ExodusII element name */ - int num_nodes, /* Number of nodes in the element */ - int num_dim /* Number of dimensions of the mesh */ +extern ElementType get_elem_type(const char *elem_name, /* ExodusII element name */ + int num_nodes, /* Number of nodes in the element */ + int num_dim /* Number of dimensions of the mesh */ ); -extern int get_elem_info(int info, /* The requested information */ - E_Type elem_type /* The element type */ +extern int get_elem_info(ElementInfo info, /* The requested information */ + ElementType elem_type /* The element type */ ); template -int get_side_id(E_Type etype, const INT *connect, int nsnodes, INT side_nodes[], int skip_check, - int partial_adj); +int get_side_id(ElementType etype, const INT *connect, int nsnodes, INT side_nodes[], + int skip_check, int partial_adj); template -int get_side_id_hex_tet(E_Type etype, /* The element type */ - const INT *conn, /* The element connectivity */ - int nsnodes, /* The number of side nodes */ - const INT side_nodes[] /* The list of side node IDs */ +int get_side_id_hex_tet(ElementType etype, /* The element type */ + const INT *conn, /* The element connectivity */ + int nsnodes, /* The number of side nodes */ + const INT side_nodes[] /* The list of side node IDs */ ); template -int ss_to_node_list(E_Type etype, /* The element type */ - const INT *connect, /* The element connectivity */ - int side_num, /* The element side number */ - INT ss_node_list[] /* The list of side node IDs */ +int ss_to_node_list(ElementType etype, /* The element type */ + const INT *connect, /* The element connectivity */ + int side_num, /* The element side number */ + INT ss_node_list[] /* The list of side node IDs */ ); template -int get_ss_mirror(E_Type etype, /* The element type */ - const INT *ss_node_list, /* The list of side node IDs */ - int side_num, /* The element side number */ - INT mirror_node_list[] /* The list of the mirror side node IDs */ +int get_ss_mirror(ElementType etype, /* The element type */ + const INT *ss_node_list, /* The list of side node IDs */ + int side_num, /* The element side number */ + INT mirror_node_list[] /* The list of the mirror side node IDs */ ); -/* Define element info requests */ -#define NNODES 0 -#define NDIM 2 -#define NSIDE_NODES 4 -#define NSIDES 5 - /* Define for the maximum number of nodes on an element side/face */ -#define MAX_SIDE_NODES 9 +const int MAX_SIDE_NODES = 9; /* * Define for the maximum number of sides (and hence communications * entries) that an element can have */ -#define MAX_ELEM_SIDES 6 +const int MAX_ELEM_SIDES = 6; -int is_hex(E_Type etype); -int is_tet(E_Type etype); -int is_wedge(E_Type etype); -int is_pyramid(E_Type etype); -int is_3d_element(E_Type etype); +bool is_hex(ElementType etype); +bool is_tet(ElementType etype); +bool is_wedge(ElementType etype); +bool is_pyramid(ElementType etype); +bool is_3d_element(ElementType etype); diff --git a/packages/seacas/applications/nem_slice/elb_exo_util.C b/packages/seacas/applications/nem_slice/elb_exo_util.C index 817211d7cc5b..781d3d4abb60 100644 --- a/packages/seacas/applications/nem_slice/elb_exo_util.C +++ b/packages/seacas/applications/nem_slice/elb_exo_util.C @@ -20,7 +20,7 @@ #include #include "elb.h" // for Weight_Description, etc -#include "elb_elem.h" // for get_elem_type, E_Type, etc +#include "elb_elem.h" // for get_elem_type, ElementType, etc #include "elb_err.h" // for Gen_Error, MAX_ERR_MSG #include "elb_exo.h" #include "elb_groups.h" // for parse_groups @@ -56,7 +56,7 @@ int read_exo_weights(Problem_Description *prob, Weight_Description *weight, INT } std::vector values(weight->nvals); - if (prob->type == NODAL) { + if (prob->type == DecompType::NODAL) { size_t tmp_nodes = ex_inquire_int(exoid, EX_INQ_NODES); /* check to make sure the sizes agree */ if ((size_t)weight->nvals != tmp_nodes) { @@ -233,7 +233,7 @@ int read_mesh_params(const std::string &exo_file, Problem_Description *problem, sphere->end[0] = mesh->eb_cnts[cnt]; } - if (mesh->eb_type[cnt] == SPHERE && problem->no_sph != 1) { + if (mesh->eb_type[cnt] == ElementType::SPHERE && problem->no_sph != 1) { sphere->num += mesh->eb_cnts[cnt]; sphere->adjust[cnt] = 0; } @@ -246,7 +246,7 @@ int read_mesh_params(const std::string &exo_file, Problem_Description *problem, sphere->end[cnt] = sphere->begin[cnt] + mesh->eb_cnts[cnt]; } - mesh->max_np_elem = MAX(mesh->max_np_elem, (size_t)nodes_in_elem); + mesh->max_np_elem = std::max(mesh->max_np_elem, (size_t)nodes_in_elem); } /* Close the ExodusII file */ @@ -336,19 +336,19 @@ int read_mesh(const std::string &exo_file, Problem_Description *problem, /* find out if this element block is weighted */ int wgt = -1; - if (weight->type & EL_BLK) { + if (weight->type & WeightingOptions::EL_BLK) { wgt = in_list(mesh->eb_ids[cnt], weight->elemblk); } /* Fill the 2D global connectivity array */ - if (((problem->type == ELEMENTAL) && (weight->type & EL_BLK)) || - ((problem->type == NODAL) && (weight->type & EL_BLK))) { + if (((problem->type == DecompType::ELEMENTAL) && (weight->type & WeightingOptions::EL_BLK)) || + ((problem->type == DecompType::NODAL) && (weight->type & WeightingOptions::EL_BLK))) { for (int64_t cnt2 = 0; cnt2 < mesh->eb_cnts[cnt]; cnt2++) { mesh->elem_type[gelem_cnt] = mesh->eb_type[cnt]; /* while going through the blocks, take care of the weighting */ - if ((problem->type == ELEMENTAL) && (weight->type & EL_BLK)) { + if ((problem->type == DecompType::ELEMENTAL) && (weight->type & WeightingOptions::EL_BLK)) { /* is this block weighted */ if (wgt >= 0) { /* check if there is a read value */ @@ -376,7 +376,7 @@ int read_mesh(const std::string &exo_file, Problem_Description *problem, mesh->connect[gelem_cnt][cnt3] = node; /* deal with the weighting if necessary */ - if ((problem->type == NODAL) && (weight->type & EL_BLK)) { + if ((problem->type == DecompType::NODAL) && (weight->type & EL_BLK)) { /* is this block weighted */ if (wgt >= 0) { /* check if I read an exodus file */ @@ -385,7 +385,8 @@ int read_mesh(const std::string &exo_file, Problem_Description *problem, if (weight->ow_read) { /* check if it has been overwritten already */ if (weight->ow[node]) { - weight->vertices[node] = MAX(weight->vertices[node], weight->elemblk_wgt[wgt]); + weight->vertices[node] = + std::max(weight->vertices[node], weight->elemblk_wgt[wgt]); } else { weight->vertices[node] = weight->elemblk_wgt[wgt]; @@ -394,7 +395,7 @@ int read_mesh(const std::string &exo_file, Problem_Description *problem, } } else { - weight->vertices[node] = MAX(weight->vertices[node], weight->elemblk_wgt[wgt]); + weight->vertices[node] = std::max(weight->vertices[node], weight->elemblk_wgt[wgt]); } } else { @@ -460,7 +461,7 @@ template int init_weight_struct(Problem_Description *problem, Mesh_Description *mesh, Weight_Description *weight) { - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { weight->nvals = mesh->num_nodes; } else { diff --git a/packages/seacas/applications/nem_slice/elb_graph.C b/packages/seacas/applications/nem_slice/elb_graph.C index 3adb1e20b390..147beebf6c46 100644 --- a/packages/seacas/applications/nem_slice/elb_graph.C +++ b/packages/seacas/applications/nem_slice/elb_graph.C @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -97,7 +97,7 @@ namespace { // The hope is that this code will speed up the entire routine even // though we are iterating the complete connectivity array twice. for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - int nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[ecnt]); for (int ncnt = 0; ncnt < nnodes; ncnt++) { INT node = mesh->connect[ecnt][ncnt]; assert(node < (INT)mesh->num_nodes); @@ -145,7 +145,7 @@ namespace { /* Find the surrounding elements for each node in the mesh */ for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - int nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[ecnt]); for (int ncnt = 0; ncnt < nnodes; ncnt++) { INT node = mesh->connect[ecnt][ncnt]; @@ -203,14 +203,14 @@ namespace { } /* Find the adjacency for a nodal based decomposition */ - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { graph->nadj = 0; for (size_t ncnt = 0; ncnt < mesh->num_nodes; ncnt++) { graph->start[ncnt] = graph->nadj; assert(graph->nadj == graph->adj.size()); for (size_t ecnt = 0; ecnt < graph->sur_elem[ncnt].size(); ecnt++) { size_t elem = graph->sur_elem[ncnt][ecnt]; - int nnodes = get_elem_info(NNODES, mesh->elem_type[elem]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[elem]); for (int i = 0; i < nnodes; i++) { INT entry = mesh->connect[elem][i]; @@ -245,18 +245,18 @@ namespace { int nsides = 0; for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - E_Type etype = mesh->elem_type[ecnt]; - E_Type etype_last = NULL_EL; + ElementType etype = mesh->elem_type[ecnt]; + ElementType etype_last = ElementType::NULL_EL; if (etype != etype_last) { etype_last = etype; element_3d = is_3d_element(mesh->elem_type[ecnt]); if (problem->face_adj == 0) { - nnodes = get_elem_info(NNODES, etype); + nnodes = get_elem_info(ElementInfo::NNODES, etype); } - nsides = get_elem_info(NSIDES, etype); + nsides = get_elem_info(ElementInfo::NSIDES, etype); } - if (etype != SPHERE || problem->no_sph == 1) { + if (etype != ElementType::SPHERE || problem->no_sph == 1) { graph->start[cnt] = graph->nadj; assert(graph->nadj == graph->adj.size()); @@ -287,7 +287,7 @@ namespace { /* make sure we're not checking if the element is connected to itself */ - if (ecnt != (size_t)entry && mesh->elem_type[entry] != SPHERE) { + if (ecnt != (size_t)entry && mesh->elem_type[entry] != ElementType::SPHERE) { /* If tmp_element[entry] != ecnt, then entry is not in list... */ if ((size_t)tmp_element[entry] != ecnt) { #if 0 @@ -297,11 +297,11 @@ namespace { tmp_element[entry] = ecnt; (graph->nadj)++; graph->adj.push_back(entry); - if (weight->type & EDGE_WGT) { + if (weight->type & WeightingOptions::EDGE_WGT) { weight->edges.push_back(1.0); } } - else if (weight->type & EDGE_WGT) { + else if (weight->type & WeightingOptions::EDGE_WGT) { int iret = in_list(entry, (graph->nadj) - (graph->start[cnt]), &graph->adj[graph->start[cnt]]); assert(iret >= 0); @@ -480,7 +480,7 @@ namespace { * is connected to only an edge of a quad/tet */ - E_Type etype2 = mesh->elem_type[entry]; + ElementType etype2 = mesh->elem_type[entry]; /* make sure this is a 3d element*/ @@ -526,7 +526,7 @@ namespace { /* if this element 1 is a hexshell, then only require 4 of the 6 nodes to match between elements 1 and 2 */ - if (etype == HEXSHELL && side_cnt == 6) { + if (etype == ElementType::HEXSHELL && side_cnt == 6) { side_cnt = 4; } @@ -554,7 +554,7 @@ namespace { if (sid > 0) { (graph->nadj)++; graph->adj.push_back(entry); - if (weight->type & EDGE_WGT) { + if (weight->type & WeightingOptions::EDGE_WGT) { /* * the edge weight is the number of nodes in the * connecting face @@ -581,7 +581,7 @@ namespace { Gen_Error(0, cmesg); cmesg = fmt::format("Element 1: {}", (ecnt + 1)); Gen_Error(0, cmesg); - nnodes = get_elem_info(NNODES, etype); + nnodes = get_elem_info(ElementInfo::NNODES, etype); cmesg = "connect table:"; for (int ii = 0; ii < nnodes; ii++) { tmpstr = fmt::format(" {}", (size_t)(mesh->connect[ecnt][ii] + 1)); @@ -598,7 +598,7 @@ namespace { Gen_Error(0, cmesg); cmesg = fmt::format("Element 2: {}", (entry + 1)); Gen_Error(0, cmesg); - nnodes = get_elem_info(NNODES, etype2); + nnodes = get_elem_info(ElementInfo::NNODES, etype2); cmesg = "connect table:"; for (int ii = 0; ii < nnodes; ii++) { tmpstr = fmt::format(" {}", (size_t)(mesh->connect[entry][ii] + 1)); @@ -621,7 +621,7 @@ namespace { * 1d or 2d elements */ - nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); + nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[ecnt]); for (int ncnt = 0; ncnt < nnodes; ncnt++) { /* node is the node number 'ncnt' of element 'ecnt' */ @@ -646,11 +646,11 @@ namespace { (graph->nadj)++; graph->adj.push_back(entry); - if (weight->type & EDGE_WGT) { + if (weight->type & WeightingOptions::EDGE_WGT) { weight->edges.push_back(1.0); } } - else if (weight->type & EDGE_WGT) { + else if (weight->type & WeightingOptions::EDGE_WGT) { weight->edges[iret + (graph->start[cnt])] += 1.0F; } } @@ -680,7 +680,7 @@ namespace { } /* Adjust for a mesh with spheres */ - if (problem->type == ELEMENTAL && sphere->num) { + if (problem->type == DecompType::ELEMENTAL && sphere->num) { /* Decrement adjacency entries */ for (auto &elem : graph->adj) { for (size_t ecnt = 0; ecnt < mesh->num_el_blks; ecnt++) { diff --git a/packages/seacas/applications/nem_slice/elb_groups.C b/packages/seacas/applications/nem_slice/elb_groups.C index 049508493f12..ba51612b4e9b 100644 --- a/packages/seacas/applications/nem_slice/elb_groups.C +++ b/packages/seacas/applications/nem_slice/elb_groups.C @@ -197,10 +197,10 @@ int get_group_info(Machine_Description *machine, Problem_Description *prob, * calculate how many processors to use for each group * using method from the materials group, haven't really checked it */ - if (machine->type == MESH) { + if (machine->type == MachineType::MESH) { nproc = machine->procs_per_box; } - else if (machine->type == HCUBE) { + else if (machine->type == MachineType::HCUBE) { nproc = ilog2i(machine->procs_per_box); } for (int i = 0; i < prob->num_groups; i++) { diff --git a/packages/seacas/applications/nem_slice/elb_inp.C b/packages/seacas/applications/nem_slice/elb_inp.C index ea0de2ea78f9..68ac7c5b7b19 100644 --- a/packages/seacas/applications/nem_slice/elb_inp.C +++ b/packages/seacas/applications/nem_slice/elb_inp.C @@ -94,14 +94,14 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by const char *weight_subopts[] = {"none", "read", "eb", "var_index", "edges", "time_index", "var_name", nullptr}; - const char *mach_subopts[] = {"mesh", "hcube", "hypercube", "cluster", nullptr}; + const char *mach_subopts[] = {"invalid", "mesh", "hcube", "hypercube", "cluster", nullptr}; - const char *lb_subopts[] = {"multikl", "spectral", "inertial", "linear", "random", - "scattered", "infile", "kl", "none", "num_sects", - "cnctd_dom", "outfile", "zpinch", "brick", "rcb", - "rib", "hsfc", "ignore_z", nullptr}; + const char *lb_subopts[] = {"invalid", "multikl", "spectral", "inertial", "linear", + "random", "scattered", "infile", "kl", "none", + "num_sects", "cnctd_dom", "outfile", "zpinch", "brick", + "rcb", "rib", "hsfc", "ignore_z", nullptr}; - const char *solve_subopts[] = {"tolerance", "use_rqi", "vmax", nullptr}; + const char *solve_subopts[] = {"invalid", "tolerance", "use_rqi", "vmax", nullptr}; /*---------------------------Execution Begins--------------------------------*/ @@ -325,20 +325,20 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by case 'n': /* Nodal decomposition */ - if (prob->type == ELEMENTAL) { + if (prob->type == DecompType::ELEMENTAL) { Gen_Error(0, "FATAL: -e and -n are mutually exclusive"); return 0; } - prob->type = NODAL; + prob->type = DecompType::NODAL; break; case 'e': /* Elemental decomposition */ - if (prob->type == NODAL) { + if (prob->type == DecompType::NODAL) { Gen_Error(0, "FATAL: -e and -n are mutually exclusive\n"); return 0; } - prob->type = ELEMENTAL; + prob->type = DecompType::ELEMENTAL; break; case 'm': @@ -350,26 +350,26 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by while (sub_opt != nullptr && *sub_opt != '\0') { /* Switch over the machine description */ - switch (my_getsubopt(&sub_opt, (char *const *)mach_subopts, &value)) { - case HCUBE: - case HYPERCUBE: - if (machine->type < 0) { - machine->type = HCUBE; + switch ((MachineType)my_getsubopt(&sub_opt, (char *const *)mach_subopts, &value)) { + case MachineType::HCUBE: + case MachineType::HYPERCUBE: + if (machine->type == MachineType::INVALID) { + machine->type = MachineType::HCUBE; max_dim = 1; } FALL_THROUGH; - case MESH: - if (machine->type < 0) { - machine->type = MESH; + case MachineType::MESH: + if (machine->type == MachineType::INVALID) { + machine->type = MachineType::MESH; max_dim = 3; } cptr = value; /* want to set this for both mesh and hcube */ FALL_THROUGH; - case CLUSTER: - if (machine->type < 0) /* so, get the number of boxes */ + case MachineType::CLUSTER: + if (machine->type == MachineType::INVALID) /* so, get the number of boxes */ { if (value == nullptr || strlen(value) == 0) { Gen_Error(0, "FATAL: need to specify number of boxes"); @@ -379,11 +379,11 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by /* now need to find what each box consists of */ cptr = strpbrk(value, "mMhH"); if (*cptr == 'm' || *cptr == 'M') { - machine->type = MESH; + machine->type = MachineType::MESH; max_dim = 3; } else if (*cptr == 'h' || *cptr == 'H') { - machine->type = HCUBE; + machine->type = MachineType::HCUBE; max_dim = 1; } else { @@ -448,30 +448,30 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by string_to_lower(sub_opt, '\0'); } while (sub_opt != nullptr && *sub_opt != '\0') { - switch (my_getsubopt(&sub_opt, (char *const *)lb_subopts, &value)) { - case MULTIKL: lb->type = MULTIKL; break; + switch ((Balance)my_getsubopt(&sub_opt, (char *const *)lb_subopts, &value)) { + case Balance::MULTIKL: lb->type = Balance::MULTIKL; break; - case SPECTRAL: lb->type = SPECTRAL; break; + case Balance::SPECTRAL: lb->type = Balance::SPECTRAL; break; - case INERTIAL: lb->type = INERTIAL; break; + case Balance::INERTIAL: lb->type = Balance::INERTIAL; break; - case ZPINCH: lb->type = ZPINCH; break; + case Balance::ZPINCH: lb->type = Balance::ZPINCH; break; - case BRICK: lb->type = BRICK; break; + case Balance::BRICK: lb->type = Balance::BRICK; break; - case ZOLTAN_RCB: lb->type = ZOLTAN_RCB; break; + case Balance::ZOLTAN_RCB: lb->type = Balance::ZOLTAN_RCB; break; - case ZOLTAN_RIB: lb->type = ZOLTAN_RIB; break; + case Balance::ZOLTAN_RIB: lb->type = Balance::ZOLTAN_RIB; break; - case ZOLTAN_HSFC: lb->type = ZOLTAN_HSFC; break; + case Balance::ZOLTAN_HSFC: lb->type = Balance::ZOLTAN_HSFC; break; - case LINEAR: lb->type = LINEAR; break; + case Balance::LINEAR: lb->type = Balance::LINEAR; break; - case RANDOM: lb->type = RANDOM; break; + case Balance::RANDOM: lb->type = Balance::RANDOM; break; - case SCATTERED: lb->type = SCATTERED; break; + case Balance::SCATTERED: lb->type = Balance::SCATTERED; break; - case INFILE: + case Balance::INFILE: if (value == nullptr) { Gen_Error(0, "FATAL: need to specify a value with file"); return 0; @@ -483,14 +483,14 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by Gen_Error(0, "FATAL: invalid value associated with file"); return 0; } - lb->type = INFILE; + lb->type = Balance::INFILE; break; - case KL_REFINE: lb->refine = KL_REFINE; break; + case Balance::KL_REFINE: lb->refine = Balance::KL_REFINE; break; - case NO_REFINE: lb->refine = NO_REFINE; break; + case Balance::NO_REFINE: lb->refine = Balance::NO_REFINE; break; - case NUM_SECTS: + case Balance::NUM_SECTS: if (value == nullptr) { Gen_Error(0, "FATAL: need to specify a value with num_sects"); return 0; @@ -502,11 +502,11 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by } break; - case CNCT_DOM: lb->cnctd_dom = 1; break; + case Balance::CNCT_DOM: lb->cnctd_dom = 1; break; - case IGNORE_Z: lb->ignore_z = 1; break; + case Balance::IGNORE_Z: lb->ignore_z = 1; break; - case OUTFILE: + case Balance::OUTFILE: if (value == nullptr) { Gen_Error(0, "FATAL: need to specify a value with outfile"); return 0; @@ -539,8 +539,8 @@ int cmd_line_arg_parse(int argc, char *argv[], /* Args as passed by string_to_lower(sub_opt, '\0'); } while (sub_opt != nullptr && *sub_opt != '\0') { - switch (my_getsubopt(&sub_opt, (char *const *)solve_subopts, &value)) { - case TOLER: + switch ((SolverOptions)my_getsubopt(&sub_opt, (char *const *)solve_subopts, &value)) { + case SolverOptions::TOLER: if (value == nullptr) { fmt::print(stderr, "FATAL: tolerance specification requires \ value\n"); @@ -554,24 +554,26 @@ value\n"); break; - case USE_RQI: - if (solver->rqi_flag == USE_RQI) { - solver->rqi_flag = -1; + case SolverOptions::USE_RQI: + if (solver->rqi_flag == SolverOptions::USE_RQI) { + solver->rqi_flag = SolverOptions::INVALID; } else { - solver->rqi_flag = USE_RQI; + solver->rqi_flag = SolverOptions::USE_RQI; } break; - case VMAX: + case SolverOptions::VMAX: if (value == nullptr) { - fmt::print(stderr, "FATAL: must specify a value with {}\n", solve_subopts[VMAX]); + fmt::print(stderr, "FATAL: must specify a value with {}\n", + solve_subopts[(int)SolverOptions::VMAX]); return 0; } iret = sscanf(value, "%d", &(solver->vmax)); if (iret != 1) { - fmt::print(stderr, "FATAL: invalid value read for {}\n", solve_subopts[VMAX]); + fmt::print(stderr, "FATAL: invalid value read for {}\n", + solve_subopts[(int)SolverOptions::VMAX]); return 0; } @@ -715,7 +717,7 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, } else if (token_compare(cptr, "decomposition method")) { /* The method to use for decomposing the graph */ - if (lb->type < 0 || lb->refine < 0 || lb->num_sects < 0) { + if (lb->type == Balance::INVALID || lb->refine == Balance::INVALID || lb->num_sects < 0) { /* Search to the first null character */ cptr = strchr(cptr, '\0'); @@ -726,63 +728,63 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, strip_string(cptr, " \t\n"); string_to_lower(cptr, '\0'); if (strcmp(cptr, "multikl") == 0) { - if (lb->type < 0) { - lb->type = MULTIKL; + if (lb->type == Balance::INVALID) { + lb->type = Balance::MULTIKL; } } else if (strcmp(cptr, "spectral") == 0) { - if (lb->type < 0) { - lb->type = SPECTRAL; + if (lb->type == Balance::INVALID) { + lb->type = Balance::SPECTRAL; } } else if (strcmp(cptr, "scattered") == 0) { - if (lb->type < 0) { - lb->type = SCATTERED; + if (lb->type == Balance::INVALID) { + lb->type = Balance::SCATTERED; } } else if (strcmp(cptr, "linear") == 0) { - if (lb->type < 0) { - lb->type = LINEAR; + if (lb->type == Balance::INVALID) { + lb->type = Balance::LINEAR; } } else if (strcmp(cptr, "inertial") == 0) { - if (lb->type < 0) { - lb->type = INERTIAL; + if (lb->type == Balance::INVALID) { + lb->type = Balance::INERTIAL; } } else if (strcmp(cptr, "zpinch") == 0) { - if (lb->type < 0) { - lb->type = ZPINCH; + if (lb->type == Balance::INVALID) { + lb->type = Balance::ZPINCH; } } else if (strcmp(cptr, "brick") == 0) { - if (lb->type < 0) { - lb->type = BRICK; + if (lb->type == Balance::INVALID) { + lb->type = Balance::BRICK; } } else if (strcmp(cptr, "rcb") == 0) { - if (lb->type < 0) { - lb->type = ZOLTAN_RCB; + if (lb->type == Balance::INVALID) { + lb->type = Balance::ZOLTAN_RCB; } } else if (strcmp(cptr, "rib") == 0) { - if (lb->type < 0) { - lb->type = ZOLTAN_RIB; + if (lb->type == Balance::INVALID) { + lb->type = Balance::ZOLTAN_RIB; } } else if (strcmp(cptr, "hsfc") == 0) { - if (lb->type < 0) { - lb->type = ZOLTAN_HSFC; + if (lb->type == Balance::INVALID) { + lb->type = Balance::ZOLTAN_HSFC; } } else if (strcmp(cptr, "random") == 0) { - if (lb->type < 0) { - lb->type = RANDOM; + if (lb->type == Balance::INVALID) { + lb->type = Balance::RANDOM; } } else if (strstr(cptr, "infile")) { - if (lb->type < 0) { - lb->type = INFILE; + if (lb->type == Balance::INVALID) { + lb->type = Balance::INFILE; cptr2 = strchr(cptr, '='); if (cptr2 == nullptr) { Gen_Error(0, "FATAL: need to specify a value with infile"); @@ -799,14 +801,12 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, } } else if (strcmp(cptr, "kl") == 0) { - if (lb->refine < 0) { - lb->refine = KL_REFINE; + if (lb->refine == Balance::INVALID) { + lb->refine = Balance::KL_REFINE; } } else if (strcmp(cptr, "none") == 0) { - if (lb->refine < 0) { - lb->refine = NS_NONE; - } + ; // Do nothing. } else if (strcmp(cptr, "ignore_z") == 0) { lb->ignore_z = 1; @@ -892,11 +892,11 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, } } else if (strcmp(cptr, "use_rqi") == 0) { - if (solver->rqi_flag == USE_RQI) { - solver->rqi_flag = -1; + if (solver->rqi_flag == SolverOptions::USE_RQI) { + solver->rqi_flag = SolverOptions::INVALID; } else { - solver->rqi_flag = USE_RQI; + solver->rqi_flag = SolverOptions::USE_RQI; } } else if (strstr(cptr, "vmax")) { @@ -924,26 +924,24 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, } } else if (token_compare(cptr, "graph type")) { - if (problem->type < 0) { - cptr = strtok(nullptr, "\t="); - strip_string(cptr, " \t\n"); - string_to_lower(cptr, '\0'); - if (strcmp(cptr, "nodal") == 0) { - problem->type = NODAL; - } - else if (strcmp(cptr, "node") == 0) { - problem->type = NODAL; - } - else if (strcmp(cptr, "elemental") == 0) { - problem->type = ELEMENTAL; - } - else if (strcmp(cptr, "element") == 0) { - problem->type = ELEMENTAL; - } - else { - Gen_Error(0, "FATAL: unknown graph type specified"); - return 0; - } + cptr = strtok(nullptr, "\t="); + strip_string(cptr, " \t\n"); + string_to_lower(cptr, '\0'); + if (strcmp(cptr, "nodal") == 0) { + problem->type = DecompType::NODAL; + } + else if (strcmp(cptr, "node") == 0) { + problem->type = DecompType::NODAL; + } + else if (strcmp(cptr, "elemental") == 0) { + problem->type = DecompType::ELEMENTAL; + } + else if (strcmp(cptr, "element") == 0) { + problem->type = DecompType::ELEMENTAL; + } + else { + Gen_Error(0, "FATAL: unknown graph type specified"); + return 0; } } else if (token_compare(cptr, "machine description")) { @@ -966,11 +964,11 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, /* Find out the machine type */ strip_string(cptr, " \t\n"); if (strcasecmp(cptr, "mesh") == 0) { - machine->type = MESH; + machine->type = MachineType::MESH; max_dim = 3; } else if (strcasecmp(cptr, "hcube") == 0 || strcasecmp(cptr, "hypercube") == 0) { - machine->type = HCUBE; + machine->type = MachineType::HCUBE; max_dim = 1; } else if (strcasecmp(cptr, "cluster") == 0) { @@ -978,11 +976,11 @@ int read_cmd_file(std::string &ascii_inp_file, std::string &exoII_inp_file, cptr = cptr2 + 1; cptr2 = strpbrk(cptr, "mMhH"); if (*cptr2 == 'm' || *cptr2 == 'M') { - machine->type = MESH; + machine->type = MachineType::MESH; max_dim = 3; } else if (*cptr2 == 'h' || *cptr2 == 'H') { - machine->type = HCUBE; + machine->type = MachineType::HCUBE; max_dim = 1; } else { @@ -1339,16 +1337,16 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Check the machine specification */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - if (machine->type != MESH && machine->type != HCUBE) { + if (machine->type != MachineType::MESH && machine->type != MachineType::HCUBE) { Gen_Error(0, "FATAL: machine type not properly set"); return 0; } - if (machine->type == HCUBE && machine->num_dims != 1) { + if (machine->type == MachineType::HCUBE && machine->num_dims != 1) { Gen_Error(0, "FATAL: improper number of dimension for a hypercube, only" " 1 allowed"); return 0; } - if (machine->type == MESH && machine->num_dims > 3) { + if (machine->type == MachineType::MESH && machine->num_dims > 3) { Gen_Error(0, "FATAL: maximum of 3 dimensions for a mesh exceeded"); return 0; } @@ -1359,7 +1357,7 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, } /* Find out the number of processors */ - if (machine->type == HCUBE) { + if (machine->type == MachineType::HCUBE) { machine->procs_per_box = 1 << machine->dim[0]; } else { @@ -1384,7 +1382,7 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Check the problem specifications */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - if (prob->type != ELEMENTAL && prob->type != NODAL) { + if (prob->type != DecompType::ELEMENTAL && prob->type != DecompType::NODAL) { Gen_Error(0, "FATAL: unknown problem type specified"); return 0; } @@ -1401,7 +1399,7 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, * using face definition of adjacencies only makes sense * with an elemental decomposition */ - if (prob->type != ELEMENTAL && prob->face_adj) { + if (prob->type != DecompType::ELEMENTAL && prob->face_adj) { Gen_Error(1, "WARNING: can only use face definition of"); Gen_Error(1, "WARNING: adjacency with elemental decomposition"); Gen_Error(1, "WARNING: face definition turned off"); @@ -1412,7 +1410,7 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, * Detecting columns and fixing their partitioning only makes sense * with an elemental decomposition */ - if (prob->type != ELEMENTAL && prob->fix_columns) { + if (prob->type != DecompType::ELEMENTAL && prob->fix_columns) { Gen_Error(1, "WARNING: can only use fix columns options"); Gen_Error(1, "WARNING: with elemental decomposition"); Gen_Error(1, "WARNING: fix columns option turned off"); @@ -1422,27 +1420,29 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Check the load balance parameters */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - if (lb->type != MULTIKL && lb->type != SPECTRAL && lb->type != INERTIAL && lb->type != LINEAR && - lb->type != RANDOM && lb->type != SCATTERED && lb->type != INFILE && lb->type != ZPINCH && - lb->type != BRICK && lb->type != ZOLTAN_RCB && lb->type != ZOLTAN_RIB && - lb->type != ZOLTAN_HSFC) { + if (lb->type != Balance::MULTIKL && lb->type != Balance::SPECTRAL && + lb->type != Balance::INERTIAL && lb->type != Balance::LINEAR && lb->type != Balance::RANDOM && + lb->type != Balance::SCATTERED && lb->type != Balance::INFILE && + lb->type != Balance::ZPINCH && lb->type != Balance::BRICK && + lb->type != Balance::ZOLTAN_RCB && lb->type != Balance::ZOLTAN_RIB && + lb->type != Balance::ZOLTAN_HSFC) { Gen_Error(0, "FATAL: unknown load balance type requested"); return 0; } - if ((sizeof(INT) == 8) && (lb->type != LINEAR && lb->type != SCATTERED)) { + if ((sizeof(INT) == 8) && (lb->type != Balance::LINEAR && lb->type != Balance::SCATTERED)) { Gen_Error(1, "WARNING: This mesh is using 64-bit integers. The only supported"); Gen_Error(1, " load balance methods for 64-bit integers are 'linear' or 'scattered'"); Gen_Error(1, " The load balance method will be automatically changed to 'linear'."); - lb->type = LINEAR; + lb->type = Balance::LINEAR; } - if (lb->type == MULTIKL) { - lb->refine = KL_REFINE; + if (lb->type == Balance::MULTIKL) { + lb->refine = Balance::KL_REFINE; } - if (lb->refine != KL_REFINE && lb->refine != NO_REFINE) { - lb->refine = NO_REFINE; /* Default if not specified */ + if (lb->refine != Balance::KL_REFINE && lb->refine != Balance::NO_REFINE) { + lb->refine = Balance::NO_REFINE; /* Default if not specified */ } if (lb->num_sects <= 0) { @@ -1463,13 +1463,13 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, lb->outfile = ELB_FALSE; } - if (lb->type == INFILE) { + if (lb->type == Balance::INFILE) { if (lb->outfile) { Gen_Error(0, "FATAL: both infile and outfile cannot be specified"); return 0; } - if (lb->refine != NO_REFINE) { + if (lb->refine != Balance::NO_REFINE) { Gen_Error(1, "WARNING: no refinement can be specified with infile"); return 0; } @@ -1478,17 +1478,13 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Check the eigensolver parameters */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - if (lb->type == SPECTRAL || lb->type == MULTIKL) { + if (lb->type == Balance::SPECTRAL || lb->type == Balance::MULTIKL) { if (solver->tolerance < 0.0) { Gen_Error(1, "WARNING: using default value for eigensolver" " tolerance"); solver->tolerance = 1.0e-3; } - if (solver->rqi_flag < 0) { - solver->rqi_flag = 0; - } - if (solver->vmax < 0) { Gen_Error(1, "WARNING: no value for vmax specified," " using default"); @@ -1506,14 +1502,15 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, */ std::string ctemp2; switch (machine->type) { - case MESH: ctemp2 = fmt::format("-m{}-", machine->num_procs); break; + case MachineType::MESH: ctemp2 = fmt::format("-m{}-", machine->num_procs); break; - case HCUBE: ctemp2 = fmt::format("-h{}-", machine->num_procs); break; + case MachineType::HCUBE: ctemp2 = fmt::format("-h{}-", machine->num_procs); break; + default:; // do nothing } switch (lb->type) { - case MULTIKL: - case SPECTRAL: + case Balance::MULTIKL: + case Balance::SPECTRAL: if (lb->num_sects == 1) { ctemp2 += "b"; } @@ -1526,24 +1523,25 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, break; - case INERTIAL: ctemp2 += "i"; break; + case Balance::INERTIAL: ctemp2 += "i"; break; - case ZPINCH: ctemp2 += "z"; break; + case Balance::ZPINCH: ctemp2 += "z"; break; - case BRICK: ctemp2 += "x"; break; + case Balance::BRICK: ctemp2 += "x"; break; - case ZOLTAN_RCB: - case ZOLTAN_RIB: - case ZOLTAN_HSFC: ctemp2 += "Z"; break; + case Balance::ZOLTAN_RCB: + case Balance::ZOLTAN_RIB: + case Balance::ZOLTAN_HSFC: ctemp2 += "Z"; break; - case SCATTERED: ctemp2 += "s"; break; + case Balance::SCATTERED: ctemp2 += "s"; break; - case RANDOM: ctemp2 += "r"; break; + case Balance::RANDOM: ctemp2 += "r"; break; - case LINEAR: ctemp2 += "l"; break; + case Balance::LINEAR: ctemp2 += "l"; break; + default:; // do nothing } - if (lb->refine == KL_REFINE) { + if (lb->refine == Balance::KL_REFINE) { ctemp2 += "KL"; } @@ -1595,7 +1593,7 @@ int check_inp_specs(std::string &exoII_inp_file, std::string &nemI_out_file, } ex_entity_type type; - if (prob->type == NODAL) { + if (prob->type == DecompType::NODAL) { type = EX_NODAL; } else { diff --git a/packages/seacas/applications/nem_slice/elb_loadbal.C b/packages/seacas/applications/nem_slice/elb_loadbal.C index f716bccf9f93..1cf42f6eebc4 100644 --- a/packages/seacas/applications/nem_slice/elb_loadbal.C +++ b/packages/seacas/applications/nem_slice/elb_loadbal.C @@ -25,7 +25,7 @@ #include "chaco.h" // for input_assign, interface #include "elb.h" // for LB_Description, etc -#include "elb_elem.h" // for E_Type, get_elem_info, etc +#include "elb_elem.h" // for ElementType, get_elem_info, etc #include "elb_err.h" // for Gen_Error #include "elb_graph.h" // for generate_graph #include "elb_groups.h" // for get_group_info @@ -89,7 +89,7 @@ namespace { template int identify_mechanisms(Machine_Description *machine, Problem_Description *problem, Mesh_Description *mesh, LB_Description *lb, - Graph_Description *graph, int check_type); + Graph_Description *graph, Issues check_type); int extract_connected_lists(int nrow, const int *columns, const int *rows, int *list, std::vector &list_ptr); @@ -180,9 +180,10 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, working on the loadbalance */ - if (problem->type == ELEMENTAL && problem->global_mech == 1 && problem->alloc_graph == ELB_TRUE) { + if (problem->type == DecompType::ELEMENTAL && problem->global_mech == 1 && + problem->alloc_graph == ELB_TRUE) { fmt::print("\n==============Looking For Global Issues=================\n"); - identify_mechanisms(machine, problem, mesh, lb, graph, GLOBAL_ISSUES); + identify_mechanisms(machine, problem, mesh, lb, graph, Issues::GLOBAL_ISSUES); fmt::print("============================================================\n"); fmt::print("\n"); } @@ -198,10 +199,11 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, } } - if (((problem->type == NODAL) && (lb->type == INERTIAL)) || - ((problem->type == ELEMENTAL) && - (lb->type == INERTIAL || lb->type == ZPINCH || lb->type == BRICK || lb->type == ZOLTAN_RCB || - lb->type == ZOLTAN_RIB || lb->type == ZOLTAN_HSFC))) { + if (((problem->type == DecompType::NODAL) && (lb->type == Balance::INERTIAL)) || + ((problem->type == DecompType::ELEMENTAL) && + (lb->type == Balance::INERTIAL || lb->type == Balance::ZPINCH || + lb->type == Balance::BRICK || lb->type == Balance::ZOLTAN_RCB || + lb->type == Balance::ZOLTAN_RIB || lb->type == Balance::ZOLTAN_HSFC))) { if (problem->read_coords != ELB_TRUE) { Gen_Error(0, "FATAL: internal logic error. Reading coordinates, but read_coords not set"); return 0; @@ -240,9 +242,10 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, * or ZOLTAN geometric load balancing, * I need to come up with coordinates for the elements. */ - if ((problem->type == ELEMENTAL) && - (lb->type == INERTIAL || lb->type == ZPINCH || lb->type == BRICK || lb->type == ZOLTAN_RCB || - lb->type == ZOLTAN_RIB || lb->type == ZOLTAN_HSFC)) { + if ((problem->type == DecompType::ELEMENTAL) && + (lb->type == Balance::INERTIAL || lb->type == Balance::ZPINCH || lb->type == Balance::BRICK || + lb->type == Balance::ZOLTAN_RCB || lb->type == Balance::ZOLTAN_RIB || + lb->type == Balance::ZOLTAN_HSFC)) { if (problem->read_coords != ELB_TRUE) { Gen_Error(0, "FATAL: internal logic error. Reading coordinates, but read_coords not set"); return 0; @@ -257,13 +260,13 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, size_t cnt = 0; for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - if (mesh->elem_type[ecnt] != SPHERE || problem->no_sph == 1) { + if (mesh->elem_type[ecnt] != ElementType::SPHERE || problem->no_sph == 1) { /* * for our purposes, the coordinate of the element will * be the average of the coordinates of the nodes that make * up that element */ - size_t nnodes = get_elem_info(NNODES, mesh->elem_type[cnt]); + size_t nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[cnt]); for (size_t ncnt = 0; ncnt < nnodes; ncnt++) { x_elem_ptr[cnt] += x_ptr[(mesh->connect[ecnt][ncnt])]; y_elem_ptr[cnt] += y_ptr[(mesh->connect[ecnt][ncnt])]; @@ -287,7 +290,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, (lb->type==INERTIAL||ZPINCH||BRICK||ZOLTAN))"*/ /* Allocate memory for the vertex to processor vector */ - if (problem->type == ELEMENTAL) { + if (problem->type == DecompType::ELEMENTAL) { lb->vertex2proc = reinterpret_cast(malloc(((problem->num_vertices) + sphere->num) * sizeof(int))); } @@ -300,23 +303,23 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, return 0; } - if (machine->type == HCUBE) { + if (machine->type == MachineType::HCUBE) { arch = 0; num_level = ilog2i(static_cast(machine->procs_per_box)); } - if (machine->type == MESH) { + if (machine->type == MachineType::MESH) { arch = machine->num_dims; num_level = 0; } - if (lb->refine == KL_REFINE) { + if (lb->refine == Balance::KL_REFINE) { refine = 1; } else { refine = 2; } - if (lb->type == INFILE) { + if (lb->type == Balance::INFILE) { assignfile = lb->file.c_str(); fp = fopen(assignfile, "r"); if (fp == nullptr) { @@ -331,21 +334,22 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, } switch (lb->type) { - case MULTIKL: glob_method = 1; break; - case SPECTRAL: glob_method = 2; break; - case INERTIAL: glob_method = 3; break; - case ZPINCH: - case BRICK: - case ZOLTAN_RCB: - case ZOLTAN_RIB: - case ZOLTAN_HSFC: + case Balance::MULTIKL: glob_method = 1; break; + case Balance::SPECTRAL: glob_method = 2; break; + case Balance::INERTIAL: glob_method = 3; break; + case Balance::ZPINCH: + case Balance::BRICK: + case Balance::ZOLTAN_RCB: + case Balance::ZOLTAN_RIB: + case Balance::ZOLTAN_HSFC: glob_method = 999; /* Chaco methods don't apply to ZPINCH, BRICK ZOLTAN_RCB, ZOLTAN_RIB, ZOLTAN_HSFC */ break; - case LINEAR: glob_method = 4; break; - case RANDOM: glob_method = 5; break; - case SCATTERED: glob_method = 6; break; - case INFILE: glob_method = 7; break; + case Balance::LINEAR: glob_method = 4; break; + case Balance::RANDOM: glob_method = 5; break; + case Balance::SCATTERED: glob_method = 6; break; + case Balance::INFILE: glob_method = 7; break; + default:; // do nothing } /* check if Chaco is supposed to make sure that the domains are connected */ @@ -397,12 +401,13 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, fmt::print("=======================Call Chaco===========================\n"); time1 = get_time(); - if (lb->type == INFILE) { + if (lb->type == Balance::INFILE) { flag = input_assign(fp, const_cast(assignfile), problem->num_vertices, lb->vertex2proc); } - if (lb->type == ZPINCH || lb->type == BRICK || lb->type == ZOLTAN_RCB || - lb->type == ZOLTAN_RIB || lb->type == ZOLTAN_HSFC) { + if (lb->type == Balance::ZPINCH || lb->type == Balance::BRICK || + lb->type == Balance::ZOLTAN_RCB || lb->type == Balance::ZOLTAN_RIB || + lb->type == Balance::ZOLTAN_HSFC) { fmt::print(stderr, "KDD -- ZPINCH, BRICK, ZOLTAN_RCB, ZOLTAN_RIB, and " "ZOLTAN_HSFC not supported with num_boxes > 1.\n"); fmt::print(stderr, "KDD -- Contact Karen Devine, kddevin@sandia.gov.\n"); @@ -412,7 +417,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, flag = INTER_FACE(problem->num_vertices, (int *)Data(graph->start), (int *)Data(graph->adj), Data(weight->vertices), Data(weight->edges), x_ptr, y_ptr, z_ptr, const_cast(assignfile), (char *)nullptr, lb->vertex2proc, tmp_arch, - tmp_lev, dim, goal, glob_method, refine, solve->rqi_flag, solve->vmax, + tmp_lev, dim, goal, glob_method, refine, (int)solve->rqi_flag, solve->vmax, lb->num_sects, solve->tolerance, seed); } @@ -605,7 +610,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, * num_level are already set for each box. */ if (problem->num_groups > 1) { - if (machine->type == MESH) { + if (machine->type == MachineType::MESH) { /* * mesh and groups are in conflict. the only way to resolve @@ -646,7 +651,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, for (int cnt = 0; cnt < upper; cnt++) { tmpdim[cnt] = machine->dim[cnt]; } - if (machine->type == MESH) { + if (machine->type == MachineType::MESH) { totalproc = tmpdim[0]; if (tmpdim[1] != 0) { totalproc *= tmpdim[1]; @@ -660,40 +665,41 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, } } - if (lb->type == INFILE) { + if (lb->type == Balance::INFILE) { flag = input_assign(fp, const_cast(assignfile), tmp_nv, tmp_v2p); } - else if (lb->type == ZPINCH) { + else if (lb->type == Balance::ZPINCH) { flag = ZPINCH_assign(machine, tmp_nv, tmp_x, tmp_y, tmp_z, tmp_v2p); BALANCE_STATS(machine, nullptr, tmp_nv, tmp_v2p); } - else if (lb->type == BRICK) { + else if (lb->type == Balance::BRICK) { flag = BRICK_assign(machine, tmp_nv, tmp_x, tmp_y, tmp_z, tmp_v2p); BALANCE_STATS(machine, nullptr, tmp_nv, tmp_v2p); } #ifdef USE_ZOLTAN - else if (lb->type == ZOLTAN_RCB) { + else if (lb->type == Balance::ZOLTAN_RCB) { flag = ZOLTAN_assign("RCB", totalproc, tmp_nv, tmp_vwgts, tmp_x, tmp_y, tmp_z, lb->ignore_z, tmp_v2p, argc, argv); BALANCE_STATS(machine, tmp_vwgts, tmp_nv, tmp_v2p); } - else if (lb->type == ZOLTAN_RIB) { + else if (lb->type == Balance::ZOLTAN_RIB) { flag = ZOLTAN_assign("RIB", totalproc, tmp_nv, tmp_vwgts, tmp_x, tmp_y, tmp_z, lb->ignore_z, tmp_v2p, argc, argv); BALANCE_STATS(machine, tmp_vwgts, tmp_nv, tmp_v2p); } - else if (lb->type == ZOLTAN_HSFC) { + else if (lb->type == Balance::ZOLTAN_HSFC) { flag = ZOLTAN_assign("HSFC", totalproc, tmp_nv, tmp_vwgts, tmp_x, tmp_y, tmp_z, lb->ignore_z, tmp_v2p, argc, argv); BALANCE_STATS(machine, tmp_vwgts, tmp_nv, tmp_v2p); } #else - else if (lb->type == ZOLTAN_RCB || lb->type == ZOLTAN_RIB || lb->type == ZOLTAN_HSFC) { + else if (lb->type == Balance::ZOLTAN_RCB || lb->type == Balance::ZOLTAN_RIB || + lb->type == Balance::ZOLTAN_HSFC) { Gen_Error(0, "fatal: Invalid load balance types -- Zoltan is not supported in this build"); goto cleanup; } #endif - else if (lb->type == LINEAR) { + else if (lb->type == Balance::LINEAR) { fmt::print(stderr, "Using internal linear decomposition\n"); /* assign the elements to the processors linearly */ size_t cnt = mesh->num_elems / machine->num_procs; @@ -719,7 +725,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, assert(lb->vertex2proc[i] < machine->num_procs); } } - else if (lb->type == SCATTERED) { + else if (lb->type == Balance::SCATTERED) { // Bad decomposition, useful for maximizing communication for testing algorithms... /* each element 'e' assigned to processor 'e' % 'num_proc' */ @@ -741,7 +747,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, time1 = get_time(); flag = INTER_FACE(tmp_nv, (int *)tmp_start, (int *)tmp_adj, tmp_vwgts, tmp_ewgts, tmp_x, tmp_y, tmp_z, const_cast(assignfile), (char *)nullptr, tmp_v2p, - arch, num_level, tmpdim, goal, glob_method, refine, solve->rqi_flag, + arch, num_level, tmpdim, goal, glob_method, refine, (int)solve->rqi_flag, solve->vmax, lb->num_sects, solve->tolerance, seed); time2 = get_time(); fmt::print("========================================================\n"); @@ -814,7 +820,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, vec_free(weight->edges); } - if (problem->type == ELEMENTAL) { + if (problem->type == DecompType::ELEMENTAL) { /* * If this is an elemental load balance and there are spheres present * then adjust lb->vertex2proc accordingly. The spheres are then @@ -824,7 +830,8 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, // If type == LINEAR || SCATTERED, then the spheres were handled above (unless the model // is // all spheres...) - if ((lb->type != LINEAR && lb->type != SCATTERED) || sphere->num == mesh->num_elems) { + if ((lb->type != Balance::LINEAR && lb->type != Balance::SCATTERED) || + sphere->num == mesh->num_elems) { if (sphere->num != mesh->num_elems) { // If all spheres, don't need to open up space... @@ -833,7 +840,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, * First generate "holes" in the vertex2proc vector where the * sphere assignments will be. */ - if (mesh->elem_type[ecnt] == SPHERE) { + if (mesh->elem_type[ecnt] == ElementType::SPHERE) { for (size_t cnt = (problem->num_vertices); cnt > ecnt; cnt--) { lb->vertex2proc[cnt] = lb->vertex2proc[cnt - 1]; } @@ -854,7 +861,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, size_t cnt2 = 0; for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - if (mesh->elem_type[ecnt] == SPHERE) { + if (mesh->elem_type[ecnt] == ElementType::SPHERE) { lb->vertex2proc[ecnt] = iproc; cnt2++; @@ -883,7 +890,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, fmt::print("\n==============Looking For Local Issues==================\n"); if (problem->face_adj == 1 && problem->alloc_graph == ELB_TRUE) { - identify_mechanisms(machine, problem, mesh, lb, graph, LOCAL_ISSUES); + identify_mechanisms(machine, problem, mesh, lb, graph, Issues::LOCAL_ISSUES); } else { /* need to free the bigger graph and create a face adjacent graph */ @@ -919,7 +926,7 @@ int generate_loadbal(Machine_Description *machine, Problem_Description *problem, graph->adj[cnt]++; } - identify_mechanisms(machine, problem, mesh, lb, graph, LOCAL_ISSUES); + identify_mechanisms(machine, problem, mesh, lb, graph, Issues::LOCAL_ISSUES); problem->alloc_graph = tmp_alloc_graph; problem->face_adj = tmp_adjacency; @@ -962,7 +969,7 @@ cleanup: } } - if (lb->type == INFILE) { + if (lb->type == Balance::INFILE) { fclose(fp); } @@ -1025,7 +1032,7 @@ int generate_maps(Machine_Description *machine, Problem_Description *problem, /*-----------------------------Execution Begins------------------------------*/ /* Generate the map for a nodal load balance */ - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { /* * Generate the nodal and elemental distribution for a nodal * decomposition. @@ -1064,7 +1071,7 @@ namespace { template int identify_mechanisms(Machine_Description *machine, Problem_Description *problem, Mesh_Description *mesh, LB_Description *lb, - Graph_Description *graph, int check_type) + Graph_Description *graph, Issues check_type) { std::vector list_ptr; @@ -1074,7 +1081,7 @@ namespace { */ if (problem->find_cnt_domains == 1) { - if (check_type == GLOBAL_ISSUES) { + if (check_type == Issues::GLOBAL_ISSUES) { size_t nrow = mesh->num_elems; std::vector rows(nrow + 1); std::vector list(nrow); @@ -1112,7 +1119,7 @@ namespace { } } - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { std::vector proc_cnt(machine->num_procs); std::vector local_number(mesh->num_elems); @@ -1236,7 +1243,7 @@ namespace { std::vector proc_cnt(machine->num_procs); std::vector local_number(mesh->num_elems); - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { int proc = lb->vertex2proc[ecnt]; assert(proc < machine->num_procs); @@ -1247,21 +1254,21 @@ namespace { size_t num_found = 0; for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - E_Type etype = mesh->elem_type[ecnt]; + ElementType etype = mesh->elem_type[ecnt]; /* need to check for volume elements */ if (is_3d_element(etype)) { - int nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[ecnt]); for (int ncnt = 0; ncnt < nnodes; ncnt++) { size_t node = mesh->connect[ecnt][ncnt]; problems[node] = 0; } - int nsides = get_elem_info(NSIDES, etype); + int nsides = get_elem_info(ElementInfo::NSIDES, etype); int proc = 0; - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { proc = lb->vertex2proc[ecnt]; } else { @@ -1292,28 +1299,29 @@ namespace { */ for (size_t pcnt = 0; pcnt < nhold; pcnt++) { - size_t el2 = graph->sur_elem[node][pcnt]; - E_Type etype2 = mesh->elem_type[el2]; + size_t el2 = graph->sur_elem[node][pcnt]; + ElementType etype2 = mesh->elem_type[el2]; int proc2 = 0; - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { proc2 = lb->vertex2proc[el2]; } assert(proc2 < machine->num_procs); if (ecnt != el2 && proc == proc2) { - if (etype2 == BAR2 || etype2 == BAR3 || etype2 == SHELL2 || etype2 == SHELL3) { + if (etype2 == ElementType::BAR2 || etype2 == ElementType::BAR3 || + etype2 == ElementType::SHELL2 || etype2 == ElementType::SHELL3) { problems[node] = el2 + 1; } - else if (etype2 == SHELL4 || etype2 == SHELL8 || etype2 == TSHELL3 || - etype2 == TSHELL6) { + else if (etype2 == ElementType::SHELL4 || etype2 == ElementType::SHELL8 || + etype2 == ElementType::TSHELL3 || etype2 == ElementType::TSHELL6) { /* * look for an element connect to one of the shells faces (not edges) * one can look at elements connected to 3 of the nodes - cannot use * diagonals due to triangular shells */ - int nsides2 = get_elem_info(NSIDES, etype2); + int nsides2 = get_elem_info(ElementInfo::NSIDES, etype2); size_t count = 0; for (int cnt = 0; cnt < nsides2; cnt++) { @@ -1359,10 +1367,10 @@ namespace { for (int ncnt = 0; ncnt < nnodes; ncnt++) { size_t node = mesh->connect[ecnt][ncnt]; if (problems[node]) { - size_t el2 = problems[node] - 1; - E_Type etype2 = mesh->elem_type[el2]; + size_t el2 = problems[node] - 1; + ElementType etype2 = mesh->elem_type[el2]; - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { fmt::print("WARNING: On Processor {} Local Element {}" " ({}) has a mechanism through Global Node {}" " with Local Element {} ({})\n", @@ -1386,7 +1394,7 @@ namespace { if (num_found) { fmt::print("Total mechanisms found = {}\n", num_found); - if (check_type == LOCAL_ISSUES) { + if (check_type == Issues::LOCAL_ISSUES) { if (problem->mech_add_procs == 1) { machine->num_procs++; fmt::print("\n!!! Processor count increased to {} processors\n", machine->num_procs); @@ -1425,9 +1433,9 @@ namespace { int internal = 1; int flag = 0; for (size_t ecnt = 0; ecnt < graph->sur_elem[ncnt].size(); ecnt++) { - int elem = graph->sur_elem[ncnt][ecnt]; - E_Type etype = mesh->elem_type[elem]; - int nnodes = get_elem_info(NNODES, etype); + int elem = graph->sur_elem[ncnt][ecnt]; + ElementType etype = mesh->elem_type[elem]; + int nnodes = get_elem_info(ElementInfo::NNODES, etype); for (size_t i = 0; i < static_cast(nnodes); i++) { int proc_n = lb->vertex2proc[mesh->connect[elem][i]]; assert(proc_n < machine->num_procs); @@ -1463,8 +1471,8 @@ namespace { /* Find the internal elements */ time1 = get_time(); for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { - E_Type etype = mesh->elem_type[ecnt]; - int nnodes = get_elem_info(NNODES, etype); + ElementType etype = mesh->elem_type[ecnt]; + int nnodes = get_elem_info(ElementInfo::NNODES, etype); for (size_t ncnt = 0; ncnt < static_cast(nnodes); ncnt++) { int node = mesh->connect[ecnt][ncnt]; int proc = lb->vertex2proc[node]; @@ -1493,25 +1501,6 @@ namespace { Mesh_Description *mesh, Graph_Description *graph, Problem_Description *problem) { - int sid; - int hflag1; - int hflag2; - int tflag1; - int tflag2; - int dflag; - - INT nelem; - INT side_nodes[MAX_SIDE_NODES]; - INT mirror_nodes[MAX_SIDE_NODES]; - int side_cnt; - - double time2; - - std::string cmesg; - std::string tmpstr; - - /*-----------------------------Execution Begins------------------------------*/ - /* Allocate memory */ lb->int_nodes.resize(machine->num_procs); lb->bor_nodes.resize(machine->num_procs); @@ -1541,14 +1530,16 @@ namespace { for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { int proce = lb->vertex2proc[ecnt]; auto etype = mesh->elem_type[ecnt]; - int nsides = get_elem_info(NSIDES, etype); + int nsides = get_elem_info(ElementInfo::NSIDES, etype); assert(nsides == 2); /* check each side of this element */ for (int nscnt = 0; nscnt < nsides; nscnt++) { /* get the node on this element side (should only be one)*/ - side_cnt = ss_to_node_list(etype, mesh->connect[ecnt], (nscnt + 1), side_nodes); + std::array side_nodes; + int side_cnt = + ss_to_node_list(etype, mesh->connect[ecnt], (nscnt + 1), side_nodes.data()); assert(side_cnt == 1); size_t nhold = graph->sur_elem[side_nodes[0]].size(); @@ -1586,64 +1577,59 @@ namespace { } } else { + std::array side_nodes; for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { int proc = lb->vertex2proc[ecnt]; assert(proc < machine->num_procs); - bool internal = true; - int flag = 0; - auto etype = mesh->elem_type[ecnt]; - int dim1 = get_elem_info(NDIM, etype); + bool internal = true; + int flag = 0; + ElementType etype = mesh->elem_type[ecnt]; + int dim1 = get_elem_info(ElementInfo::NDIM, etype); /* need to check for hex's or tet's */ - hflag1 = is_hex(etype); + bool hflag1 = is_hex(etype); - /* a tet10 cannot connect to a hex */ - tflag1 = is_tet(etype); + /* a TET10 cannot connect to a HEX */ + bool tflag1 = is_tet(etype); - int nsides = get_elem_info(NSIDES, etype); + int nsides = get_elem_info(ElementInfo::NSIDES, etype); /* check each side of this element */ for (int nscnt = 0; nscnt < nsides; nscnt++) { /* get the list of nodes on this element side */ - side_cnt = ss_to_node_list(etype, mesh->connect[ecnt], (nscnt + 1), side_nodes); + int side_cnt = + ss_to_node_list(etype, mesh->connect[ecnt], (nscnt + 1), side_nodes.data()); /* * now determine how many side set nodes are needed to * determine if there is an element connected to this side. * - * 1-d - need one node - * 2-d - need two nodes, so find one intersection - * 3-d - need three nodes, so find two intersections - * note: must check to make sure that this number is not - * larger than the number of nodes on the sides (ie - shell). + * 2-D - need two nodes, so find one intersection + * 3-D - need three nodes, so find two intersections + * NOTE: must check to make sure that this number is not + * larger than the number of nodes on the sides (ie - SHELL). */ int nnodes = mesh->num_dims; if (side_cnt < nnodes) { nnodes = side_cnt; } - if (nnodes > 1) - nnodes--; /* decrement to find the number of intersections needed */ + nnodes--; /* decrement to find the number of intersections needed */ - nelem = 0; /* reset this in case no intersections are needed */ + INT nelem = 0; /* reset this in case no intersections are needed */ /* * need to handle hex's differently because of * the tet/hex combination */ - if (!hflag1) { /* not a hex */ + if (!hflag1) { /* Not a hex */ - if (etype == BAR2 || etype == BAR3) { - size_t nhold = graph->sur_elem[side_nodes[0]].size(); - if (nhold > 1) { - for (size_t ncnt = 0; ncnt < nhold; ncnt++) { - hold_elem[ncnt] = graph->sur_elem[side_nodes[0]][ncnt]; - } - } - } - else if (!((etype == BAR2 || etype == SHELL2) && side_nodes[0] == side_nodes[1])) { + /* ignore degenerate bars */ + + if (!((etype == ElementType::BAR2 || etype == ElementType::SHELL2) && + side_nodes[0] == side_nodes[1])) { size_t nhold = graph->sur_elem[side_nodes[0]].size(); for (size_t ncnt = 0; ncnt < nhold; ncnt++) { @@ -1682,7 +1668,7 @@ namespace { */ /* first need to check for a degenerate element */ - dflag = 0; + int dflag = 0; if (side_nodes[0] == side_nodes[1] || side_nodes[0] == side_nodes[3]) { dflag++; } @@ -1827,9 +1813,9 @@ namespace { if (proc != proc2) { - E_Type etype2 = mesh->elem_type[elem]; + ElementType etype2 = mesh->elem_type[elem]; - int dim2 = get_elem_info(NDIM, etype2); + int dim2 = get_elem_info(ElementInfo::NDIM, etype2); int diff = abs(dim1 - dim2); @@ -1843,10 +1829,11 @@ namespace { if (diff < 2) { /* need to check for hex's */ - hflag2 = is_hex(etype2); - tflag2 = is_tet(etype2); + bool hflag2 = is_hex(etype2); + bool tflag2 = is_tet(etype2); /* check here for tet/hex combinations */ + int sid = 0; if ((tflag1 && hflag2) || (hflag1 && tflag2)) { /* * have to call a special function to get the side id @@ -1861,20 +1848,22 @@ namespace { * with the hex. */ sid = get_side_id_hex_tet(mesh->elem_type[elem], mesh->connect[elem], side_cnt, - side_nodes); + side_nodes.data()); } else { /* * get the side id of elem. Make sure that ecnt is * trying to communicate to a valid side of elem */ - side_cnt = get_ss_mirror(etype, side_nodes, (nscnt + 1), mirror_nodes); + std::array mirror_nodes; + side_cnt = + get_ss_mirror(etype, side_nodes.data(), (nscnt + 1), mirror_nodes.data()); /* * small kludge to handle 6 node faces butted up against * 4 node faces */ - if (etype == HEXSHELL && side_cnt == 6) { + if (etype == ElementType::HEXSHELL && side_cnt == 6) { side_cnt = 4; } @@ -1883,7 +1872,8 @@ namespace { * get the mirror of the side of ecnt */ sid = get_side_id(mesh->elem_type[elem], mesh->connect[elem], side_cnt, - mirror_nodes, problem->skip_checks, problem->partial_adj); + mirror_nodes.data(), problem->skip_checks, + problem->partial_adj); } if (sid > 0) { @@ -1905,15 +1895,15 @@ namespace { * too many errors with bad meshes, print out * more information here for diagnostics */ - cmesg = + std::string cmesg = fmt::format("Error returned while getting side id for communication map."); Gen_Error(0, cmesg); cmesg = fmt::format("Element 1: {}", (ecnt + 1)); Gen_Error(0, cmesg); - nnodes = get_elem_info(NNODES, etype); + nnodes = get_elem_info(ElementInfo::NNODES, etype); cmesg = "connect table:"; for (int i = 0; i < nnodes; i++) { - tmpstr = fmt::format(" {}", (size_t)(mesh->connect[ecnt][i] + 1)); + std::string tmpstr = fmt::format(" {}", (size_t)(mesh->connect[ecnt][i] + 1)); cmesg += tmpstr; } Gen_Error(0, cmesg); @@ -1921,16 +1911,16 @@ namespace { Gen_Error(0, cmesg); cmesg = "side nodes:"; for (int i = 0; i < side_cnt; i++) { - tmpstr = fmt::format(" {}", (size_t)(side_nodes[i] + 1)); + std::string tmpstr = fmt::format(" {}", (size_t)(side_nodes[i] + 1)); cmesg += tmpstr; } Gen_Error(0, cmesg); cmesg = fmt::format("Element 2: {}", (size_t)(elem + 1)); Gen_Error(0, cmesg); - nnodes = get_elem_info(NNODES, etype2); + nnodes = get_elem_info(ElementInfo::NNODES, etype2); cmesg = "connect table:"; for (int i = 0; i < nnodes; i++) { - tmpstr = fmt::format(" {}", (size_t)(mesh->connect[elem][i] + 1)); + std::string tmpstr = fmt::format(" {}", (size_t)(mesh->connect[elem][i] + 1)); cmesg += tmpstr; } Gen_Error(0, cmesg); @@ -1948,8 +1938,7 @@ namespace { } } /* End "for(ecnt=0; ecnt < mesh->num_elems; ecnt++)" */ } - - time2 = get_time(); + double time2 = get_time(); fmt::print("Time for elemental categorization: {}s\n", time2 - time1); /* Find the internal and border nodes */ @@ -2363,7 +2352,7 @@ namespace { exit(-1); } - if (machine->type != MESH) { + if (machine->type != MachineType::MESH) { fmt::print(stderr, "KDD -- Machine must be a MESH " "with # wedges * # slices processors.\n"); fmt::print(stderr, "KDD -- Use nem_slice argument -m mesh=AxB, \n"); @@ -2569,7 +2558,7 @@ namespace { exit(-1); } - if (machine->type != MESH) { + if (machine->type != MachineType::MESH) { fmt::print(stderr, "KDD -- Machine must be a MESH " "with nx * ny * nz processors.\n"); fmt::print(stderr, "KDD -- Use nem_slice argument -m mesh=AxBxC, \n"); diff --git a/packages/seacas/applications/nem_slice/elb_main.C b/packages/seacas/applications/nem_slice/elb_main.C index d63a64c8a834..8dff8197d764 100644 --- a/packages/seacas/applications/nem_slice/elb_main.C +++ b/packages/seacas/applications/nem_slice/elb_main.C @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -20,7 +20,7 @@ #include "add_to_log.h" // for add_to_log #include "elb.h" // for LB_Description, get_time, etc #include "elb_allo.h" // for array_alloc -#include "elb_elem.h" // for E_Type, ::NULL_EL +#include "elb_elem.h" // for ElementType, ::NULL_EL #include "elb_err.h" // for error_report, Gen_Error, etc #include "elb_exo.h" // for init_weight_struct, etc #include "elb_graph.h" // for generate_graph @@ -245,7 +245,8 @@ template int internal_main(int argc, char *argv[], INT /* dummy * error_report(); exit(1); } - else if ((problem.type == ELEMENTAL) && ((mesh.num_elems) / (machine.num_procs) < 1)) { + else if ((problem.type == DecompType::ELEMENTAL) && + ((mesh.num_elems) / (machine.num_procs) < 1)) { Gen_Error(0, "fatal: problem divided among too many processors"); error_report(); exit(1); @@ -276,26 +277,26 @@ template int internal_main(int argc, char *argv[], INT /* dummy * } /* Initialize various parameters */ - if (lb.type == INERTIAL || lb.type == ZPINCH || lb.type == BRICK || lb.type == ZOLTAN_RCB || - lb.type == ZOLTAN_RIB || lb.type == ZOLTAN_HSFC || problem.vis_out == 1 || - problem.vis_out == 2) { + if (lb.type == Balance::INERTIAL || lb.type == Balance::ZPINCH || lb.type == Balance::BRICK || + lb.type == Balance::ZOLTAN_RCB || lb.type == Balance::ZOLTAN_RIB || + lb.type == Balance::ZOLTAN_HSFC || problem.vis_out == 1 || problem.vis_out == 2) { problem.read_coords = ELB_TRUE; } else { problem.read_coords = ELB_FALSE; } - if (lb.type != SPECTRAL) { + if (lb.type != Balance::SPECTRAL) { problem.coarse_flag = ELB_FALSE; } else { problem.coarse_flag = ELB_TRUE; } - if (lb.refine == KL_REFINE) { + if (lb.refine == Balance::KL_REFINE) { problem.alloc_graph = ELB_TRUE; } - else if (lb.type == SPECTRAL) { + else if (lb.type == Balance::SPECTRAL) { problem.alloc_graph = ELB_TRUE; } else { @@ -316,10 +317,10 @@ template int internal_main(int argc, char *argv[], INT /* dummy * } /* Allocate necessary memory */ - if (problem.type == NODAL) { + if (problem.type == DecompType::NODAL) { problem.num_vertices = mesh.num_nodes; } - else if (problem.type == ELEMENTAL) { + else if (problem.type == DecompType::ELEMENTAL) { problem.num_vertices = (mesh.num_elems - sphere.num); } @@ -455,27 +456,27 @@ template int internal_main(int argc, char *argv[], INT /* dummy * for (int cnt = 0; cnt < machine.num_procs; cnt++) { vec_free(lb.int_nodes[cnt]); vec_free(lb.bor_nodes[cnt]); - if (problem.type == NODAL) { + if (problem.type == DecompType::NODAL) { vec_free(lb.ext_nodes[cnt]); vec_free(lb.ext_procs[cnt]); } vec_free(lb.int_elems[cnt]); - if (problem.type == ELEMENTAL) { + if (problem.type == DecompType::ELEMENTAL) { vec_free(lb.bor_elems[cnt]); } } vec_free(lb.int_nodes); - if (problem.type == NODAL) { + if (problem.type == DecompType::NODAL) { vec_free(lb.ext_nodes); vec_free(lb.ext_procs); } vec_free(lb.int_elems); - if (problem.type == ELEMENTAL) { + if (problem.type == DecompType::ELEMENTAL) { vec_free(lb.bor_elems); for (int cnt = 0; cnt < machine.num_procs; cnt++) { for (size_t cnt1 = 0; cnt1 < lb.bor_nodes[cnt].size(); cnt1++) { @@ -521,9 +522,9 @@ namespace { fmt::print("Performing "); switch (prob->type) { - case NODAL: fmt::print("a nodal "); break; + case DecompType::NODAL: fmt::print("a nodal "); break; - case ELEMENTAL: fmt::print("an elemental "); break; + case DecompType::ELEMENTAL: fmt::print("an elemental "); break; } fmt::print("load balance with the following parameters...\n"); @@ -540,26 +541,29 @@ namespace { fmt::print("\tarchitecture: "); } switch (machine->type) { - case HCUBE: fmt::print("hypercube\n"); break; - - case MESH: fmt::print("mesh\n"); break; + case MachineType::HCUBE: fmt::print("hypercube\n"); break; + case MachineType::MESH: fmt::print("mesh\n"); break; + default: fmt::print("invalid/unknown\n"); break; } + if (machine->num_boxes > 1) { fmt::print("\tdimension(s) of each box: "); } else { fmt::print("\tdimension(s): "); } + switch (machine->type) { - case HCUBE: fmt::print("{}\n", machine->dim[0]); break; + case MachineType::HCUBE: fmt::print("{}\n", machine->dim[0]); break; - case MESH: + case MachineType::MESH: for (int cnt = 0; cnt < (machine->num_dims) - 1; cnt++) { fmt::print("{}x", machine->dim[cnt]); } fmt::print("{}\n", machine->dim[(machine->num_dims) - 1]); break; + default:; /* do nothing */ } fmt::print("\ttotal number of processors: {}\n", machine->num_procs); @@ -568,44 +572,46 @@ namespace { /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ fmt::print("Load Balance Parameters\n"); switch (lb->type) { - case MULTIKL: + case Balance::MULTIKL: fmt::print("\ttype: multilevel\n"); fmt::print("\tnumber of sections: {}\n", lb->num_sects); break; - case SPECTRAL: + case Balance::SPECTRAL: fmt::print("\ttype: spectral\n"); fmt::print("\tnumber of sections: {}\n", lb->num_sects); break; - case INERTIAL: fmt::print("\ttype: inertial\n"); break; + case Balance::INERTIAL: fmt::print("\ttype: inertial\n"); break; - case ZPINCH: fmt::print("\ttype: zpinch\n"); break; + case Balance::ZPINCH: fmt::print("\ttype: zpinch\n"); break; - case BRICK: fmt::print("\ttype: brick\n"); break; + case Balance::BRICK: fmt::print("\ttype: brick\n"); break; - case ZOLTAN_RCB: fmt::print("\ttype: rcb\n"); break; + case Balance::ZOLTAN_RCB: fmt::print("\ttype: rcb\n"); break; - case ZOLTAN_RIB: fmt::print("\ttype: rib\n"); break; + case Balance::ZOLTAN_RIB: fmt::print("\ttype: rib\n"); break; - case ZOLTAN_HSFC: fmt::print("\ttype: hsfc\n"); break; + case Balance::ZOLTAN_HSFC: fmt::print("\ttype: hsfc\n"); break; - case LINEAR: fmt::print("\ttype: linear\n"); break; + case Balance::LINEAR: fmt::print("\ttype: linear\n"); break; - case RANDOM: fmt::print("\ttype: random\n"); break; + case Balance::RANDOM: fmt::print("\ttype: random\n"); break; - case SCATTERED: fmt::print("\ttype: scattered\n"); break; + case Balance::SCATTERED: fmt::print("\ttype: scattered\n"); break; - case INFILE: + case Balance::INFILE: fmt::print("\ttype: input from file\n"); fmt::print("\tfile name: {}\n", lb->file); break; + default:; /* do nothing */ } fmt::print("\trefinement: "); switch (lb->refine) { - case KL_REFINE: fmt::print("Kernighan-Lin\n"); break; + case Balance::KL_REFINE: fmt::print("Kernighan-Lin\n"); break; - case NO_REFINE: fmt::print("none\n"); break; + case Balance::NO_REFINE: fmt::print("none\n"); break; + default:; /* do nothing */ } if (lb->cnctd_dom) { fmt::print("\tConnected Domain enforced\n"); @@ -618,10 +624,10 @@ namespace { /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* EIGENSOLVER PARAMETERS */ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - if (lb->type == MULTIKL || lb->type == SPECTRAL) { + if (lb->type == Balance::MULTIKL || lb->type == Balance::SPECTRAL) { fmt::print("Eigensolver Parameters\n"); fmt::print("\teignsolver tolerance: {}\n", solver->tolerance); - if (solver->rqi_flag == USE_RQI) { + if (solver->rqi_flag == SolverOptions::USE_RQI) { fmt::print("\tusing RQI/Symmlq eigensolver\n"); fmt::print("\tnumber of vertices to coarsen down to: {}\n", solver->vmax); } diff --git a/packages/seacas/applications/nem_slice/elb_output.C b/packages/seacas/applications/nem_slice/elb_output.C index 7e0869e38b04..f501b811851f 100644 --- a/packages/seacas/applications/nem_slice/elb_output.C +++ b/packages/seacas/applications/nem_slice/elb_output.C @@ -103,7 +103,7 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, ex_set_option(exoid, EX_OPT_COMPRESSION_SHUFFLE, 1); /* Create the title */ - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { method1 = "nodal"; } else { @@ -116,26 +116,29 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, method2 = "method2: "; switch (lb->type) { - case MULTIKL: + case Balance::MULTIKL: method1 += "Multilevel-KL decomposition"; method2 += "With Kernighan-Lin refinement"; break; - case SPECTRAL: method1 += "Spectral decomposition"; break; - case INERTIAL: method1 += "Inertial decomposition"; break; - case ZPINCH: method1 += "ZPINCH decomposition"; break; - case BRICK: method1 += "BRICK decomposition"; break; - case ZOLTAN_RCB: method1 += "RCB decomposition"; break; - case ZOLTAN_RIB: method1 += "RIB decomposition"; break; - case ZOLTAN_HSFC: method1 += "HSFC decomposition"; break; - case LINEAR: method1 += "Linear decomposition"; break; - case RANDOM: method1 += "Random decomposition"; break; - case SCATTERED: method1 += "Scattered decomposition"; break; - } - - if (lb->refine == KL_REFINE && lb->type != MULTIKL) { + case Balance::SPECTRAL: method1 += "Spectral decomposition"; break; + case Balance::INERTIAL: method1 += "Inertial decomposition"; break; + case Balance::ZPINCH: method1 += "ZPINCH decomposition"; break; + case Balance::BRICK: method1 += "BRICK decomposition"; break; + case Balance::ZOLTAN_RCB: method1 += "RCB decomposition"; break; + case Balance::ZOLTAN_RIB: method1 += "RIB decomposition"; break; + case Balance::ZOLTAN_HSFC: method1 += "HSFC decomposition"; break; + case Balance::LINEAR: method1 += "Linear decomposition"; break; + case Balance::RANDOM: method1 += "Random decomposition"; break; + case Balance::SCATTERED: method1 += "Scattered decomposition"; break; + case Balance::INFILE: method1 += "Infile decomposition"; break; + case Balance::INVALID: method1 += "ERROR: Invalid decomposition"; break; + default:; // do nothing + } + + if (lb->refine == Balance::KL_REFINE && lb->type != Balance::MULTIKL) { method2 += "with Kernighan-Lin refinement"; } - else if (lb->type != MULTIKL) { + else if (lb->type != Balance::MULTIKL) { method2 += "no refinement"; } @@ -150,7 +153,7 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, /* Sort node maps */ gds_qsort(Data(lb->int_nodes[proc]), lb->int_nodes[proc].size()); - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { sort2(lb->ext_nodes[proc].size(), Data(lb->ext_nodes[proc]), Data(lb->ext_procs[proc])); } @@ -223,7 +226,7 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, std::vector num_nmap_cnts(machine->num_procs); std::vector num_emap_cnts(machine->num_procs); - if (problem->type == NODAL) { + if (problem->type == DecompType::NODAL) { /* need to check and make sure that there really are comm maps */ for (int cnt = 0; cnt < machine->num_procs; cnt++) { if (!lb->bor_nodes[cnt].empty()) { @@ -275,7 +278,7 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, } } - if (problem->type == NODAL) /* Nodal load balance output */ + if (problem->type == DecompType::NODAL) /* Nodal load balance output */ { /* Set up for the concatenated communication map parameters */ std::vector node_proc_ptr(machine->num_procs + 1); @@ -328,7 +331,7 @@ int write_nemesis(std::string &nemI_out_file, Machine_Description *machine, } /* End "for(proc=0; proc < machine->num_procs; proc++)" */ } - else if (problem->type == ELEMENTAL) /* Elemental load balance output */ + else if (problem->type == DecompType::ELEMENTAL) /* Elemental load balance output */ { std::vector node_proc_ptr(machine->num_procs + 1); std::vector node_cmap_ids_cc(machine->num_procs); @@ -459,7 +462,7 @@ int write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_D * number of element blocks. */ int vis_nelem_blks; - if (prob->type == ELEMENTAL) { + if (prob->type == DecompType::ELEMENTAL) { vis_nelem_blks = machine->num_procs; } else { @@ -572,12 +575,12 @@ int write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_D std::vector tmp_connect(nsize); for (size_t ecnt = 0; ecnt < mesh->num_elems; ecnt++) { elem_map[ecnt] = ecnt + 1; - if (prob->type == ELEMENTAL) { + if (prob->type == DecompType::ELEMENTAL) { elem_block[ecnt] = lb->vertex2proc[ecnt]; } else { int proc = lb->vertex2proc[mesh->connect[ecnt][0]]; - int nnodes = get_elem_info(NNODES, mesh->elem_type[ecnt]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[ecnt]); elem_block[ecnt] = proc; for (int ncnt = 1; ncnt < nnodes; ncnt++) { if (lb->vertex2proc[mesh->connect[ecnt][ncnt]] != proc) { @@ -602,7 +605,7 @@ int write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_D old_pos += pos + 1; ecnt = mesh->num_elems - old_pos; el_ptr = Data(elem_block) + old_pos; - int nnodes = get_elem_info(NNODES, mesh->elem_type[old_pos - 1]); + int nnodes = get_elem_info(ElementInfo::NNODES, mesh->elem_type[old_pos - 1]); for (int ncnt = 0; ncnt < nnodes; ncnt++) { tmp_connect[ccnt++] = mesh->connect[old_pos - 1][ncnt] + 1; } @@ -651,7 +654,7 @@ int write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_D } const char *var_names[] = {"proc"}; - if (prob->type == NODAL) { + if (prob->type == DecompType::NODAL) { /* Allocate memory for the nodal values */ std::vector proc_vals(mesh->num_nodes); @@ -682,7 +685,7 @@ int write_vis(std::string &nemI_out_file, std::string &exoII_inp_file, Machine_D return 0; } } - else if (prob->type == ELEMENTAL) { + else if (prob->type == DecompType::ELEMENTAL) { /* Allocate memory for the element values */ std::vector proc_vals(mesh->num_elems); diff --git a/packages/seacas/applications/nem_slice/fix_column_partitions.C b/packages/seacas/applications/nem_slice/fix_column_partitions.C index c84981847878..57a8a5e90610 100644 --- a/packages/seacas/applications/nem_slice/fix_column_partitions.C +++ b/packages/seacas/applications/nem_slice/fix_column_partitions.C @@ -34,7 +34,7 @@ namespace { */ template - void find_adjacent_element(INT cur_elem, E_Type etype, int side_id, int nadj, INT const *adj, + void find_adjacent_element(INT cur_elem, ElementType etype, int side_id, int nadj, INT const *adj, Mesh_Description const *const mesh, INT *adj_elem, int *adj_side) { *adj_elem = -1; @@ -54,8 +54,8 @@ namespace { get_ss_mirror(etype, Data(side_nodes), side_id, Data(side_nodes_flipped)); for (int i = 0; i < nadj; i++) { - INT adj_elem_id = adj[i] - 1; // Adjacency graph entries start from 1 - E_Type etype2 = mesh->elem_type[adj_elem_id]; + INT adj_elem_id = adj[i] - 1; // Adjacency graph entries start from 1 + ElementType etype2 = mesh->elem_type[adj_elem_id]; // Does this side occurs in the adjacent element? @@ -113,7 +113,7 @@ int fix_column_partitions(LB_Description *lb, Mesh_Description const * continue; } - E_Type etype = mesh->elem_type[i]; + ElementType etype = mesh->elem_type[i]; // Only hexes and wedges can be stacked in columns if (!is_hex(etype) && !is_wedge(etype)) { @@ -124,7 +124,7 @@ int fix_column_partitions(LB_Description *lb, Mesh_Description const * // local numbering of nodes with respect to the element node list INT *elnodes = mesh->connect[i]; - int nelnodes = get_elem_info(NNODES, etype); + int nelnodes = get_elem_info(ElementInfo::NNODES, etype); float elcoord[27][3]; for (int j = 0; j < nelnodes; j++) { @@ -135,7 +135,7 @@ int fix_column_partitions(LB_Description *lb, Mesh_Description const * int top_side0 = 0; int bot_side0 = 0; - int nelfaces = get_elem_info(NSIDES, etype); + int nelfaces = get_elem_info(ElementInfo::NSIDES, etype); // Find top and bottom faces by eliminating lateral faces under // the assumption that lateral face normals have no Z component diff --git a/packages/seacas/applications/numbers/nu_multi_cavity.f b/packages/seacas/applications/numbers/nu_multi_cavity.f index 1bc6e4c7db9b..3c8c3bf4a39c 100644 --- a/packages/seacas/applications/numbers/nu_multi_cavity.f +++ b/packages/seacas/applications/numbers/nu_multi_cavity.f @@ -1,14 +1,14 @@ -C Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C C See packages/seacas/LICENSE for details C ... Each cavity is a single sideset id, but calculates volume of each cavity -C simultaneously and then outputs all data at the end. Only reads the +C simultaneously and then outputs all data at the end. Only reads the C displacements a single time for all cavities instead of once per cavity - SUBROUTINE MULTI_CAVITY (A, CRD, IDESS, NEESS, NNESS, IPEESS, + SUBROUTINE MULTI_CAVITY (A, CRD, IDESS, NEESS, NNESS, IPEESS, * IPNESS, LTEESS, LTNESS, FACESS, DISP, NUMNP, NDIM, NUMESS, * TIME, ITMSEL, TITLE, CENT, CENTER) @@ -128,4 +128,4 @@ SUBROUTINE MULTI_CAVITY (A, CRD, IDESS, NEESS, NNESS, IPEESS, RETURN END - + diff --git a/packages/seacas/applications/slice/SL_Decompose.C b/packages/seacas/applications/slice/SL_Decompose.C index a93ef4586665..fdf58a9d1828 100644 --- a/packages/seacas/applications/slice/SL_Decompose.C +++ b/packages/seacas/applications/slice/SL_Decompose.C @@ -22,9 +22,6 @@ #include #include -#if !defined __NVCC__ -#include -#endif #include #include #include @@ -160,7 +157,7 @@ namespace { template void decompose_metis(const Ioss::Region ®ion, SystemInterface &interFace, - std::vector &elem_to_proc, IOSS_MAYBE_UNUSED INT dummy) + std::vector &elem_to_proc, INT dummy) { size_t element_count = region.get_property("element_count").get_int(); @@ -272,15 +269,13 @@ namespace { } // namespace template std::vector decompose_elements(const Ioss::Region ®ion, SystemInterface &interFace, - const std::vector &weights, - IOSS_MAYBE_UNUSED int dummy); + const std::vector &weights, int dummy); template std::vector decompose_elements(const Ioss::Region ®ion, SystemInterface &interFace, - const std::vector &weights, - IOSS_MAYBE_UNUSED int64_t dummy); + const std::vector &weights, int64_t dummy); template std::vector decompose_elements(const Ioss::Region ®ion, SystemInterface &interFace, - const std::vector &weights, IOSS_MAYBE_UNUSED INT dummy) + const std::vector &weights, INT dummy) { progress(__func__); // Populate the 'elem_to_proc' vector with a mapping from element to processor. diff --git a/packages/seacas/applications/slice/SL_SystemInterface.C b/packages/seacas/applications/slice/SL_SystemInterface.C index b8c0859a1a3a..6d5372f6f181 100644 --- a/packages/seacas/applications/slice/SL_SystemInterface.C +++ b/packages/seacas/applications/slice/SL_SystemInterface.C @@ -157,20 +157,30 @@ void SystemInterface::enroll_options() options_.enroll("64-bit", GetLongOption::NoValue, "Use 64-bit integers on output database", nullptr, nullptr, true); - options_.enroll("shuffle", GetLongOption::NoValue, - "Use a netcdf4 hdf5-based file and use hdf5s shuffle mode with compression.", + options_.enroll("zlib", GetLongOption::NoValue, + "Use the Zlib / libz compression method if compression is enabled (default) " + "[exodus only, enables netcdf-4].", nullptr); - options_.enroll( - "zlib", GetLongOption::NoValue, - "Use the Zlib / libz compression method if compression is enabled (default) [exodus only].", - nullptr); - options_.enroll("szip", GetLongOption::NoValue, "Use SZip compression. [exodus only, enables netcdf-4]", nullptr); + options_.enroll("zstd", GetLongOption::NoValue, + "Use Zstd compression. [exodus only, enables netcdf-4, experimental]", nullptr); + options_.enroll("bz2", GetLongOption::NoValue, + "Use Bzip2 compression. [exodus only, enables netcdf-4, experimental]", nullptr); + + options_.enroll("shuffle", GetLongOption::NoValue, + "Use a netcdf4 hdf5-based file and use hdf5s shuffle mode with compression.", + nullptr); options_.enroll("compress", GetLongOption::MandatoryValue, - "Specify the hdf5 compression level [0..9] to be used on the output file.", + "Specify the compression level to be used. Values depend on algorithm:\n" + "\t\tzlib/bzip2: 0..9\t\tszip: even, 4..32\t\tzstd: -131072..22", + nullptr); + + options_.enroll("quantize_nsd", GetLongOption::MandatoryValue, + "Use the lossy quantize compression method. Value specifies number of digits to " + "retain (1..15) [exodus only]", nullptr, nullptr, true); options_.enroll("debug", GetLongOption::MandatoryValue, @@ -328,18 +338,62 @@ bool SystemInterface::parse_options(int argc, char **argv) } shuffle_ = (options_.retrieve("shuffle") != nullptr); + zlib_ = (options_.retrieve("zlib") != nullptr); + szip_ = (options_.retrieve("szip") != nullptr); + zstd_ = (options_.retrieve("zstd") != nullptr); + bz2_ = (options_.retrieve("bzip2") != nullptr); + + if ((szip_ ? 1 : 0) + (zlib_ ? 1 : 0) + (zstd_ ? 1 : 0) + (bz2_ ? 1 : 0) > 1) { + fmt::print(stderr, + "ERROR: Only one of 'szip' or 'zlib' or 'zstd' or 'bzip2' can be specified.\n"); + } + + { + const char *temp = options_.retrieve("compress"); + if (temp != nullptr) { + compressionLevel_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } - if (options_.retrieve("szip") != nullptr) { - szip_ = true; - zlib_ = false; + if (zlib_ || bz2_) { + if (compressionLevel_ < 0 || compressionLevel_ > 9) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 0 and 9 inclusive " + "for gzip/zlib compression.\n", + compressionLevel_); + return false; + } + } + else if (szip_) { + if (compressionLevel_ % 2 != 0) { + fmt::print( + stderr, + "ERROR: Bad compression level {}. Must be an even value for szip compression.\n", + compressionLevel_); + return false; + } + if (compressionLevel_ < 4 || compressionLevel_ > 32) { + fmt::print(stderr, + "ERROR: Bad compression level {}, valid value is between 4 and 32 inclusive " + "for szip compression.\n", + compressionLevel_); + return false; + } + } + } } - zlib_ = (options_.retrieve("zlib") != nullptr); - if (szip_ && zlib_) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); + { + const char *temp = options_.retrieve("quantize_nsd"); + if (temp != nullptr) { + quantizeNSD_ = std::strtol(temp, nullptr, 10); + if (!szip_ && !zlib_ && !zstd_ && !bz2_) { + zlib_ = true; + } + } } - compressionLevel_ = options_.get_option_value("compress", compressionLevel_); contig_ = options_.retrieve("contiguous_decomposition") != nullptr; outputDecompMap_ = options_.retrieve("output_decomp_map") != nullptr; outputDecompField_ = options_.retrieve("output_decomp_field") != nullptr; diff --git a/packages/seacas/applications/slice/SL_SystemInterface.h b/packages/seacas/applications/slice/SL_SystemInterface.h index c0f5aef74a33..d95961315638 100644 --- a/packages/seacas/applications/slice/SL_SystemInterface.h +++ b/packages/seacas/applications/slice/SL_SystemInterface.h @@ -90,13 +90,16 @@ class SystemInterface public: int compressionLevel_{0}; + int quantizeNSD_{0}; bool shuffle_{false}; bool ints64Bit_{false}; bool netcdf4_{false}; bool netcdf5_{false}; bool disableFieldRecognition_{false}; + bool zlib_{false}; bool szip_{false}; - bool zlib_{true}; + bool zstd_{false}; + bool bz2_{false}; bool outputDecompMap_{false}; bool outputDecompField_{false}; bool ignore_x_{false}; diff --git a/packages/seacas/applications/slice/Slice.C b/packages/seacas/applications/slice/Slice.C index 2bba93b462ed..d43a141cedb9 100644 --- a/packages/seacas/applications/slice/Slice.C +++ b/packages/seacas/applications/slice/Slice.C @@ -89,15 +89,27 @@ namespace { properties.add(Ioss::Property("FILE_TYPE", "netcdf5")); } - if (interFace.compressionLevel_ > 0 || interFace.shuffle_ || interFace.szip_) { + if (interFace.compressionLevel_ > 0 || interFace.shuffle_ || interFace.szip_ || + interFace.zlib_ || interFace.zstd_) { properties.add(Ioss::Property("FILE_TYPE", "netcdf4")); properties.add(Ioss::Property("COMPRESSION_LEVEL", interFace.compressionLevel_)); properties.add(Ioss::Property("COMPRESSION_SHUFFLE", static_cast(interFace.shuffle_))); - if (interFace.szip_) { + + if (interFace.zlib_) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + } + else if (interFace.szip_) { properties.add(Ioss::Property("COMPRESSION_METHOD", "szip")); } - else if (interFace.zlib_) { - properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + else if (interFace.zstd_) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zstd")); + } + else if (interFace.bz2_) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "bzip2")); + } + + if (interFace.quantizeNSD_ > 0) { + properties.add(Ioss::Property("COMPRESSION_QUANTIZE_NSD", interFace.quantizeNSD_)); } } @@ -1418,7 +1430,10 @@ namespace { } if (debug_level & 32) { - Ioss::DecompUtils::output_decomposition_statistics(elem_to_proc, interFace.processor_count()); + auto work_per_rank = + Ioss::DecompUtils::get_work_per_rank(elem_to_proc, interFace.processor_count()); + auto avg_median = Ioss::DecompUtils::output_decomposition_statistics(work_per_rank); + Ioss::DecompUtils::output_histogram(work_per_rank, avg_median.first, avg_median.second); } if (!create_split_files) { diff --git a/packages/seacas/applications/zellij/Grid.C b/packages/seacas/applications/zellij/Grid.C index d4324c3e47e6..572b533e1c74 100644 --- a/packages/seacas/applications/zellij/Grid.C +++ b/packages/seacas/applications/zellij/Grid.C @@ -1,4 +1,4 @@ -// Copyright(C) 2021, 2022, 2023 National Technology & Engineering Solutions +// Copyright(C) 2021, 2022, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -793,7 +793,7 @@ template void Grid::output_node_map(const Cell &cell, INT /*dummy auto count = cell.added_node_count(Mode::PROCESSOR, m_equivalenceNodes); if (parallel_size() == 1) { - auto gid = cell.m_globalNodeIdOffset + 1; + INT gid = cell.m_globalNodeIdOffset + 1; std::vector map(count); std::iota(map.begin(), map.end(), gid); int exoid = output_region(rank)->get_database()->get_file_pointer(); @@ -852,7 +852,7 @@ template void Grid::output_element_map(Cell &cell, INT /*dummy*/) auto *block = cell.region()->get_element_block(output_element_block->name()); if (block != nullptr) { - auto gid = cell.m_globalElementIdOffset[block->name()] + 1 + global_id_offset; + INT gid = cell.m_globalElementIdOffset[block->name()] + 1 + global_id_offset; auto element_count = block->entity_count(); std::vector map(element_count); diff --git a/packages/seacas/libraries/aprepro_lib/CMakeLists.txt b/packages/seacas/libraries/aprepro_lib/CMakeLists.txt index 13fcf791dda3..207c5cbe414c 100644 --- a/packages/seacas/libraries/aprepro_lib/CMakeLists.txt +++ b/packages/seacas/libraries/aprepro_lib/CMakeLists.txt @@ -113,7 +113,7 @@ if (${PACKAGE_NAME}_ENABLE_TESTS) TRIBITS_ADD_ADVANCED_TEST( aprepro_lib_unit_test TEST_0 EXEC aprepro_lib_test - ARGS -o test.output ${CMAKE_CURRENT_SOURCE_DIR}/test.inp_app + ARGS -o test.output ${CMAKE_CURRENT_SOURCE_DIR}/test.inp_app NOEXEPREFIX NOEXESUFFIX PASS_ANY TEST_1 CMND diff ARGS -w diff --git a/packages/seacas/libraries/aprepro_lib/apr_aprepro.cc b/packages/seacas/libraries/aprepro_lib/apr_aprepro.cc index 2f0a5e62e059..db9b016184b3 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_aprepro.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_aprepro.cc @@ -33,8 +33,8 @@ #endif namespace { - const std::string version_short{"6.32"}; - const std::string version_date{"(2024/05/20)"}; + const std::string version_short{"6.35"}; + const std::string version_date{"(2024/11/06)"}; const std::string version_string = version_short + " " + version_date; void output_copyright(); @@ -137,7 +137,7 @@ namespace SEAMS { std::string Aprepro::long_version() const { - auto comment = getsym("_C_")->value.svar; + const auto &comment = getsym("_C_")->value.svar; return comment + " Algebraic Preprocessor (Aprepro) version " + version(); } @@ -447,7 +447,7 @@ namespace SEAMS { const std::string &short_opt, size_t min_length) { // See if `option` starts with 1 or 2 leading `-`. - int number_dash = option[0] == '-' ? (option[1] == '-' ? 2 : 1) : 0; + size_t number_dash = option[0] == '-' ? (option[1] == '-' ? 2 : 1) : 0; // See if `option` contains a `=`, save position... auto equals = option.find('='); @@ -632,7 +632,7 @@ namespace SEAMS { return ret_value; } - array *Aprepro::make_array(int r, int c) + array *Aprepro::make_array(size_t r, size_t c) { auto ptr = new array(r, c); array_allocations.push_back(ptr); diff --git a/packages/seacas/libraries/aprepro_lib/apr_array.cc b/packages/seacas/libraries/aprepro_lib/apr_array.cc index b161a3360c9a..3261b06f4846 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_array.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_array.cc @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -59,13 +59,14 @@ namespace SEAMS { } double value = 0.0; - int cols = arr->cols; - int rows = arr->rows; + auto cols = arr->cols; + auto rows = arr->rows; if (row >= 0 && row < rows && col >= 0 && col < cols) { if (row != static_cast(row) || col != static_cast(col)) { value = array_interpolate(arr, row, col); } else { + int irow = row; int icol = col; int offset = irow * cols + icol; @@ -81,7 +82,7 @@ namespace SEAMS { array *array_add(const array *a, const array *b) { auto array_data = aprepro->make_array(a->rows, a->cols); - for (int i = 0; i < a->rows * a->cols; i++) { + for (size_t i = 0; i < a->rows * a->cols; i++) { array_data->data[i] = a->data[i] + b->data[i]; } return array_data; @@ -91,7 +92,7 @@ namespace SEAMS { { auto array_data = aprepro->make_array(a->rows, a->cols); - for (int i = 0; i < a->rows * a->cols; i++) { + for (size_t i = 0; i < a->rows * a->cols; i++) { array_data->data[i] = a->data[i] - b->data[i]; } return array_data; @@ -101,7 +102,7 @@ namespace SEAMS { { auto array_data = aprepro->make_array(a->rows, a->cols); - for (int i = 0; i < a->rows * a->cols; i++) { + for (size_t i = 0; i < a->rows * a->cols; i++) { array_data->data[i] = a->data[i] * s; } @@ -115,10 +116,10 @@ namespace SEAMS { auto array_data = aprepro->make_array(a->rows, b->cols); - for (int i = 0; i < b->cols; i++) { - for (int j = 0; j < a->rows; j++) { + for (size_t i = 0; i < b->cols; i++) { + for (size_t j = 0; j < a->rows; j++) { double sum = 0.0; - for (int k = 0; k < a->cols; k++) { + for (size_t k = 0; k < a->cols; k++) { sum += a->data[j * ac + k] * b->data[k * bc + i]; } array_data->data[j * bc + i] = sum; diff --git a/packages/seacas/libraries/aprepro_lib/apr_builtin.cc b/packages/seacas/libraries/aprepro_lib/apr_builtin.cc index a6af6761c18f..7acaed41e8b0 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_builtin.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_builtin.cc @@ -108,7 +108,7 @@ namespace SEAMS { reset_error(); double temp = (x < 0 ? -std::floor(-(x)) : std::floor(x)); SEAMS::math_error("int"); - return (temp); + return temp; } // DO_NINT: Calculate integer nearest value @@ -117,7 +117,7 @@ namespace SEAMS { reset_error(); double temp = (x < 0 ? -std::floor(0.5 - x) : std::floor(x + 0.5)); SEAMS::math_error("nint"); - return (temp); + return temp; } // DO_DIST: Calculate distance between point 1 at (x1,y1) and @@ -128,7 +128,7 @@ namespace SEAMS { reset_error(); double temp = std::hypot((x1 - x2), (y1 - y2)); SEAMS::math_error("hypot"); - return (temp); + return temp; } // DO_ANGLE: Calculate angle (radians) between vector 1 at (0,0; x1,y1) and @@ -140,7 +140,7 @@ namespace SEAMS { reset_error(); temp = acos(temp); SEAMS::math_error("angle"); - return (temp); + return temp; } // DO_ANGLE: Calculate angle (degrees) between vector 1 at (0,0; x1,y1) and @@ -152,7 +152,7 @@ namespace SEAMS { reset_error(); temp = r2d(acos(temp)); SEAMS::math_error("angled"); - return (temp); + return temp; } // DO_HYPOT: calculate sqrt(p^2 + q^2) @@ -169,7 +169,7 @@ namespace SEAMS { reset_error(); double temp = max(x, y); SEAMS::math_error("max"); - return (temp); + return temp; } double do_min(double x, double y) @@ -177,7 +177,7 @@ namespace SEAMS { reset_error(); double temp = min(x, y); SEAMS::math_error("min"); - return (temp); + return temp; } double do_d2r(double x) { return (d2r(x)); } @@ -189,7 +189,7 @@ namespace SEAMS { reset_error(); double temp = sin(d2r(x)); SEAMS::math_error("sind"); - return (temp); + return temp; } double do_sin(double x) @@ -197,7 +197,7 @@ namespace SEAMS { reset_error(); double temp = sin(x); SEAMS::math_error("sin"); - return (temp); + return temp; } double do_cosd(double x) @@ -205,7 +205,7 @@ namespace SEAMS { reset_error(); double temp = cos(d2r(x)); SEAMS::math_error("cosd"); - return (temp); + return temp; } double do_cos(double x) @@ -213,7 +213,7 @@ namespace SEAMS { reset_error(); double temp = cos(x); SEAMS::math_error("cos"); - return (temp); + return temp; } double do_tand(double x) @@ -221,7 +221,7 @@ namespace SEAMS { reset_error(); double temp = tan(d2r(x)); SEAMS::math_error("tand"); - return (temp); + return temp; } double do_tan(double x) @@ -229,7 +229,7 @@ namespace SEAMS { reset_error(); double temp = tan(x); SEAMS::math_error("tan"); - return (temp); + return temp; } double do_atan2d(double x, double y) @@ -237,7 +237,7 @@ namespace SEAMS { reset_error(); double temp = r2d(atan2(x, y)); SEAMS::math_error("atan2d"); - return (temp); + return temp; } double do_atan2(double x, double y) @@ -245,7 +245,7 @@ namespace SEAMS { reset_error(); double temp = atan2(x, y); SEAMS::math_error("atan2"); - return (temp); + return temp; } double do_atand(double x) @@ -253,7 +253,7 @@ namespace SEAMS { reset_error(); double temp = r2d(atan(x)); SEAMS::math_error("atand"); - return (temp); + return temp; } double do_atan(double x) @@ -261,7 +261,7 @@ namespace SEAMS { reset_error(); double temp = atan(x); SEAMS::math_error("atan"); - return (temp); + return temp; } double do_asind(double x) @@ -269,7 +269,7 @@ namespace SEAMS { reset_error(); double temp = r2d(asin(x)); SEAMS::math_error("asind"); - return (temp); + return temp; } double do_asin(double x) @@ -277,7 +277,7 @@ namespace SEAMS { reset_error(); double temp = asin(x); SEAMS::math_error("asin"); - return (temp); + return temp; } double do_acosd(double x) @@ -285,7 +285,7 @@ namespace SEAMS { reset_error(); double temp = r2d(acos(x)); SEAMS::math_error("acosd"); - return (temp); + return temp; } double do_acos(double x) @@ -293,7 +293,7 @@ namespace SEAMS { reset_error(); double temp = acos(x); SEAMS::math_error("acos"); - return (temp); + return temp; } // do_srand(x) Seed the random generator with the specified integer value @@ -333,7 +333,7 @@ namespace SEAMS { reset_error(); double temp = (y) >= 0 ? fabs(x) : -fabs(x); SEAMS::math_error("sign"); - return (temp); + return temp; } double do_dim(double x, double y) @@ -341,7 +341,7 @@ namespace SEAMS { reset_error(); double temp = x - (min(x, y)); SEAMS::math_error("dim"); - return (temp); + return temp; } double do_fabs(double x) @@ -349,7 +349,7 @@ namespace SEAMS { reset_error(); double temp = fabs(x); SEAMS::math_error("fabs"); - return (temp); + return temp; } double do_ceil(double x) @@ -357,7 +357,7 @@ namespace SEAMS { reset_error(); double temp = ceil(x); SEAMS::math_error("ceil"); - return (temp); + return temp; } double do_cosh(double x) @@ -365,7 +365,7 @@ namespace SEAMS { reset_error(); double temp = cosh(x); SEAMS::math_error("cosh"); - return (temp); + return temp; } double do_exp(double x) @@ -381,7 +381,7 @@ namespace SEAMS { else { reset_error(); } - return (temp); + return temp; } double do_expm1(double x) @@ -389,7 +389,7 @@ namespace SEAMS { reset_error(); double temp = std::expm1(x); SEAMS::math_error("exp"); - return (temp); + return temp; } double do_erf(double x) { return std::erf(x); } @@ -401,7 +401,7 @@ namespace SEAMS { reset_error(); double temp = floor(x); SEAMS::math_error("floor"); - return (temp); + return temp; } double do_fmod(double x, double y) @@ -409,7 +409,7 @@ namespace SEAMS { reset_error(); double temp = fmod(x, y); SEAMS::math_error("fmod"); - return (temp); + return temp; } double do_log(double x) @@ -417,7 +417,7 @@ namespace SEAMS { reset_error(); double temp = std::log(x); SEAMS::math_error("log"); - return (temp); + return temp; } double do_log10(double x) @@ -425,7 +425,7 @@ namespace SEAMS { reset_error(); double temp = std::log10(x); SEAMS::math_error("log10"); - return (temp); + return temp; } double do_sinh(double x) @@ -433,7 +433,7 @@ namespace SEAMS { reset_error(); double temp = sinh(x); SEAMS::math_error("sinh"); - return (temp); + return temp; } double do_sqrt(double x) @@ -444,7 +444,7 @@ namespace SEAMS { if (fetestexcept(FE_INVALID | FE_OVERFLOW | FE_DIVBYZERO) != 0) { SEAMS::math_error("sqrt"); } - return (temp); + return temp; } double do_cbrt(double x) @@ -455,7 +455,7 @@ namespace SEAMS { if (fetestexcept(FE_INVALID | FE_OVERFLOW | FE_DIVBYZERO) != 0) { SEAMS::math_error("sqrt"); } - return (temp); + return temp; } double do_tanh(double x) @@ -463,7 +463,7 @@ namespace SEAMS { reset_error(); double temp = tanh(x); SEAMS::math_error("tanh"); - return (temp); + return temp; } double do_polarX(double rad, double ang) { return (rad * cos(d2r(ang))); } @@ -577,7 +577,7 @@ namespace SEAMS { char *p = string; while (*p != '\0') { if (isupper(static_cast(*p)) != 0) { - *p = tolower(static_cast(*p)); + *p = static_cast(tolower(static_cast(*p))); } p++; } @@ -589,7 +589,7 @@ namespace SEAMS { char *p = string; while (*p != '\0') { if (islower(static_cast(*p)) != 0) { - *p = toupper(static_cast(*p)); + *p = static_cast(toupper(static_cast(*p))); } p++; } @@ -683,6 +683,10 @@ namespace SEAMS { auto &tokens = get_tokenized_strings(string, delm); auto in = static_cast(n); + if (in == 0) { + aprepro->error("Index to get_word must be positive.", false); + return ""; + } if (tokens.size() >= in) { char *word = nullptr; new_string(tokens[in - 1], &word); @@ -830,6 +834,14 @@ namespace SEAMS { return (tmp); } + const char *do_format(double var, char *format) + { + auto tmpstr = std::strlen(format) > 0 ? fmt::sprintf(format, var) : fmt::format("{}", var); + char *tmp; + new_string(tmpstr.c_str(), &tmp); + return tmp; + } + const char *do_execute(char *string) { aprepro->lexer->execute(string); @@ -851,13 +863,13 @@ namespace SEAMS { const char *do_if(double x) { aprepro->inIfdefGetvar = false; - aprepro->lexer->if_handler(x); + aprepro->lexer->if_handler((x != 0.0)); return nullptr; } const char *do_notif(double x) { - aprepro->lexer->if_handler(!x); + aprepro->lexer->if_handler(x == 0.0); return nullptr; } @@ -911,7 +923,7 @@ namespace SEAMS { // does not appear, then return the remainder of the string. If // 'begin' == "", then start at beginning; if 'end' == "", then // return remainder of the string. - char *start = string; + auto *start = string; if (std::strlen(begin) > 0) { start = std::strstr(string, begin); @@ -920,11 +932,11 @@ namespace SEAMS { } } - int len = std::strlen(start); + auto len = std::strlen(start); if (std::strlen(end) > 0) { - char *finish = std::strstr(start, end); + auto *finish = std::strstr(start, end); if (finish != nullptr) { - len = finish - start; + len = static_cast(finish - start); } } @@ -955,17 +967,17 @@ namespace SEAMS { if (my_array_data != nullptr) { std::ostringstream lines; - int rows = my_array_data->rows; - int cols = my_array_data->cols; + auto rows = my_array_data->rows; + auto cols = my_array_data->cols; - int idx = 0; + size_t idx = 0; - for (int ir = 0; ir < rows; ir++) { + for (size_t ir = 0; ir < rows; ir++) { if (ir > 0) { lines << "\n"; } lines << "\t"; - for (int ic = 0; ic < cols; ic++) { + for (size_t ic = 0; ic < cols; ic++) { const SEAMS::symrec *format = aprepro->getsym("_FORMAT"); if (format->value.svar.empty()) { fmt::print(lines, "{}", my_array_data->data[idx++]); @@ -996,15 +1008,15 @@ namespace SEAMS { array *do_make_array(double rows, double cols) { - auto array_data = aprepro->make_array(rows, cols); + auto array_data = aprepro->make_array(static_cast(rows), static_cast(cols)); return array_data; } array *do_make_array_init(double rows, double cols, double init) { - auto array_data = aprepro->make_array(rows, cols); - int isize = (int)rows * int(cols); - for (int i = 0; i < isize; i++) { + auto array_data = aprepro->make_array(static_cast(rows), static_cast(cols)); + auto isize = static_cast(rows) * static_cast(cols); + for (size_t i = 0; i < isize; i++) { array_data->data[i] = init; } return array_data; @@ -1012,10 +1024,10 @@ namespace SEAMS { array *do_identity(double size) { - auto array_data = aprepro->make_array(size, size); + auto array_data = aprepro->make_array(static_cast(size), static_cast(size)); - int isize = size; - for (int i = 0; i < isize; i++) { + size_t isize = static_cast(size); + for (size_t i = 0; i < isize; i++) { array_data->data[i * isize + i] = 1.0; } return array_data; @@ -1025,11 +1037,11 @@ namespace SEAMS { { // Create 1D array with `count` rows and 1 column. // Values are linearly spaced from `init` to `final` - int isize = count; - auto array_data = aprepro->make_array(count, 1); + auto isize = static_cast(count); + auto array_data = aprepro->make_array(isize, 1); double inc = (final - init) / (count - 1); - for (int i = 0; i < isize; i++) { + for (size_t i = 0; i < isize; i++) { array_data->data[i] = init + (double)i * inc; } return array_data; @@ -1039,8 +1051,8 @@ namespace SEAMS { { auto array_data = aprepro->make_array(a->cols, a->rows); - for (int i = 0; i < a->rows; i++) { - for (int j = 0; j < a->cols; j++) { + for (size_t i = 0; i < a->rows; i++) { + for (size_t j = 0; j < a->cols; j++) { array_data->data[j * a->rows + i] = a->data[i * a->cols + j]; } } @@ -1145,8 +1157,8 @@ namespace SEAMS { file->clear(); file->seekg(0); - int idx = 0; - rows = 0; + size_t idx = 0; + rows = 0; while (std::getline(*file, line)) { if (++rows > rows_to_skip) { auto tokens = tokenize(line, delim); @@ -1186,14 +1198,14 @@ namespace SEAMS { } } - auto array_data = aprepro->make_array(rows, cols); + auto array_data = aprepro->make_array(static_cast(rows), static_cast(cols)); // Read file again storing entries in array_data->data file->clear(); file->seekg(0); - int idx = 0; - rows = 0; + size_t idx = 0; + rows = 0; while (std::getline(*file, line)) { if (line[0] != comment[0]) { rows++; @@ -1208,7 +1220,7 @@ namespace SEAMS { } } } - assert((int)rows == array_data->rows); + assert(static_cast(rows) == array_data->rows); delete file; return array_data; } @@ -1220,7 +1232,7 @@ namespace SEAMS { auto tokens = SEAMS::tokenize(string, delm); auto array_data = aprepro->make_array(tokens.size(), 1); - int idx = 0; + size_t idx = 0; for (const auto &token : tokens) { array_data->data[idx++] = std::stod(token); } diff --git a/packages/seacas/libraries/aprepro_lib/apr_builtin.h b/packages/seacas/libraries/aprepro_lib/apr_builtin.h index bf8ee7340b86..91c9ebb20ff6 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_builtin.h +++ b/packages/seacas/libraries/aprepro_lib/apr_builtin.h @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -107,6 +107,7 @@ namespace SEAMS { const char *do_switch(double x); const char *do_case(double x); + const char *do_format(double n, char *form); const char *do_get_word(double n, char *string, char *delm); const char *do_print_array(const array *my_array_data); diff --git a/packages/seacas/libraries/aprepro_lib/apr_getline.cc b/packages/seacas/libraries/aprepro_lib/apr_getline.cc index 3840eee6f4c5..ba6e10d4e4d7 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_getline.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_getline.cc @@ -248,14 +248,14 @@ namespace { void gl_puts(const char *const buf) { if (buf) { - int len = strlen(buf); + auto len = strlen(buf); write(1, buf, len); } } [[noreturn]] void gl_error(const char *const buf) { - int len = strlen(buf); + auto len = strlen(buf); gl_cleanup(); write(2, buf, len); @@ -268,7 +268,7 @@ namespace { if (gl_init_done < 0) { /* -1 only on startup */ const char *cp = (const char *)getenv("COLUMNS"); if (cp != nullptr) { - int w = strtol(cp, nullptr, 10); + auto w = strtoul(cp, nullptr, 10); if (w > 20) SEAMS::gl_setwidth(w); } @@ -295,7 +295,7 @@ namespace { } // namespace namespace SEAMS { - void gl_setwidth(int w) + void gl_setwidth(size_t w) { if (w > 250) { w = 250; @@ -604,9 +604,9 @@ namespace { gl_width = gl_termw - strlen(prompt); } else if (strcmp(prompt, last_prompt) != 0) { - int l1 = strlen(last_prompt); - int l2 = strlen(prompt); - gl_cnt = gl_cnt + l1 - l2; + auto l1 = strlen(last_prompt); + auto l2 = strlen(prompt); + gl_cnt = gl_cnt + l1 - l2; copy_string(last_prompt, prompt, 80); gl_putc('\r'); gl_puts(prompt); @@ -744,11 +744,11 @@ namespace SEAMS { p++; } if (*p) { - int len = strlen(buf); + auto len = strlen(buf); if (strchr(p, '\n')) { /* previously line already has NL stripped */ len--; } - if ((prev == nullptr) || ((int)strlen(prev) != len) || strncmp(prev, buf, (size_t)len) != 0) { + if ((prev == nullptr) || (strlen(prev) != len) || strncmp(prev, buf, len) != 0) { hist_buf[hist_last] = hist_save(buf); prev = hist_buf[hist_last]; hist_last = (hist_last + 1) % HIST_SIZE; @@ -800,7 +800,7 @@ namespace { /* makes a copy of the string */ { char *s = nullptr; - size_t len = strlen(p); + auto len = strlen(p); const char *nl = strpbrk(p, "\n\r"); if (nl) { diff --git a/packages/seacas/libraries/aprepro_lib/apr_getline.h b/packages/seacas/libraries/aprepro_lib/apr_getline.h index 81b394a1c147..d3857e773647 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_getline.h +++ b/packages/seacas/libraries/aprepro_lib/apr_getline.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 1991, 1992, 1993, 2022, 2023 by Chris Thewalt (thewalt@ce.berkeley.edu) + * Copyright (C) 1991, 1992, 1993, 2022, 2023, 2024, 2024 by Chris Thewalt (thewalt@ce.berkeley.edu) * * Permission to use, copy, modify, and distribute this software * for any purpose and without fee is hereby granted, provided @@ -19,6 +19,6 @@ namespace SEAMS { char *getline_int(const char *); /* read a line of input */ - void gl_setwidth(int); /* specify width of screen */ + void gl_setwidth(size_t); /* specify width of screen */ void gl_histadd(const char *); /* adds entries to hist */ } // namespace SEAMS diff --git a/packages/seacas/libraries/aprepro_lib/apr_init.cc b/packages/seacas/libraries/aprepro_lib/apr_init.cc index 62b068689608..da7091dc453f 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_init.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_init.cc @@ -18,11 +18,11 @@ #include // for string namespace SEAMS { - init arith_0_fncts[] = { + const init arith_0_fncts[] = { {"seconds", do_time, "seconds()", "Seconds since epoch (useful for srand())."}, {nullptr, nullptr, nullptr, nullptr}}; - init_d arith_fncts[] = { + const init_d arith_fncts[] = { {"abs", do_fabs, "abs(x)", "Absolute value of x. |x|."}, {"acos", do_acos, "acos(x)", "Inverse cosine of x, returns radians."}, {"acosd", do_acosd, "acosd(x)", "Inverse cosine of x, returns degrees."}, @@ -68,12 +68,12 @@ namespace SEAMS { "Convert temperature x from degrees C to degrees F (100C -> 212F)"}, {nullptr, nullptr, nullptr, nullptr}}; - init_a arith_a_fncts[] = { + const init_a arith_a_fncts[] = { {"rows", do_rows, "rows(array)", "Returns the number of rows in the array. "}, {"cols", do_cols, "cols(array)", "Returns the number of columns in the array. "}, {nullptr, nullptr, nullptr, nullptr}}; - init_dd arith_dd_fncts[] = { + const init_dd arith_dd_fncts[] = { {"atan2", do_atan2, "atan2(y,x)", "Inverse tangent of y/x, returns radians."}, {"atan2d", do_atan2d, "atan2d(y,x)", "Inverse tangent of y/x, returns degrees."}, {"dim", do_dim, "dim(x,y)", "x - min(x,y)"}, @@ -94,7 +94,7 @@ namespace SEAMS { {"sign", do_sign, "sign(x,y)", "x * sgn(y)"}, {nullptr, nullptr, nullptr, nullptr}}; - init_dddd arith_dddd_fncts[] = { + const init_dddd arith_dddd_fncts[] = { {"Vangle", do_angle, "Vangle(x1,y1,x2,y2)", "Angle (radians) between vector x1_i+y1_j and x2_i+y2_j."}, {"Vangled", do_angled, "Vangled(x1,y1,x2,y2)", @@ -102,37 +102,38 @@ namespace SEAMS { {"dist", do_dist, "dist(x1,y1, x2,y2)", "sqrt((x1-x2)^2 + (y1-y2)^2)"}, {nullptr, nullptr, nullptr, nullptr}}; - init_cc arith_cc_fncts[] = {{"word_count", do_word_count, "word_count(svar,del)", - "Number of words in svar. Words are separated by one or more of the " - "characters\n\t\t\tin the " - "string variable 'del'."}, - {nullptr, nullptr, nullptr, nullptr}}; + const init_cc arith_cc_fncts[] = { + {"word_count", do_word_count, "word_count(svar,del)", + "Number of words in svar. Words are separated by one or more of the " + "characters\n\t\t\tin the " + "string variable 'del'."}, + {nullptr, nullptr, nullptr, nullptr}}; - init_ccc arith_ccc_fncts[] = { + const init_ccc arith_ccc_fncts[] = { {"find_word", do_find_word, "find_word(w,s,d)", "Find the 1-based index of word 'w' in variable 's'. Words are separated " "by one or more of the\n\t\t\tcharacters in the " "string variable 'd'. Returns 0 if not found."}, {nullptr, nullptr, nullptr, nullptr}}; - init_c arith_c_fncts[] = {{"strtod", do_strtod, "strtod(svar)", - "Returns a double-precision floating-point number " - "equal to the value represented by the\n\t\t\tcharacter " - "string pointed to by svar."}, - {nullptr, nullptr, nullptr, nullptr}}; + const init_c arith_c_fncts[] = {{"strtod", do_strtod, "strtod(svar)", + "Returns a double-precision floating-point number " + "equal to the value represented by the\n\t\t\tcharacter " + "string pointed to by svar."}, + {nullptr, nullptr, nullptr, nullptr}}; - init_cd arith_cd_fncts[] = {{"option", do_option, "option(?,?)", "Internal"}, - {nullptr, nullptr, nullptr, nullptr}}; + const init_cd arith_cd_fncts[] = {{"option", do_option, "option(?,?)", "Internal"}, + {nullptr, nullptr, nullptr, nullptr}}; - init_ddd arith_ddd_fncts[] = { + const init_ddd arith_ddd_fncts[] = { {"julday", do_julday, "julday(mm, dd, yy)", "Julian day corresponding to mm/dd/yy. "}, {nullptr, nullptr, nullptr, nullptr}}; - init_dddddd arith_dddddd_fncts[] = {{"juldayhms", do_juldayhms, "juldayhms(m,d,y,h,m,s)", - "Julian day corresponding to m/d/y at h:m:s "}, - {nullptr, nullptr, nullptr, nullptr}}; + const init_dddddd arith_dddddd_fncts[] = {{"juldayhms", do_juldayhms, "juldayhms(m,d,y,h,m,s)", + "Julian day corresponding to m/d/y at h:m:s "}, + {nullptr, nullptr, nullptr, nullptr}}; - str_init string_fncts[] = { + const str_init string_fncts[] = { {"DUMP", do_dumpsym, "DUMP()", "Output a list of all user-defined variables and their value."}, {"DUMP_JSON", do_dumpsym_json, "DUMP_JSON()", @@ -154,7 +155,7 @@ namespace SEAMS { "Return the version string (See also _VERSION variable)"}, {nullptr, nullptr, nullptr, nullptr}}; - str_c_init string_c_fncts[] = { + const str_c_init string_c_fncts[] = { {"DUMP", do_dumpsym1, "DUMP(str)", "Output a list of all defined variables and their value if name contains 'str'."}, {"DUMP_FUNC", do_dumpfunc1, "DUMP_FUNC(str)", @@ -230,7 +231,7 @@ namespace SEAMS { #endif {nullptr, nullptr, nullptr, nullptr}}; - str_d_init string_d_fncts[] = { + const str_d_init string_d_fncts[] = { {"IO", do_intout, "IO(x)", "Convert x to an integer and then to a string. "}, {"to_string", do_tostring, "to_string(x)", "Returns a string representation of the numerical variable x. The variable x is unchanged."}, @@ -266,13 +267,18 @@ namespace SEAMS { "Switch statement. A case used in a containing switch statement."}, {nullptr, nullptr, nullptr, nullptr}}; - str_dcc_init string_dcc_fncts[] = { + const str_dc_init string_dc_fncts[] = { + {"format", do_format, "format(variable, output_format)", + "Print `variable` using the format specified in `output_format`"}, + {nullptr, nullptr, nullptr, nullptr}}; + + const str_dcc_init string_dcc_fncts[] = { {"get_word", do_get_word, "get_word(n,svar,del)", "Returns a string containing the nth word of svar. The words are separated by one or more " "\n\t\t\tcharacters in the string variable del "}, {nullptr, nullptr, nullptr, nullptr}}; - str_ccc_init string_ccc_fncts[] = { + const str_ccc_init string_ccc_fncts[] = { {"extract", do_extract, "extract(s, b, e)", "Return substring [b,e). 'b' is included; 'e' is not. If 'b' not found, return empty; If " "'e' not found,\n\t\t\treturn rest of string. If 'b' empty, start at beginning; if 'e' " @@ -284,22 +290,22 @@ namespace SEAMS { #endif {nullptr, nullptr, nullptr, nullptr}}; - str_cc_init string_cc_fncts[] = { + const str_cc_init string_cc_fncts[] = { #if defined(EXODUS_SUPPORT) {"exodus_info", do_exodus_info, "exodus_info(filename, prefix)", "Parses the info records that begin with 'prefix' extracted from the exodus file 'ex_fn'"}, #endif {nullptr, nullptr, nullptr, nullptr}}; - str_a_init string_a_fncts[] = { + const str_a_init string_a_fncts[] = { {"print_array", do_print_array, "print_array(array)", "Prints the data in the array."}, {nullptr, nullptr, nullptr, nullptr}}; - array_c_init array_c_fncts[] = {{"csv_array", do_csv_array1, "csv_array(filename)", - "Create a 2D array from the data in a csv file."}, - {nullptr, nullptr, nullptr, nullptr}}; + const array_c_init array_c_fncts[] = {{"csv_array", do_csv_array1, "csv_array(filename)", + "Create a 2D array from the data in a csv file."}, + {nullptr, nullptr, nullptr, nullptr}}; - array_cd_init array_cd_fncts[] = { + const array_cd_init array_cd_fncts[] = { {"csv_array", do_csv_array, "csv_array(filename, [skip])", "Create a 2D array from the data in a csv file optionally skipping rows." " If skip is integer\n\t\t\tskip that many rows; if skip is a character, skip lines " @@ -307,7 +313,7 @@ namespace SEAMS { "that character"}, {nullptr, nullptr, nullptr, nullptr}}; - array_cc_init array_cc_fncts[] = { + const array_cc_init array_cc_fncts[] = { {"csv_array", do_csv_array2, "csv_array(filename, [skip])", "Create a 2D array from the data in a csv file optionally skipping rows." " If skip is integer skip that many rows; if skip is a character, skip lines beginning with " @@ -323,31 +329,31 @@ namespace SEAMS { "string variable delim. Order is xx, yy, zz, xy, yz, xz."}, {nullptr, nullptr, nullptr, nullptr}}; - array_ddd_init array_ddd_fncts[] = { + const array_ddd_init array_ddd_fncts[] = { {"linear_array", do_linear_array, "linear_array(init, final, count)", "Create a 1D array of 'count' rows. Values linearly spaced from 'init' to 'final'."}, {"make_array", do_make_array_init, "make_array(rows, cols, init=0)", "Create a 2D array of size 'rows' by 'cols' initialized to 'init'. 0 if not specified."}, {nullptr, nullptr, nullptr, nullptr}}; - array_dd_init array_dd_fncts[] = { + const array_dd_init array_dd_fncts[] = { {"make_array", do_make_array, "make_array(rows, cols)", "Create a 2D array of size 'rows' by 'cols' initialized to zero."}, {nullptr, nullptr, nullptr, nullptr}}; - array_d_init array_d_fncts[] = { + const array_d_init array_d_fncts[] = { {"identity", do_identity, "identity(size)", "Create a 2D identity array with 'size' rows and columns. Diagonal = 1.0"}, {nullptr, nullptr, nullptr, nullptr}}; - array_a_init array_a_fncts[] = { + const array_a_init array_a_fncts[] = { {"transpose", do_transpose, "transpose(array)", "Return the transpose of input array"}, {"principal_stress", do_principal, "principal_stress(array)", "Calculate principal stresses of symmetric 3x3 stress tensor (array)."}, {nullptr, nullptr, nullptr, nullptr}}; // clang-format off - var_init variables[] = { + const var_init variables[] = { {"DEG", 57.29577951308232087680}, /* 180/pi, degrees per radian */ {"RAD", 0.01745329251994329576}, /* pi/180, radians per degree */ {"E", 2.71828182845904523536}, /* e, base of natural log */ @@ -363,9 +369,9 @@ namespace SEAMS { }; // clang-format on - svar_init svariables[] = {{"_FORMAT", "%.10g"}, /* Default output format */ - {"_UNITS_SYSTEM", "none"}, - {nullptr, nullptr}}; + const svar_init svariables[] = {{"_FORMAT", "%.10g"}, /* Default output format */ + {"_UNITS_SYSTEM", "none"}, + {nullptr, nullptr}}; /* NOTE: The current comment is stored in "_C_" * Since it can be changed by user on command line, we * initialize is differently than the other string variables. @@ -401,6 +407,7 @@ namespace SEAMS { internal_init_table(string_fncts, strfnct, SYMBOL_TYPE::STRING_FUNCTION); internal_init_table(string_c_fncts, strfnct_c, SYMBOL_TYPE::STRING_FUNCTION); internal_init_table(string_d_fncts, strfnct_d, SYMBOL_TYPE::STRING_FUNCTION); + internal_init_table(string_dc_fncts, strfnct_dc, SYMBOL_TYPE::STRING_FUNCTION); internal_init_table(string_dcc_fncts, strfnct_dcc, SYMBOL_TYPE::STRING_FUNCTION); internal_init_table(string_ccc_fncts, strfnct_ccc, SYMBOL_TYPE::STRING_FUNCTION); internal_init_table(string_cc_fncts, strfnct_cc, SYMBOL_TYPE::STRING_FUNCTION); diff --git a/packages/seacas/libraries/aprepro_lib/apr_parser.cc b/packages/seacas/libraries/aprepro_lib/apr_parser.cc index f9aef0ff570e..eeee0b22805b 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_parser.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_parser.cc @@ -2,7 +2,7 @@ // Skeleton implementation for Bison LALR(1) parsers in C++ -// Copyright (C) 2002-2015, 2018-2021, 2024 Free Software Foundation, Inc. +// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -380,6 +380,7 @@ namespace SEAMS { int yylen = 0; // Error handling. + int yynerrs_ = 0; int yyerrstatus_ = 0; /// The lookahead symbol. @@ -1208,7 +1209,13 @@ namespace SEAMS { &(yylhs.value.string)); } break; - case 109: // sexp: SFNCT LPAR exp COMMA exp RPAR + case 109: // sexp: sexp PLU sexp + { + concat_string((yystack_[2].value.string), (yystack_[0].value.string), + &(yylhs.value.string)); + } break; + + case 110: // sexp: SFNCT LPAR exp COMMA exp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.strfnct_dd == NULL)) @@ -1218,7 +1225,7 @@ namespace SEAMS { (yylhs.value.string) = (char *)""; } break; - case 110: // sexp: SFNCT LPAR exp COMMA sexp COMMA sexp COMMA sexp COMMA sexp RPAR + case 111: // sexp: SFNCT LPAR exp COMMA sexp COMMA sexp COMMA sexp COMMA sexp RPAR { if (arg_check((yystack_[11].value.tptr), (yystack_[11].value.tptr)->value.strfnct_dcccc == NULL)) @@ -1229,7 +1236,7 @@ namespace SEAMS { (yylhs.value.string) = (char *)""; } break; - case 111: // sexp: SFNCT LPAR exp COMMA sexp COMMA sexp RPAR + case 112: // sexp: SFNCT LPAR exp COMMA sexp COMMA sexp RPAR { if (arg_check((yystack_[7].value.tptr), (yystack_[7].value.tptr)->value.strfnct_dcc == NULL)) @@ -1239,7 +1246,17 @@ namespace SEAMS { (yylhs.value.string) = (char *)""; } break; - case 112: // sexp: SFNCT LPAR sexp COMMA sexp COMMA sexp RPAR + case 113: // sexp: SFNCT LPAR exp COMMA sexp RPAR + { + if (arg_check((yystack_[5].value.tptr), + (yystack_[5].value.tptr)->value.strfnct_dc == NULL)) + (yylhs.value.string) = (char *)(*((yystack_[5].value.tptr)->value.strfnct_dc))( + (yystack_[3].value.val), (yystack_[1].value.string)); + else + (yylhs.value.string) = (char *)""; + } break; + + case 114: // sexp: SFNCT LPAR sexp COMMA sexp COMMA sexp RPAR { if (arg_check((yystack_[7].value.tptr), (yystack_[7].value.tptr)->value.strfnct_ccc == NULL)) @@ -1250,7 +1267,7 @@ namespace SEAMS { (yylhs.value.string) = (char *)""; } break; - case 113: // sexp: SFNCT LPAR sexp COMMA sexp RPAR + case 115: // sexp: SFNCT LPAR sexp COMMA sexp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.strfnct_cc == NULL)) @@ -1260,65 +1277,142 @@ namespace SEAMS { (yylhs.value.string) = (char *)""; } break; - case 114: // sexp: bool QUEST sexp COLON sexp + case 116: // sexp: bool QUEST sexp COLON sexp { (yylhs.value.string) = ((yystack_[4].value.val)) ? ((yystack_[2].value.string)) : ((yystack_[0].value.string)); } break; - case 115: // exp: NUM + case 117: // sexp: exp TIM sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Multiplying an arithmetic with a string is not defined"); + yyerrok; + } break; + + case 118: // sexp: sexp TIM exp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Multiplying a string with an arithmetic is not defined"); + yyerrok; + } break; + + case 119: // sexp: sexp TIM sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Multiplying a string with a string is not defined"); + yyerrok; + } break; + + case 120: // sexp: sexp DIV exp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Dividing a string by an arithmetic is not defined"); + yyerrok; + } break; + + case 121: // sexp: exp DIV sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Dividing an arithmetic by a string is not defined"); + yyerrok; + } break; + + case 122: // sexp: sexp DIV sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Dividing a string by a string is not defined"); + yyerrok; + } break; + + case 123: // sexp: exp PLU sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Adding an arithmetic and a string is not defined"); + yyerrok; + } break; + + case 124: // sexp: sexp PLU exp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Adding a string and an arithmetic is not defined"); + yyerrok; + } break; + + case 125: // sexp: exp SUB sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Subtracting an arithmetic and a string is not defined"); + yyerrok; + } break; + + case 126: // sexp: sexp SUB exp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Subtracting a string and an arithmetic is not defined"); + yyerrok; + } break; + + case 127: // sexp: sexp SUB sexp + { + (yylhs.value.string) = (char *)""; + yyerror(aprepro, "Subtracting a string from a string is not defined"); + yyerrok; + } break; + + case 128: // exp: NUM { (yylhs.value.val) = (yystack_[0].value.val); } break; - case 116: // exp: INC NUM + case 129: // exp: INC NUM { (yylhs.value.val) = (yystack_[0].value.val) + 1; } break; - case 117: // exp: DEC NUM + case 130: // exp: DEC NUM { (yylhs.value.val) = (yystack_[0].value.val) - 1; } break; - case 118: // exp: VAR + case 131: // exp: VAR { (yylhs.value.val) = (yystack_[0].value.tptr)->value.var; } break; - case 119: // exp: IMMVAR + case 132: // exp: IMMVAR { (yylhs.value.val) = (yystack_[0].value.tptr)->value.var; } break; - case 120: // exp: INC VAR + case 133: // exp: INC VAR { (yylhs.value.val) = ++((yystack_[0].value.tptr)->value.var); } break; - case 121: // exp: DEC VAR + case 134: // exp: DEC VAR { (yylhs.value.val) = --((yystack_[0].value.tptr)->value.var); } break; - case 122: // exp: VAR INC + case 135: // exp: VAR INC { (yylhs.value.val) = ((yystack_[1].value.tptr)->value.var)++; } break; - case 123: // exp: VAR DEC + case 136: // exp: VAR DEC { (yylhs.value.val) = ((yystack_[1].value.tptr)->value.var)--; } break; - case 124: // exp: VAR EQUAL exp + case 137: // exp: VAR EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); (yystack_[2].value.tptr)->value.var = (yystack_[0].value.val); redefined_warning(aprepro, (yystack_[2].value.tptr)); } break; - case 125: // exp: SVAR EQUAL exp + case 138: // exp: SVAR EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); (yystack_[2].value.tptr)->value.var = (yystack_[0].value.val); @@ -1326,7 +1420,7 @@ namespace SEAMS { set_type(aprepro, (yystack_[2].value.tptr), token::VAR); } break; - case 126: // exp: AVAR EQUAL exp + case 139: // exp: AVAR EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); aprepro.redefine_array((yystack_[2].value.tptr)->value.avar); @@ -1335,31 +1429,31 @@ namespace SEAMS { set_type(aprepro, (yystack_[2].value.tptr), token::VAR); } break; - case 127: // exp: VAR EQ_PLUS exp + case 140: // exp: VAR EQ_PLUS exp { (yystack_[2].value.tptr)->value.var += (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; } break; - case 128: // exp: VAR EQ_MINUS exp + case 141: // exp: VAR EQ_MINUS exp { (yystack_[2].value.tptr)->value.var -= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; } break; - case 129: // exp: VAR EQ_TIME exp + case 142: // exp: VAR EQ_TIME exp { (yystack_[2].value.tptr)->value.var *= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; } break; - case 130: // exp: VAR EQ_DIV exp + case 143: // exp: VAR EQ_DIV exp { (yystack_[2].value.tptr)->value.var /= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; } break; - case 131: // exp: VAR EQ_POW exp + case 144: // exp: VAR EQ_POW exp { reset_error(); (yystack_[2].value.tptr)->value.var = @@ -1368,114 +1462,114 @@ namespace SEAMS { SEAMS::math_error(aprepro, "Power"); } break; - case 132: // exp: INC IMMVAR + case 145: // exp: INC IMMVAR { (yylhs.value.val) = (yystack_[0].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[0].value.tptr)); } break; - case 133: // exp: DEC IMMVAR + case 146: // exp: DEC IMMVAR { (yylhs.value.val) = (yystack_[0].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[0].value.tptr)); } break; - case 134: // exp: IMMVAR INC + case 147: // exp: IMMVAR INC { (yylhs.value.val) = (yystack_[1].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[1].value.tptr)); } break; - case 135: // exp: IMMVAR DEC + case 148: // exp: IMMVAR DEC { (yylhs.value.val) = (yystack_[1].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[1].value.tptr)); } break; - case 136: // exp: IMMVAR EQUAL exp + case 149: // exp: IMMVAR EQUAL exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 137: // exp: IMMSVAR EQUAL exp + case 150: // exp: IMMSVAR EQUAL exp { immutable_modify(aprepro, (yystack_[2].value.tptr)); YYERROR; } break; - case 138: // exp: IMMVAR EQ_PLUS exp + case 151: // exp: IMMVAR EQ_PLUS exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 139: // exp: IMMVAR EQ_MINUS exp + case 152: // exp: IMMVAR EQ_MINUS exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 140: // exp: IMMVAR EQ_TIME exp + case 153: // exp: IMMVAR EQ_TIME exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 141: // exp: IMMVAR EQ_DIV exp + case 154: // exp: IMMVAR EQ_DIV exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 142: // exp: IMMVAR EQ_POW exp + case 155: // exp: IMMVAR EQ_POW exp { (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; immutable_modify(aprepro, (yystack_[2].value.tptr)); } break; - case 143: // exp: UNDVAR + case 156: // exp: UNDVAR { (yylhs.value.val) = (yystack_[0].value.tptr)->value.var; undefined_error(aprepro, (yystack_[0].value.tptr)->name); } break; - case 144: // exp: INC UNDVAR + case 157: // exp: INC UNDVAR { (yylhs.value.val) = ++((yystack_[0].value.tptr)->value.var); set_type(aprepro, (yystack_[0].value.tptr), token::VAR); undefined_error(aprepro, (yystack_[0].value.tptr)->name); } break; - case 145: // exp: DEC UNDVAR + case 158: // exp: DEC UNDVAR { (yylhs.value.val) = --((yystack_[0].value.tptr)->value.var); set_type(aprepro, (yystack_[0].value.tptr), token::VAR); undefined_error(aprepro, (yystack_[0].value.tptr)->name); } break; - case 146: // exp: UNDVAR INC + case 159: // exp: UNDVAR INC { (yylhs.value.val) = ((yystack_[1].value.tptr)->value.var)++; set_type(aprepro, (yystack_[1].value.tptr), token::VAR); undefined_error(aprepro, (yystack_[1].value.tptr)->name); } break; - case 147: // exp: UNDVAR DEC + case 160: // exp: UNDVAR DEC { (yylhs.value.val) = ((yystack_[1].value.tptr)->value.var)--; set_type(aprepro, (yystack_[1].value.tptr), token::VAR); undefined_error(aprepro, (yystack_[1].value.tptr)->name); } break; - case 148: // exp: UNDVAR EQUAL exp + case 161: // exp: UNDVAR EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); (yystack_[2].value.tptr)->value.var = (yystack_[0].value.val); set_type(aprepro, (yystack_[2].value.tptr), token::VAR); } break; - case 149: // exp: UNDVAR EQ_PLUS exp + case 162: // exp: UNDVAR EQ_PLUS exp { (yystack_[2].value.tptr)->value.var += (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; @@ -1483,7 +1577,7 @@ namespace SEAMS { undefined_error(aprepro, (yystack_[2].value.tptr)->name); } break; - case 150: // exp: UNDVAR EQ_MINUS exp + case 163: // exp: UNDVAR EQ_MINUS exp { (yystack_[2].value.tptr)->value.var -= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; @@ -1491,7 +1585,7 @@ namespace SEAMS { undefined_error(aprepro, (yystack_[2].value.tptr)->name); } break; - case 151: // exp: UNDVAR EQ_TIME exp + case 164: // exp: UNDVAR EQ_TIME exp { (yystack_[2].value.tptr)->value.var *= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; @@ -1499,7 +1593,7 @@ namespace SEAMS { undefined_error(aprepro, (yystack_[2].value.tptr)->name); } break; - case 152: // exp: UNDVAR EQ_DIV exp + case 165: // exp: UNDVAR EQ_DIV exp { (yystack_[2].value.tptr)->value.var /= (yystack_[0].value.val); (yylhs.value.val) = (yystack_[2].value.tptr)->value.var; @@ -1507,7 +1601,7 @@ namespace SEAMS { undefined_error(aprepro, (yystack_[2].value.tptr)->name); } break; - case 153: // exp: UNDVAR EQ_POW exp + case 166: // exp: UNDVAR EQ_POW exp { reset_error(); (yystack_[2].value.tptr)->value.var = @@ -1518,7 +1612,7 @@ namespace SEAMS { undefined_error(aprepro, (yystack_[2].value.tptr)->name); } break; - case 154: // exp: FNCT LPAR RPAR + case 167: // exp: FNCT LPAR RPAR { if (arg_check((yystack_[2].value.tptr), (yystack_[2].value.tptr)->value.fnctptr == NULL)) @@ -1527,7 +1621,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 155: // exp: FNCT LPAR exp RPAR + case 168: // exp: FNCT LPAR exp RPAR { if (arg_check((yystack_[3].value.tptr), (yystack_[3].value.tptr)->value.fnctptr_d == NULL)) @@ -1537,7 +1631,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 156: // exp: FNCT LPAR sexp RPAR + case 169: // exp: FNCT LPAR sexp RPAR { if (arg_check((yystack_[3].value.tptr), (yystack_[3].value.tptr)->value.fnctptr_c == NULL)) @@ -1547,7 +1641,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 157: // exp: FNCT LPAR aexp RPAR + case 170: // exp: FNCT LPAR aexp RPAR { if (arg_check((yystack_[3].value.tptr), (yystack_[3].value.tptr)->value.fnctptr_a == NULL)) @@ -1557,7 +1651,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 158: // exp: FNCT LPAR sexp COMMA exp RPAR + case 171: // exp: FNCT LPAR sexp COMMA exp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.fnctptr_cd == NULL)) @@ -1567,7 +1661,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 159: // exp: FNCT LPAR exp COMMA sexp RPAR + case 172: // exp: FNCT LPAR exp COMMA sexp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.fnctptr_dc == NULL)) @@ -1577,7 +1671,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 160: // exp: FNCT LPAR sexp COMMA sexp RPAR + case 173: // exp: FNCT LPAR sexp COMMA sexp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.fnctptr_cc == NULL)) @@ -1587,7 +1681,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 161: // exp: FNCT LPAR sexp COMMA sexp COMMA sexp RPAR + case 174: // exp: FNCT LPAR sexp COMMA sexp COMMA sexp RPAR { if (arg_check((yystack_[7].value.tptr), (yystack_[7].value.tptr)->value.fnctptr_ccc == NULL)) @@ -1598,7 +1692,7 @@ namespace SEAMS { yyerrok; } break; - case 162: // exp: FNCT LPAR exp COMMA exp RPAR + case 175: // exp: FNCT LPAR exp COMMA exp RPAR { if (arg_check((yystack_[5].value.tptr), (yystack_[5].value.tptr)->value.fnctptr_dd == NULL)) @@ -1608,7 +1702,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 163: // exp: FNCT LPAR exp COMMA exp COMMA exp RPAR + case 176: // exp: FNCT LPAR exp COMMA exp COMMA exp RPAR { if (arg_check((yystack_[7].value.tptr), (yystack_[7].value.tptr)->value.fnctptr_ddd == NULL)) @@ -1618,7 +1712,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 164: // exp: FNCT LPAR sexp COMMA sexp COMMA exp RPAR + case 177: // exp: FNCT LPAR sexp COMMA sexp COMMA exp RPAR { if (arg_check((yystack_[7].value.tptr), (yystack_[7].value.tptr)->value.fnctptr_ccd == NULL)) @@ -1628,7 +1722,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 165: // exp: FNCT LPAR exp COMMA exp SEMI exp COMMA exp RPAR + case 178: // exp: FNCT LPAR exp COMMA exp SEMI exp COMMA exp RPAR { if (arg_check((yystack_[9].value.tptr), (yystack_[9].value.tptr)->value.fnctptr_dddd == NULL)) @@ -1639,7 +1733,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 166: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp RPAR + case 179: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp RPAR { if (arg_check((yystack_[9].value.tptr), (yystack_[9].value.tptr)->value.fnctptr_dddd == NULL)) @@ -1650,7 +1744,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 167: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp COMMA sexp RPAR + case 180: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp COMMA sexp RPAR { if (arg_check((yystack_[11].value.tptr), (yystack_[11].value.tptr)->value.fnctptr_ddddc == NULL)) @@ -1661,7 +1755,7 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 168: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp COMMA exp COMMA exp RPAR + case 181: // exp: FNCT LPAR exp COMMA exp COMMA exp COMMA exp COMMA exp COMMA exp RPAR { if (arg_check((yystack_[13].value.tptr), (yystack_[13].value.tptr)->value.fnctptr_dddddd == NULL)) @@ -1672,22 +1766,22 @@ namespace SEAMS { (yylhs.value.val) = 0.0; } break; - case 169: // exp: exp PLU exp + case 182: // exp: exp PLU exp { (yylhs.value.val) = (yystack_[2].value.val) + (yystack_[0].value.val); } break; - case 170: // exp: exp SUB exp + case 183: // exp: exp SUB exp { (yylhs.value.val) = (yystack_[2].value.val) - (yystack_[0].value.val); } break; - case 171: // exp: exp TIM exp + case 184: // exp: exp TIM exp { (yylhs.value.val) = (yystack_[2].value.val) * (yystack_[0].value.val); } break; - case 172: // exp: exp DIV exp + case 185: // exp: exp DIV exp { if ((yystack_[0].value.val) == 0.) { (yylhs.value.val) = std::numeric_limits::infinity(); @@ -1698,9 +1792,9 @@ namespace SEAMS { (yylhs.value.val) = (yystack_[2].value.val) / (yystack_[0].value.val); } break; - case 173: // exp: exp MOD exp + case 186: // exp: exp MOD exp { - if ((yystack_[0].value.val) == 0.) { + if ((int)(yystack_[0].value.val) == 0.) { (yylhs.value.val) = (int)(yystack_[2].value.val); yyerror(aprepro, "Zero divisor"); yyerrok; @@ -1709,29 +1803,29 @@ namespace SEAMS { (yylhs.value.val) = (int)(yystack_[2].value.val) % (int)(yystack_[0].value.val); } break; - case 174: // exp: SUB exp + case 187: // exp: SUB exp { (yylhs.value.val) = -(yystack_[0].value.val); } break; - case 175: // exp: PLU exp + case 188: // exp: PLU exp { (yylhs.value.val) = (yystack_[0].value.val); } break; - case 176: // exp: exp POW exp + case 189: // exp: exp POW exp { reset_error(); (yylhs.value.val) = std::pow((yystack_[2].value.val), (yystack_[0].value.val)); SEAMS::math_error(aprepro, "Power"); } break; - case 177: // exp: LPAR exp RPAR + case 190: // exp: LPAR exp RPAR { (yylhs.value.val) = (yystack_[1].value.val); } break; - case 178: // exp: LBRACK exp RBRACK + case 191: // exp: LBRACK exp RBRACK { reset_error(); (yylhs.value.val) = @@ -1740,30 +1834,30 @@ namespace SEAMS { SEAMS::math_error(aprepro, "floor (int)"); } break; - case 179: // exp: bool + case 192: // exp: bool { (yylhs.value.val) = ((yystack_[0].value.val)) ? 1 : 0; } break; - case 180: // exp: bool QUEST exp COLON exp + case 193: // exp: bool QUEST exp COLON exp { (yylhs.value.val) = ((yystack_[4].value.val)) ? ((yystack_[2].value.val)) : ((yystack_[0].value.val)); } break; - case 181: // exp: AVAR LBRACK exp RBRACK + case 194: // exp: AVAR LBRACK exp RBRACK { (yylhs.value.val) = array_value((yystack_[3].value.tptr)->value.avar, (yystack_[1].value.val), 0); } break; - case 182: // exp: AVAR LBRACK exp COMMA exp RBRACK + case 195: // exp: AVAR LBRACK exp COMMA exp RBRACK { (yylhs.value.val) = array_value((yystack_[5].value.tptr)->value.avar, (yystack_[3].value.val), (yystack_[1].value.val)); } break; - case 183: // exp: AVAR LBRACK exp RBRACK EQUAL exp + case 196: // exp: AVAR LBRACK exp RBRACK EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); array *arr = (yystack_[5].value.tptr)->value.avar; @@ -1787,7 +1881,7 @@ namespace SEAMS { } } break; - case 184: // exp: AVAR LBRACK exp COMMA exp RBRACK EQUAL exp + case 197: // exp: AVAR LBRACK exp COMMA exp RBRACK EQUAL exp { (yylhs.value.val) = (yystack_[0].value.val); array *arr = (yystack_[7].value.tptr)->value.avar; @@ -1834,6 +1928,7 @@ namespace SEAMS { yyerrlab: // If not already recovering from an error, report this error. if (!yyerrstatus_) { + ++yynerrs_; context yyctx(*this, yyla); std::string msg = yysyntax_error_(yyctx); error(YY_MOVE(msg)); @@ -2104,201 +2199,200 @@ namespace SEAMS { return yyres; } - const signed char Parser::yypact_ninf_ = -25; + const signed char Parser::yypact_ninf_ = -32; const signed char Parser::yytable_ninf_ = -1; const short Parser::yypact_[] = { - -25, 22, -25, -13, 224, -25, -25, -25, -25, -25, 1649, -21, -8, 306, -5, - 68, 6, 27, 44, 380, 380, -25, 380, 445, 380, 122, 252, 38, 176, 47, - 1685, 445, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - -25, -25, 445, 380, 380, 380, 380, 380, -25, -25, 445, 380, 380, 380, 380, - 380, 380, -25, -25, 380, 380, 445, 333, 400, 445, 1667, 979, 56, 165, 380, - 160, -24, 1386, 1600, 4, -25, 4, 4, -25, -25, -25, -25, -25, -25, -25, - -25, 380, 460, 505, -25, 445, 445, 380, 445, -25, 520, 565, 580, 625, 640, - 685, 380, -25, 700, 745, 760, 805, 820, 865, 880, 925, 380, 380, 380, 445, - 380, 380, 262, -24, 1735, 1751, 1751, 1751, 1751, 1751, 55, 1782, -25, 1796, 70, - 208, 70, 208, 70, 208, 70, 208, 70, 208, 70, 208, 262, -24, 1735, 1751, - 1751, 1751, 1751, 1751, 262, -24, 1735, -24, 1751, 1751, 1751, 1751, 1751, 1751, -24, - 1751, 1121, 262, -24, 1735, -25, 34, 251, 1151, -25, 120, 276, 1181, 130, 941, - 1211, 380, 380, 380, 380, 4, -25, -25, 380, -25, 1699, 1719, 1667, 55, 1782, - 1667, -25, 1796, 93, 1735, 93, 1767, -25, 1767, 1667, 70, 208, 1667, 70, 208, - 1667, 70, 208, 1667, 70, 208, 1667, 70, 208, 1667, 70, 208, -25, 1751, 1667, - 55, 1782, 1667, -25, 1796, 1667, 70, 208, 1667, 70, 208, 1667, 70, 208, 1667, - 70, 208, 1667, 70, 208, 1667, 70, 208, 110, 110, 4, -25, 4, 4, 4, - 380, 104, -25, 380, -25, 380, -25, -25, 380, -25, 380, -25, -25, 380, -25, - 380, -25, 1751, 1751, 1751, 1751, 4, 380, 380, 1625, 380, 951, 1413, 87, 1092, - 976, 911, 1440, 1012, 1467, 1241, -24, 1751, 121, 1751, 380, -25, -25, -25, 380, - -25, 380, 380, -25, 380, -25, -25, -25, 380, -25, 380, 1034, 1494, 1271, 1330, - 1040, 982, 1521, 1751, -25, -25, 380, -25, 380, -25, 380, -25, -25, 1301, 1548, - 1006, 380, -25, -25, 380, 1062, 1359, 1068, -25, 380, -25, 1575, -25}; + -32, 22, -32, 4, 352, -32, -32, -32, -32, -32, 1865, -21, 20, 178, 28, + 140, 44, 51, 54, 121, 121, -32, 121, 494, 121, 253, 325, 162, 235, 115, + 1901, 494, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + -32, -32, 494, 121, 121, 121, 121, 121, -32, -32, 494, 121, 121, 121, 121, + 121, 121, -32, -32, 121, 121, 494, 421, 479, 494, 1883, 324, 50, 158, 121, + 148, 1932, 1602, 1816, 39, -32, 39, 39, -32, -32, -32, -32, -32, -32, -32, + -32, 121, 539, 554, -32, 494, 494, 121, 494, -32, 599, 614, 659, 674, 719, + 734, 121, 121, 121, 121, 121, -32, 779, 794, 839, 854, 899, 914, 959, 974, + 121, 121, 121, 494, 121, 121, 188, 1932, 1951, 1967, 1967, 1967, 1967, 1967, 55, + 1998, -32, 2012, -31, 263, -31, 263, -31, 263, -31, 263, -31, 263, -31, 263, + 188, 1932, 1951, 1967, 1967, 1967, 1967, 1967, 188, 1932, 1951, 1932, 1967, 1967, 1967, + 1967, 1967, 1967, 1932, 1967, 1337, 188, 1932, 1951, -32, 179, 175, 1367, -32, 225, + 993, 1397, 255, 1021, 1427, 121, 121, 121, 121, 39, -32, -32, 121, -32, 344, + 1918, 1883, 55, 1998, 1883, -32, 2012, -29, 1951, -29, 1983, -32, 1983, 1883, -31, + 263, 1883, -31, 263, 1883, -31, 263, 1883, -31, 263, 1883, -31, 263, 1883, -31, + 263, -27, 99, -27, 99, 25, 39, 25, 39, -32, 1967, 1883, 55, 1998, 1883, + -32, 2012, 1883, -31, 263, 1883, -31, 263, 1883, -31, 263, 1883, -31, 263, 1883, + -31, 263, 1883, -31, 263, -27, 99, -27, 99, 25, 39, -32, 25, 39, 39, + 39, 121, 63, -32, 121, -32, 121, -32, -32, 121, -32, 121, -32, -32, 121, + -32, 121, -32, 1967, 1967, 1967, 1967, 39, 121, 121, 1841, 121, 1049, 1629, 42, + 1308, 1077, 1105, 1656, 1176, 1683, 1457, 1932, 1967, 73, 1967, 121, -32, -32, -32, + 121, -32, 121, 121, -32, 121, -32, -32, -32, -32, 121, -32, 121, 1202, 1710, + 1487, 1546, 1228, 1133, 1737, 1967, -32, -32, 121, -32, 121, -32, 121, -32, -32, + 1517, 1764, 1150, 121, -32, -32, 121, 1254, 1575, 1280, -32, 121, -32, 1791, -32}; const unsigned char Parser::yydefact_[] = { - 2, 0, 1, 0, 0, 4, 3, 9, 115, 95, 143, 118, 96, 119, 97, 76, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 146, 147, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, - 0, 0, 0, 0, 0, 134, 135, 0, 0, 0, 0, 0, 0, 143, 118, 96, 0, 0, 179, - 0, 0, 0, 175, 89, 174, 12, 116, 144, 120, 132, 117, 145, 121, 133, 0, 0, 0, 7, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 98, 148, 149, 150, 151, 152, 153, 32, 26, 33, - 27, 52, 64, 53, 65, 54, 66, 55, 67, 56, 68, 57, 69, 85, 100, 124, 127, 128, 129, - 130, 131, 84, 99, 125, 103, 136, 138, 139, 140, 141, 142, 102, 137, 0, 86, 101, 126, 154, - 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 25, 177, 0, 178, - 0, 0, 30, 19, 21, 31, 20, 22, 88, 0, 90, 92, 94, 91, 58, 34, 46, 59, 35, - 47, 60, 36, 48, 61, 37, 49, 62, 38, 50, 63, 39, 51, 108, 0, 28, 23, 17, 29, - 24, 18, 70, 40, 10, 71, 41, 11, 72, 42, 13, 73, 43, 14, 74, 44, 15, 75, 45, - 16, 169, 170, 172, 93, 171, 173, 176, 0, 181, 157, 0, 156, 0, 155, 107, 0, 104, 0, - 106, 83, 0, 77, 0, 82, 148, 124, 125, 126, 171, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 114, 180, 182, 183, 0, 160, 158, 159, 0, 162, 0, 0, 113, - 0, 109, 79, 78, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 184, 161, 164, 0, 163, - 0, 112, 0, 111, 80, 0, 0, 0, 0, 166, 165, 0, 0, 0, 0, 167, 0, 110, 0, - 168}; - - const signed char Parser::yypgoto_[] = {-25, -25, -25, 39, 126, 98, -4}; - - const unsigned char Parser::yydefgoto_[] = {0, 1, 6, 27, 28, 76, 223}; + 2, 0, 1, 0, 0, 4, 3, 9, 128, 95, 156, 131, 96, 132, 97, 76, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 135, 136, 0, 0, + 0, 0, 0, 0, 0, 147, 148, 0, 0, 0, 0, 0, 0, 156, 131, 96, 0, 0, 192, + 0, 0, 0, 188, 89, 187, 12, 129, 157, 133, 145, 130, 158, 134, 146, 0, 0, 0, 7, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 98, 161, 162, 163, 164, 165, + 166, 32, 26, 33, 27, 52, 64, 53, 65, 54, 66, 55, 67, 56, 68, 57, 69, 85, 100, + 137, 140, 141, 142, 143, 144, 84, 99, 138, 103, 149, 151, 152, 153, 154, 155, 102, 150, 0, + 86, 101, 139, 167, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, + 25, 190, 0, 191, 0, 0, 30, 19, 21, 31, 20, 22, 88, 0, 90, 92, 94, 91, 58, + 34, 46, 59, 35, 47, 60, 36, 48, 61, 37, 49, 62, 38, 50, 63, 39, 51, 109, 124, + 127, 126, 122, 120, 119, 118, 108, 0, 28, 23, 17, 29, 24, 18, 70, 40, 10, 71, 41, + 11, 72, 42, 13, 73, 43, 14, 74, 44, 15, 75, 45, 16, 123, 182, 125, 183, 121, 185, + 93, 117, 184, 186, 189, 0, 194, 170, 0, 169, 0, 168, 107, 0, 104, 0, 106, 83, 0, + 77, 0, 82, 161, 137, 138, 139, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 116, 193, 195, 196, 0, 173, 171, 172, 0, 175, 0, 0, 115, 0, 113, 110, + 79, 78, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 197, 174, 177, 0, 176, 0, 114, + 0, 112, 80, 0, 0, 0, 0, 179, 178, 0, 0, 0, 0, 180, 0, 111, 0, 181}; + + const short Parser::yypgoto_[] = {-32, -32, -32, 30, 231, 130, -4}; + + const unsigned char Parser::yydefgoto_[] = {0, 1, 6, 27, 28, 76, 235}; const short Parser::yytable_[] = { - 30, 47, 48, 49, 50, 51, 52, 7, 100, 101, 102, 103, 104, 105, 55, 77, 78, 64, 79, - 81, 82, 67, 2, 3, 106, 53, 54, 124, 125, 126, 127, 128, 129, 131, 133, 135, 137, 139, - 141, 143, 145, 4, 68, 148, 149, 150, 151, 152, 153, 121, 257, 156, 158, 159, 160, 161, 162, - 163, 75, 69, 165, 166, 169, 173, 177, 180, 91, 99, 92, 93, 185, 5, 95, 96, 97, 98, - 130, 132, 183, 100, 101, 102, 103, 104, 105, 65, 93, 191, 194, 197, 66, 199, 199, 201, 203, - 106, 206, 209, 212, 215, 218, 221, 29, 298, 226, 229, 232, 235, 238, 241, 244, 247, 248, 249, - 250, 252, 253, 254, 106, 100, 101, 102, 103, 104, 105, 83, 280, 84, 85, 123, 86, 193, 196, - 97, 98, 106, 262, 134, 136, 138, 140, 142, 144, 310, 0, 147, 267, 225, 228, 80, 118, 188, - 120, 155, 157, 121, 0, 122, 95, 96, 97, 98, 164, 0, 168, 172, 176, 179, 95, 96, 97, - 98, 0, 146, 0, 0, 186, 272, 273, 274, 275, 154, 65, 0, 276, 0, 0, 184, 91, 190, - 92, 93, 167, 171, 175, 178, 94, 0, 205, 208, 211, 214, 217, 220, 222, 0, 0, 0, 231, - 234, 237, 240, 243, 246, 95, 96, 97, 98, 0, 0, 0, 198, 200, 0, 202, 0, 0, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 19, 0, 20, 0, 0, 21, 251, 116, - 117, 118, 188, 120, 279, 0, 121, 282, 87, 284, 88, 89, 0, 90, 287, 22, 23, 289, 258, - 290, 259, 24, 0, 25, 26, 0, 0, 292, 0, 294, 0, 0, 123, 147, 155, 168, 100, 101, - 102, 103, 104, 105, 0, 263, 312, 264, 0, 0, 313, 0, 314, 0, 106, 95, 96, 97, 98, - 317, 0, 318, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 328, 0, 329, 0, 0, 0, - 0, 106, 0, 0, 336, 56, 57, 58, 59, 60, 61, 0, 341, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 0, 19, 170, 20, 0, 62, 63, 0, 0, 281, 0, 283, 0, 0, - 285, 0, 286, 0, 0, 288, 0, 0, 0, 0, 22, 23, 0, 0, 291, 0, 24, 0, 25, - 26, 0, 0, 8, 9, 70, 71, 72, 13, 14, 73, 16, 17, 311, 0, 19, 0, 20, 0, - 0, 315, 0, 316, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 19, 174, 20, - 22, 74, 0, 0, 0, 330, 24, 0, 25, 26, 0, 335, 0, 0, 337, 0, 0, 0, 0, - 0, 22, 23, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 0, 19, 0, 20, 8, 9, 192, 71, 72, 13, 14, 73, 16, 17, 0, 0, - 19, 0, 20, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 24, 0, 25, 26, 0, - 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 195, 71, 72, - 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 204, 71, 72, 13, 14, 73, 16, - 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, - 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, - 207, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 210, 71, 72, 13, - 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, - 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, - 26, 8, 9, 213, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 216, - 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, - 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, - 24, 0, 25, 26, 8, 9, 219, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, - 8, 9, 224, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, - 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, - 0, 0, 0, 24, 0, 25, 26, 8, 9, 227, 71, 72, 13, 14, 73, 16, 17, 0, 0, - 19, 0, 20, 8, 9, 230, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, - 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, - 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 233, 71, 72, 13, 14, 73, 16, - 17, 0, 0, 19, 0, 20, 8, 9, 236, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, + 30, 47, 48, 49, 50, 51, 52, 106, 107, 108, 109, 97, 98, 108, 109, 77, 78, 110, 79, + 81, 82, 110, 2, 3, 7, 53, 54, 128, 129, 130, 131, 132, 133, 135, 137, 139, 141, 143, + 145, 147, 149, 4, 55, 152, 153, 154, 155, 156, 157, 75, 64, 160, 162, 163, 164, 165, 166, + 167, 314, 67, 169, 170, 173, 177, 181, 184, 68, 134, 136, 69, 189, 5, 187, 110, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 125, 296, 93, 195, 198, 201, 110, 203, 203, 205, 207, + 327, 210, 213, 216, 219, 222, 225, 227, 229, 231, 233, 0, 0, 238, 241, 244, 247, 250, 253, + 256, 259, 261, 263, 265, 268, 269, 270, 197, 200, 8, 9, 70, 71, 72, 13, 14, 73, 16, + 17, 29, 99, 19, 0, 20, 122, 192, 124, 237, 240, 125, 0, 0, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 65, 0, 22, 74, 127, 66, 110, 190, 24, 0, 25, 26, 138, 140, + 142, 144, 146, 148, 65, 91, 151, 92, 93, 188, 288, 289, 290, 291, 159, 161, 0, 292, 274, + 91, 275, 92, 93, 168, 273, 172, 176, 180, 183, 56, 57, 58, 59, 60, 61, 0, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 95, 96, 97, 98, 194, 0, 110, 62, 63, 95, 96, + 97, 98, 209, 212, 215, 218, 221, 224, 226, 228, 230, 232, 234, 278, 0, 0, 243, 246, 249, + 252, 255, 258, 260, 262, 264, 267, 80, 94, 83, 0, 84, 85, 0, 86, 126, 95, 96, 97, + 98, 295, 0, 0, 298, 283, 300, 95, 96, 97, 98, 303, 150, 0, 305, 0, 306, 0, 0, + 0, 158, 0, 0, 0, 308, 0, 310, 95, 96, 97, 98, 171, 175, 179, 182, 120, 121, 122, + 192, 124, 0, 329, 125, 0, 0, 330, 0, 331, 0, 127, 151, 159, 172, 0, 0, 334, 267, + 335, 0, 0, 202, 204, 87, 206, 88, 89, 0, 90, 345, 0, 346, 0, 0, 0, 0, 0, + 0, 0, 353, 0, 186, 48, 49, 50, 51, 52, 358, 0, 266, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 0, 19, 0, 20, 53, 54, 21, 293, 0, 0, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 0, 0, 0, 0, 22, 23, 110, 0, 0, 0, 24, 0, 25, + 26, 0, 0, 0, 0, 297, 0, 299, 0, 0, 301, 0, 302, 0, 0, 304, 0, 0, 0, + 0, 0, 0, 0, 0, 307, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 19, + 174, 20, 0, 0, 328, 0, 0, 0, 0, 0, 0, 332, 0, 333, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 23, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 347, 0, 0, + 0, 0, 0, 352, 0, 0, 354, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, + 19, 178, 20, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0, 19, 0, 20, 0, + 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, + 22, 23, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 196, 71, 72, 13, 14, 73, 16, + 17, 0, 0, 19, 0, 20, 8, 9, 199, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, - 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 239, 71, 72, 13, - 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 242, 71, 72, 13, 14, 73, 16, 17, + 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 208, 71, 72, 13, + 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 211, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, - 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 304, 25, 26, 8, 9, 245, - 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 100, 101, 102, 103, 104, 105, 0, - 0, 0, 0, 0, 0, 268, 0, 269, 0, 106, 0, 0, 0, 22, 74, 295, 0, 296, 0, - 24, 0, 25, 26, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 100, 101, 102, 103, 104, - 105, 106, 302, 0, 303, 0, 0, 0, 325, 0, 326, 106, 0, 182, 48, 49, 50, 51, 52, - 0, 100, 101, 102, 103, 104, 105, 100, 101, 102, 103, 104, 105, 334, 0, 0, 0, 106, 53, - 54, 0, 306, 0, 106, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 100, - 101, 102, 103, 104, 105, 319, 0, 0, 0, 106, 0, 324, 0, 0, 0, 106, 0, 0, 0, - 0, 0, 100, 101, 102, 103, 104, 105, 100, 101, 102, 103, 104, 105, 338, 0, 0, 0, 106, - 0, 340, 0, 0, 0, 106, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 100, 101, - 102, 103, 104, 105, 299, 0, 300, 0, 106, 0, 0, 301, 0, 0, 106, 0, 0, 0, 0, - 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 255, 0, 121, 0, 256, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 188, 120, 0, 260, 121, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 0, 265, 121, - 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 0, 270, 121, 271, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 0, 308, 121, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 0, 321, 121, 322, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 188, 120, 0, 331, 121, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 323, 0, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 188, 120, 339, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 187, 0, 121, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 188, 120, 297, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 305, 0, 121, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, - 120, 307, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 188, 120, 320, 0, 121, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 327, 0, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 188, 120, 333, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 342, 0, 121, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 188, 120, 189, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 188, 120, 293, 0, 121, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 0, 0, 121, 31, - 32, 33, 34, 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, 43, 44, 0, 0, 181, 32, - 33, 34, 35, 36, 45, 46, 37, 38, 39, 40, 41, 42, 43, 44, 107, 0, 0, 0, 0, - 0, 0, 0, 45, 46, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 277, - 0, 121, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, - 278, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 0, 0, 121, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 0, 0, 121, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 188, 120, 0, 0, 121, 108, 109, 110, 111, 112, 113, 114, 115, - 0, 0, 0, 0, 120, 0, 0, 121, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, - 120, 0, 0, 121, 110, 111, 112, 113, 114, 115, 116, 117, 118, 188, 120, 0, 0, 121}; + 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 214, + 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 217, 71, 72, 13, 14, + 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, + 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, + 8, 9, 220, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 223, 71, + 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, + 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, + 0, 25, 26, 8, 9, 236, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 8, + 9, 239, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, 0, 0, 0, + 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, 74, 0, 0, + 0, 0, 24, 0, 25, 26, 8, 9, 242, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, + 0, 20, 8, 9, 245, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, 20, 0, 0, + 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 0, 0, 22, + 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 248, 71, 72, 13, 14, 73, 16, 17, + 0, 0, 19, 0, 20, 8, 9, 251, 71, 72, 13, 14, 73, 16, 17, 0, 0, 19, 0, + 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, + 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 8, 9, 254, 71, 72, 13, 14, + 73, 16, 17, 0, 0, 19, 0, 20, 8, 9, 257, 71, 72, 13, 14, 73, 16, 17, 0, + 0, 19, 0, 20, 0, 0, 0, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, + 279, 0, 280, 0, 0, 22, 74, 0, 0, 0, 0, 24, 0, 25, 26, 0, 0, 0, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 284, 0, 285, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 311, + 0, 312, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 318, 0, 319, 0, 0, 0, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 320, 0, + 321, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 342, 0, 343, 0, 0, 0, 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 351, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 0, 0, 0, + 0, 0, 0, 110, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 323, 0, 0, 0, 0, + 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 336, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 341, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 355, 0, 0, + 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 357, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 315, 0, 316, 0, 0, 0, 110, 317, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 192, 124, 271, 0, 125, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 0, 276, 125, 277, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 0, 281, 125, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, 286, 125, 287, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 0, 325, 125, 326, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 0, + 338, 125, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 0, 348, 125, 349, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 192, 124, 340, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 356, 0, 125, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 192, 124, 191, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 313, 0, 125, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, + 322, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 192, 124, 324, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 337, 0, 125, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 192, 124, 344, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 350, 0, 125, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 192, 124, 359, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 193, 0, 125, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 309, 0, 125, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 192, 124, 0, 0, 125, 31, 32, 33, 34, 35, 36, 0, 0, 37, 38, 39, 40, 41, + 42, 43, 44, 0, 0, 185, 32, 33, 34, 35, 36, 45, 46, 37, 38, 39, 40, 41, 42, + 43, 44, 111, 0, 0, 0, 0, 0, 0, 0, 45, 46, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 0, 0, 125, 294, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 192, 124, 0, 0, 125, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 0, 0, + 0, 0, 0, 0, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 0, + 0, 125, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 192, 124, 0, 0, 125, 112, + 113, 114, 115, 116, 117, 118, 119, 0, 0, 0, 0, 124, 0, 0, 125, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 192, 124, 0, 0, 125, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 192, 124, 0, 0, 125}; const short Parser::yycheck_[] = { - 4, 22, 23, 24, 25, 26, 27, 20, 32, 33, 34, 35, 36, 37, 22, 19, 20, 22, 22, - 23, 24, 15, 0, 1, 48, 46, 47, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 19, 15, 47, 48, 49, 50, 51, 52, 45, 16, 55, 56, 57, 58, 59, 60, - 61, 19, 15, 64, 65, 66, 67, 68, 69, 28, 20, 30, 31, 74, 49, 38, 39, 40, 41, - 37, 38, 22, 32, 33, 34, 35, 36, 37, 17, 31, 91, 92, 93, 22, 95, 96, 97, 98, - 48, 100, 101, 102, 103, 104, 105, 4, 16, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 48, 32, 33, 34, 35, 36, 37, 3, 22, 5, 6, 31, 8, 92, 93, - 40, 41, 48, 16, 39, 40, 41, 42, 43, 44, 22, -1, 47, 16, 108, 109, 23, 40, 41, - 42, 55, 56, 45, -1, 31, 38, 39, 40, 41, 64, -1, 66, 67, 68, 69, 38, 39, 40, - 41, -1, 47, -1, -1, 16, 181, 182, 183, 184, 55, 17, -1, 188, -1, -1, 22, 28, 91, - 30, 31, 66, 67, 68, 69, 20, -1, 100, 101, 102, 103, 104, 105, 106, -1, -1, -1, 110, - 111, 112, 113, 114, 115, 38, 39, 40, 41, -1, -1, -1, 95, 96, -1, 98, -1, -1, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, -1, 17, -1, -1, 20, 119, 38, - 39, 40, 41, 42, 255, -1, 45, 258, 3, 260, 5, 6, -1, 8, 265, 38, 39, 268, 14, - 270, 16, 44, -1, 46, 47, -1, -1, 278, -1, 280, -1, -1, 181, 182, 183, 184, 32, 33, - 34, 35, 36, 37, -1, 14, 295, 16, -1, -1, 299, -1, 301, -1, 48, 38, 39, 40, 41, - 308, -1, 310, -1, 32, 33, 34, 35, 36, 37, -1, -1, -1, 321, -1, 323, -1, -1, -1, - -1, 48, -1, -1, 331, 22, 23, 24, 25, 26, 27, -1, 339, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, -1, 15, 16, 17, -1, 46, 47, -1, -1, 258, -1, 260, -1, -1, - 263, -1, 265, -1, -1, 268, -1, -1, -1, -1, 38, 39, -1, -1, 277, -1, 44, -1, 46, - 47, -1, -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 295, -1, 15, -1, 17, -1, - -1, 302, -1, 304, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, 17, - 38, 39, -1, -1, -1, 325, 44, -1, 46, 47, -1, 331, -1, -1, 334, -1, -1, -1, -1, - -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, - 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, - -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, - 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, - -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, - 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, - -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, - 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, - -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, - -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, - 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, + 4, 22, 23, 24, 25, 26, 27, 38, 39, 40, 41, 40, 41, 40, 41, 19, 20, 48, 22, + 23, 24, 48, 0, 1, 20, 46, 47, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 19, 22, 47, 48, 49, 50, 51, 52, 19, 22, 55, 56, 57, 58, 59, 60, + 61, 16, 15, 64, 65, 66, 67, 68, 69, 15, 37, 38, 15, 74, 49, 22, 48, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 45, 22, 31, 91, 92, 93, 48, 95, 96, 97, 98, + 22, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, -1, -1, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 92, 93, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 4, 20, 15, -1, 17, 40, 41, 42, 112, 113, 45, -1, -1, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 17, -1, 38, 39, 31, 22, 48, 16, 44, -1, 46, 47, 39, 40, + 41, 42, 43, 44, 17, 28, 47, 30, 31, 22, 185, 186, 187, 188, 55, 56, -1, 192, 14, + 28, 16, 30, 31, 64, 16, 66, 67, 68, 69, 22, 23, 24, 25, 26, 27, -1, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 38, 39, 40, 41, 91, -1, 48, 46, 47, 38, 39, + 40, 41, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 16, -1, -1, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 23, 20, 3, -1, 5, 6, -1, 8, 31, 38, 39, 40, + 41, 271, -1, -1, 274, 16, 276, 38, 39, 40, 41, 281, 47, -1, 284, -1, 286, -1, -1, + -1, 55, -1, -1, -1, 294, -1, 296, 38, 39, 40, 41, 66, 67, 68, 69, 38, 39, 40, + 41, 42, -1, 311, 45, -1, -1, 315, -1, 317, -1, 185, 186, 187, 188, -1, -1, 325, 192, + 327, -1, -1, 95, 96, 3, 98, 5, 6, -1, 8, 338, -1, 340, -1, -1, -1, -1, -1, + -1, -1, 348, -1, 22, 23, 24, 25, 26, 27, 356, -1, 123, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, -1, 15, -1, 17, 46, 47, 20, 29, -1, -1, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, -1, -1, -1, -1, 38, 39, 48, -1, -1, -1, 44, -1, 46, + 47, -1, -1, -1, -1, 274, -1, 276, -1, -1, 279, -1, 281, -1, -1, 284, -1, -1, -1, + -1, -1, -1, -1, -1, 293, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, + 16, 17, -1, -1, 311, -1, -1, -1, -1, -1, -1, 318, -1, 320, -1, -1, -1, -1, -1, + -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, 342, -1, -1, + -1, -1, -1, 348, -1, -1, 351, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, + 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, @@ -2306,92 +2400,119 @@ namespace SEAMS { -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, - 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, 14, 46, 47, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 32, 33, 34, 35, 36, 37, -1, - -1, -1, -1, -1, -1, 14, -1, 16, -1, 48, -1, -1, -1, 38, 39, 14, -1, 16, -1, - 44, -1, 46, 47, 32, 33, 34, 35, 36, 37, -1, -1, -1, -1, 32, 33, 34, 35, 36, - 37, 48, 14, -1, 16, -1, -1, -1, 14, -1, 16, 48, -1, 22, 23, 24, 25, 26, 27, - -1, 32, 33, 34, 35, 36, 37, 32, 33, 34, 35, 36, 37, 14, -1, -1, -1, 48, 46, - 47, -1, 16, -1, 48, -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 32, - 33, 34, 35, 36, 37, 16, -1, -1, -1, 48, -1, 16, -1, -1, -1, 48, -1, -1, -1, - -1, -1, 32, 33, 34, 35, 36, 37, 32, 33, 34, 35, 36, 37, 16, -1, -1, -1, 48, - -1, 16, -1, -1, -1, 48, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 32, 33, - 34, 35, 36, 37, 14, -1, 16, -1, 48, -1, -1, 21, -1, -1, 48, -1, -1, -1, -1, - -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 14, -1, 45, -1, 18, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, - 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, + 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, + 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, + -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, + -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, -1, -1, -1, + 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, 39, -1, -1, + -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, 17, -1, -1, + -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, -1, -1, 38, + 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, + 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, + -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, 17, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, 17, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, + 14, -1, 16, -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, -1, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 14, -1, 16, -1, -1, -1, 48, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 14, + -1, 16, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 14, -1, 16, -1, -1, -1, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 14, -1, + 16, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 14, -1, 16, -1, -1, -1, 48, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 14, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -1, -1, -1, + -1, -1, -1, 48, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 16, -1, -1, -1, -1, + -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 16, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 16, -1, -1, -1, -1, -1, 48, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 16, -1, -1, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 16, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 14, -1, 16, -1, -1, -1, 48, 21, + -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 14, -1, 45, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, + 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 14, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 14, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, -1, 14, 45, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 14, -1, 45, -1, -1, + 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 14, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, - 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, + 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 16, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 16, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 18, -1, 45, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 18, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 18, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 18, -1, 45, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 22, - 23, 24, 25, 26, 27, -1, -1, 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, 22, 23, - 24, 25, 26, 27, 46, 47, 30, 31, 32, 33, 34, 35, 36, 37, 20, -1, -1, -1, -1, - -1, -1, -1, 46, 47, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 29, - -1, 45, 32, 33, 34, 35, 36, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 30, 31, 32, 33, 34, 35, 36, 37, - -1, -1, -1, -1, 42, -1, -1, 45, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, -1, -1, 45, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45}; + 40, 41, 42, -1, -1, 45, 22, 23, 24, 25, 26, 27, -1, -1, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 22, 23, 24, 25, 26, 27, 46, 47, 30, 31, 32, 33, 34, 35, + 36, 37, 20, -1, -1, -1, -1, -1, -1, -1, 46, 47, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, -1, -1, 45, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, -1, -1, 45, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, -1, -1, + -1, -1, -1, -1, 48, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, + -1, 45, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 30, + 31, 32, 33, 34, 35, 36, 37, -1, -1, -1, -1, 42, -1, -1, 45, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, 45, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, -1, -1, 45}; const signed char Parser::yystos_[] = { 0, 51, 0, 1, 19, 49, 52, 20, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 20, 38, 39, 44, 46, 47, 53, 54, 55, 56, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 46, 47, 22, 23, 24, 25, 26, 27, 46, 47, 22, 22, 23, 24, 25, 26, 27, 46, 47, 22, 17, 22, 15, 15, 15, 5, 6, 7, 10, 39, 53, 55, 56, 56, 56, 54, 56, 56, 3, 5, 6, 8, 3, 5, 6, 8, 28, - 30, 31, 20, 38, 39, 40, 41, 20, 32, 33, 34, 35, 36, 37, 48, 20, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 45, 54, 55, 56, 56, 56, 56, 56, 56, 53, 56, 53, 56, 55, 56, 55, 56, - 55, 56, 55, 56, 55, 56, 55, 56, 54, 55, 56, 56, 56, 56, 56, 56, 54, 55, 56, 55, 56, 56, 56, - 56, 56, 56, 55, 56, 56, 54, 55, 56, 16, 54, 55, 56, 16, 54, 55, 56, 54, 55, 56, 22, 22, 22, - 22, 56, 16, 16, 41, 18, 55, 56, 5, 53, 56, 5, 53, 56, 54, 56, 54, 56, 54, 56, 5, 55, 56, - 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 55, 56, 5, 53, 56, 5, 53, 56, - 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 56, 56, 56, 54, 56, - 56, 56, 14, 18, 16, 14, 16, 14, 16, 16, 14, 16, 14, 16, 16, 14, 16, 14, 16, 56, 56, 56, 56, - 56, 29, 29, 56, 22, 55, 56, 55, 56, 55, 55, 56, 55, 56, 56, 55, 56, 18, 56, 14, 16, 16, 16, - 14, 16, 21, 14, 16, 14, 16, 16, 16, 14, 16, 22, 55, 56, 56, 56, 55, 55, 56, 56, 16, 16, 14, - 16, 14, 16, 14, 16, 16, 56, 56, 55, 14, 16, 16, 14, 55, 56, 55, 16, 14, 16, 56, 16}; + 30, 31, 20, 38, 39, 40, 41, 20, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 20, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 45, 54, 55, 56, 56, 56, 56, 56, 56, 53, 56, 53, 56, + 55, 56, 55, 56, 55, 56, 55, 56, 55, 56, 55, 56, 54, 55, 56, 56, 56, 56, 56, 56, 54, 55, 56, + 55, 56, 56, 56, 56, 56, 56, 55, 56, 56, 54, 55, 56, 16, 54, 55, 56, 16, 54, 55, 56, 54, 55, + 56, 22, 22, 22, 22, 56, 16, 16, 41, 18, 55, 56, 5, 53, 56, 5, 53, 56, 54, 56, 54, 56, 54, + 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 55, 56, 55, 56, + 55, 56, 55, 56, 55, 56, 5, 53, 56, 5, 53, 56, 5, 55, 56, 5, 55, 56, 5, 55, 56, 5, 55, + 56, 5, 55, 56, 5, 55, 56, 55, 56, 55, 56, 55, 56, 54, 55, 56, 56, 56, 14, 18, 16, 14, 16, + 14, 16, 16, 14, 16, 14, 16, 16, 14, 16, 14, 16, 56, 56, 56, 56, 56, 29, 29, 56, 22, 55, 56, + 55, 56, 55, 55, 56, 55, 56, 56, 55, 56, 18, 56, 14, 16, 16, 16, 14, 16, 21, 14, 16, 14, 16, + 16, 16, 16, 14, 16, 22, 55, 56, 56, 56, 55, 55, 56, 56, 16, 16, 14, 16, 14, 16, 14, 16, 16, + 56, 56, 55, 14, 16, 16, 14, 55, 56, 55, 16, 14, 16, 56, 16}; const signed char Parser::yyr1_[] = { - 0, 50, 51, 51, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}; + 0, 50, 51, 51, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}; const signed char Parser::yyr2_[] = { - 0, 2, 0, 2, 1, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 4, 6, 6, 8, - 6, 4, 4, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, - 3, 6, 12, 8, 8, 6, 5, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 6, 6, 6, 8, - 6, 8, 8, 10, 10, 12, 14, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 1, 5, 4, 6, 6, 8}; + 0, 2, 0, 2, 1, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 4, 6, 6, 8, 6, 4, 4, 3, 3, 3, + 3, 3, 2, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, 3, 3, 6, 12, 8, 6, 8, 6, + 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 6, 6, 6, + 8, 6, 8, 8, 10, 10, 12, 14, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 1, 5, 4, 6, 6, 8}; #if SEAMSDEBUG || 1 // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. @@ -2458,16 +2579,17 @@ namespace SEAMS { #if SEAMSDEBUG const short Parser::yyrline_[] = { - 0, 127, 127, 128, 131, 132, 145, 149, 150, 151, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 181, 182, 183, 184, - 185, 186, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, - 207, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 223, 224, 225, 226, 227, 228, - 230, 231, 237, 243, 249, 255, 261, 267, 273, 277, 281, 284, 286, 294, 296, 304, 305, 306, 307, - 316, 317, 318, 319, 321, 324, 328, 333, 334, 335, 341, 347, 353, 359, 360, 366, 372, 378, 384, - 390, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 403, 406, 411, 412, 413, 414, 415, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 432, 434, 437, 440, 443, 446, 448, 451, 454, - 457, 460, 467, 474, 481, 488, 495, 502, 509, 516, 523, 529, 535, 541, 547, 553, 559, 565, 566, - 567, 568, 576, 584, 585, 586, 589, 590, 593, 594, 595, 596, 597, 619}; + 0, 127, 127, 128, 131, 132, 145, 149, 150, 151, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 181, 182, + 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 195, 196, 197, 198, 199, 200, 202, 203, + 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 223, 224, + 225, 226, 227, 228, 230, 231, 237, 243, 249, 255, 261, 267, 273, 277, 281, 284, 286, 294, + 296, 304, 305, 306, 307, 316, 317, 318, 319, 321, 324, 328, 333, 334, 335, 341, 347, 353, + 359, 360, 361, 367, 373, 379, 385, 391, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 421, 424, 429, 430, 431, 432, + 433, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 450, 452, 455, 458, 461, 464, + 466, 469, 472, 475, 478, 485, 492, 499, 506, 513, 520, 527, 534, 541, 547, 553, 559, 565, + 571, 577, 583, 584, 585, 586, 594, 602, 603, 604, 607, 608, 611, 612, 613, 614, 615, 637}; void Parser::yy_stack_print_() const { diff --git a/packages/seacas/libraries/aprepro_lib/apr_scanner.cc b/packages/seacas/libraries/aprepro_lib/apr_scanner.cc index 07dcb983a6c3..04d064191d7c 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_scanner.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_scanner.cc @@ -178,7 +178,7 @@ typedef unsigned int flex_uint32_t; * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ -#define YY_START (((yy_start)-1) / 2) +#define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ @@ -1020,7 +1020,7 @@ int loop_lvl = 0; std::fstream *tmp_file; const char *temp_f; -#if defined __NVCC__ +#if defined __NVCC__ #pragma diag_suppress code_is_unreachable #endif @@ -1562,10 +1562,7 @@ YY_DECL YY_BREAK case 21: /* rule 21 can match eol */ - YY_RULE_SETUP - { /* Do not increment line count */ - ; - } + YY_RULE_SETUP { /* Do not increment line count */ ; } YY_BREAK case 22: @@ -2131,6 +2128,12 @@ YY_DECL BEGIN(END_CASE_SKIP); else BEGIN(if_state[if_lvl]); + unput('}'); + unput('O'); + unput('H'); + unput('C'); + unput('E'); + unput('{'); return (token::RBRACE); } YY_BREAK @@ -2356,8 +2359,8 @@ YY_DECL default: YY_FATAL_ERROR("fatal flex scanner internal error--no action found"); } /* end of action switch */ - } /* end of scanning one token */ - } /* end of user's declarations */ + } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* %ok-for-header */ diff --git a/packages/seacas/libraries/aprepro_lib/apr_symrec.h b/packages/seacas/libraries/aprepro_lib/apr_symrec.h index 724a825fe63e..700b6c21ab99 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_symrec.h +++ b/packages/seacas/libraries/aprepro_lib/apr_symrec.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-, 20212021, , , National Technology & Engineering Solutions +// Copyright(C) 1999-, 20212021, , , , , , , , National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -16,10 +16,10 @@ namespace SEAMS { struct array { std::vector data{}; - int rows{0}; - int cols{0}; + size_t rows{0}; + size_t cols{0}; - array(int r, int c) : rows(r), cols(c) { data.resize(r * c); } + array(size_t r, size_t c) : rows(r), cols(c) { data.resize(r * c); } }; struct symrec @@ -54,6 +54,7 @@ namespace SEAMS { const char *(*strfnct_dd)(double, double){nullptr}; const char *(*strfnct_cc)(char *, char *){nullptr}; const char *(*strfnct_ccc)(char *, char *, char *){nullptr}; + const char *(*strfnct_dc)(double, char *){nullptr}; const char *(*strfnct_dcc)(double, char *, char *){nullptr}; const char *(*strfnct_dcccc)(double, char *, char *, char *, char *){nullptr}; array *avar{nullptr}; /* Array Variable */ diff --git a/packages/seacas/libraries/aprepro_lib/apr_util.cc b/packages/seacas/libraries/aprepro_lib/apr_util.cc index b934b9395e15..2db4418a7fbd 100644 --- a/packages/seacas/libraries/aprepro_lib/apr_util.cc +++ b/packages/seacas/libraries/aprepro_lib/apr_util.cc @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2021, 2023 National Technology & Engineering Solutions +// Copyright(C) 1999-2021, 2023, 2024 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -40,7 +40,7 @@ namespace { std::vector allocations; - void copy_string(char *dest, const char *source, long int elements) + void copy_string(char *dest, const char *source, size_t elements) { char *d; for (d = dest; d + 1 < dest + elements && *source; d++, source++) { @@ -49,15 +49,15 @@ namespace { *d = '\0'; } - void copy_string(char *dest, const std::string &source, long int elements) + void copy_string(char *dest, const std::string &source, size_t elements) { copy_string(dest, source.c_str(), elements); } void new_string_int(const char *from, char **to) { - int len = strlen(from); - *to = new char[len + 1]; + auto len = strlen(from); + *to = new char[len + 1]; copy_string(*to, from, len + 1); allocations.push_back(*to); } @@ -103,8 +103,8 @@ namespace SEAMS { { std::string tmp{from1}; tmp += from2; - int len = tmp.length(); - *to = new char[len + 1]; + auto len = tmp.length(); + *to = new char[len + 1]; copy_string(*to, tmp, len + 1); allocations.push_back(*to); } @@ -227,7 +227,7 @@ namespace SEAMS { *p = '_'; } else if (isupper(static_cast(*p)) != 0) { - *p = tolower(static_cast(*p)); + *p = static_cast(tolower(static_cast(*p))); } p++; } @@ -245,10 +245,8 @@ namespace SEAMS { bool is_directory(const std::string &filepath) { - struct stat s - { - }; - int ok = stat(filepath.c_str(), &s); + struct stat s{}; + int ok = stat(filepath.c_str(), &s); if (ok == 0) { return S_ISDIR(s.st_mode); } @@ -264,7 +262,7 @@ namespace SEAMS { * L [A-Za-z_] */ - int length = strlen(var); + auto length = strlen(var); if (length == 0) { return false; } @@ -273,7 +271,7 @@ namespace SEAMS { return false; } - for (int i = 1; i < length; i++) { + for (size_t i = 1; i < length; i++) { char c = var[i]; if ((isalnum(c) == 0) && c != ':' && c != '_') { return false; diff --git a/packages/seacas/libraries/aprepro_lib/aprepro.h b/packages/seacas/libraries/aprepro_lib/aprepro.h index ba57ff91fd4a..0017d36a7121 100644 --- a/packages/seacas/libraries/aprepro_lib/aprepro.h +++ b/packages/seacas/libraries/aprepro_lib/aprepro.h @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2023, National Technology & Engineering Solutions +// Copyright(C) 1999-2024, National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -222,7 +222,7 @@ namespace SEAMS { void dumpsym_json() const; void dumpsym(int type, const char *pre, bool doInternal) const; - array *make_array(int r, int c); + array *make_array(size_t r, size_t c); array *make_array(const array &from); void redefine_array(array *data); diff --git a/packages/seacas/libraries/aprepro_lib/aprepro.ll b/packages/seacas/libraries/aprepro_lib/aprepro.ll index a8fa0482c24b..4acbf23cf268 100644 --- a/packages/seacas/libraries/aprepro_lib/aprepro.ll +++ b/packages/seacas/libraries/aprepro_lib/aprepro.ll @@ -1,7 +1,7 @@ -/* -*- Mode: c++ -*- */ +s"}/* -*- Mode: c++ -*- */ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -28,7 +28,7 @@ #include "apr_tokenize.h" #include "fmt/format.h" #include "fmt/ostream.h" - + #define YY_NO_UNISTD_H /* import the parser's token type into a local typedef */ @@ -697,6 +697,12 @@ integer {D}+({E})? BEGIN(END_CASE_SKIP); else BEGIN(if_state[if_lvl]); + unput('}'); + unput('O'); + unput('H'); + unput('C'); + unput('E'); + unput('{'); return(token::RBRACE); } @@ -1081,7 +1087,7 @@ integer {D}+({E})? std::string new_string("}"); auto ins = new std::istringstream(new_string); // Declare an input string stream. yyFlexLexer::yypush_buffer_state(yyFlexLexer::yy_create_buffer(ins, new_string.size())); - + if (aprepro.ap_options.debugging) { std::cerr << "DEBUG IMPORT: " << string << "\n"; } diff --git a/packages/seacas/libraries/aprepro_lib/aprepro.yy b/packages/seacas/libraries/aprepro_lib/aprepro.yy index 4496bc2ff342..1a0c7346feb1 100644 --- a/packages/seacas/libraries/aprepro_lib/aprepro.yy +++ b/packages/seacas/libraries/aprepro_lib/aprepro.yy @@ -357,6 +357,7 @@ sexp: QSTRING { $$ = $1; } $$ = (char*)""; } | sexp CONCAT sexp { concat_string($1, $3, &$$); } + | sexp PLU sexp { concat_string($1, $3, &$$); } | SFNCT LPAR exp COMMA exp RPAR { if (arg_check($1, $1->value.strfnct_dd == NULL)) $$ = (char*)(*($1->value.strfnct_dd))($3, $5); @@ -375,6 +376,12 @@ sexp: QSTRING { $$ = $1; } else $$ = (char*)""; } + | SFNCT LPAR exp COMMA sexp RPAR { + if (arg_check($1, $1->value.strfnct_dc == NULL)) + $$ = (char*)(*($1->value.strfnct_dc))($3, $5); + else + $$ = (char*)""; + } | SFNCT LPAR sexp COMMA sexp COMMA sexp RPAR { if (arg_check($1, $1->value.strfnct_ccc == NULL)) $$ = (char*)(*($1->value.strfnct_ccc))($3, $5, $7); @@ -388,6 +395,17 @@ sexp: QSTRING { $$ = $1; } $$ = (char*)""; } | bool QUEST sexp COLON sexp { $$ = ($1) ? ($3) : ($5); } + | exp TIM sexp { $$ = (char*)""; yyerror(aprepro, "Multiplying an arithmetic with a string is not defined"); yyerrok;} + | sexp TIM exp { $$ = (char*)""; yyerror(aprepro, "Multiplying a string with an arithmetic is not defined"); yyerrok;} + | sexp TIM sexp { $$ = (char*)""; yyerror(aprepro, "Multiplying a string with a string is not defined"); yyerrok;} + | sexp DIV exp { $$ = (char*)""; yyerror(aprepro, "Dividing a string by an arithmetic is not defined"); yyerrok;} + | exp DIV sexp { $$ = (char*)""; yyerror(aprepro, "Dividing an arithmetic by a string is not defined"); yyerrok;} + | sexp DIV sexp { $$ = (char*)""; yyerror(aprepro, "Dividing a string by a string is not defined"); yyerrok;} + | exp PLU sexp { $$ = (char*)""; yyerror(aprepro, "Adding an arithmetic and a string is not defined"); yyerrok;} + | sexp PLU exp { $$ = (char*)""; yyerror(aprepro, "Adding a string and an arithmetic is not defined"); yyerrok;} + | exp SUB sexp { $$ = (char*)""; yyerror(aprepro, "Subtracting an arithmetic and a string is not defined"); yyerrok;} + | sexp SUB exp { $$ = (char*)""; yyerror(aprepro, "Subtracting a string and an arithmetic is not defined"); yyerrok;} + | sexp SUB sexp { $$ = (char*)""; yyerror(aprepro, "Subtracting a string from a string is not defined"); yyerrok;} exp: NUM { $$ = $1; } | INC NUM { $$ = $2 + 1; } @@ -573,7 +591,7 @@ exp: NUM { $$ = $1; } } else $$ = $1 / $3; } - | exp MOD exp { if ($3 == 0.) + | exp MOD exp { if ((int)$3 == 0.) { $$ = (int)$1; yyerror(aprepro, "Zero divisor"); diff --git a/packages/seacas/libraries/aprepro_lib/aprepro_parser.h b/packages/seacas/libraries/aprepro_lib/aprepro_parser.h index 6b926df66b39..1184447f75f4 100644 --- a/packages/seacas/libraries/aprepro_lib/aprepro_parser.h +++ b/packages/seacas/libraries/aprepro_lib/aprepro_parser.h @@ -564,7 +564,7 @@ namespace SEAMS { static const unsigned char yydefact_[]; // YYPGOTO[NTERM-NUM]. - static const signed char yypgoto_[]; + static const short yypgoto_[]; // YYDEFGOTO[NTERM-NUM]. static const unsigned char yydefgoto_[]; @@ -776,7 +776,7 @@ namespace SEAMS { /// Constants. enum { - yylast_ = 1841, ///< Last index in yytable_. + yylast_ = 2057, ///< Last index in yytable_. yynnts_ = 7, ///< Number of nonterminal symbols. yyfinal_ = 2 ///< Termination state number. }; diff --git a/packages/seacas/libraries/aprepro_lib/init_structs.h b/packages/seacas/libraries/aprepro_lib/init_structs.h index fa10e10af6bd..f7015d228c73 100644 --- a/packages/seacas/libraries/aprepro_lib/init_structs.h +++ b/packages/seacas/libraries/aprepro_lib/init_structs.h @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -131,6 +131,14 @@ struct str_a_init const char *description; }; +struct str_dc_init +{ + const char *fname; + const char *(*fnct)(double, char *); + const char *syntax; + const char *description; +}; + struct str_dcc_init { const char *fname; diff --git a/packages/seacas/libraries/aprepro_lib/strings.cc b/packages/seacas/libraries/aprepro_lib/strings.cc index d79ad9a6c21e..4ecb7c5ec3aa 100644 --- a/packages/seacas/libraries/aprepro_lib/strings.cc +++ b/packages/seacas/libraries/aprepro_lib/strings.cc @@ -15,10 +15,10 @@ int main(int, char **) { SEAMS::Aprepro aprepro; - aprepro.ap_options.warning_msg=false; + aprepro.ap_options.warning_msg = false; std::vector strings = build_strings(); - bool result = aprepro.parse_strings(strings, "My list of strings"); + bool result = aprepro.parse_strings(strings, "My list of strings"); if (result) { std::string res_str = aprepro.parsing_results().str(); std::cout << res_str; @@ -26,7 +26,7 @@ int main(int, char **) aprepro.clear_results(); } -std::vector build_strings() +std::vector build_strings() { std::vector strings; @@ -61,7 +61,8 @@ std::vector build_strings() strings.emplace_back(R"({pmin = min(0.5, 1.0)} {nmin = min(-0.5, -1.0)} $ Should be 0.5, -1)"); strings.emplace_back(R"({pmax = max(0.5, 1.0)} {nmax = max(-0.5, -1.0)} $ Should be 1.0, -0.5)"); strings.emplace_back(R"({zero = 0} {sign(0.5, zero) + sign(0.5, -zero)} $ Should be 0 1)"); - strings.emplace_back(R"({nonzero = 1} {sign(0.5, nonzero) + sign(0.5, -nonzero)} $ Should be 1 0)"); + strings.emplace_back( + R"({nonzero = 1} {sign(0.5, nonzero) + sign(0.5, -nonzero)} $ Should be 1 0)"); strings.emplace_back(R"({dim(5.5, 4.5)} {dim(4.5, 5.5)} $ Should be 1 0)"); strings.emplace_back(R"()"); strings.emplace_back(R"({ifyes = 1} {ifno = 0})"); @@ -109,7 +110,8 @@ std::vector build_strings() strings.emplace_back(R"($ Lines a, b, c, d, 1, 4, 6, 7 should be echoed)"); strings.emplace_back(R"($ Check line counting -- should be on line 78: )"); strings.emplace_back(R"( )"); - strings.emplace_back(R"($ ========================================================================)"); + strings.emplace_back( + R"($ ========================================================================)"); strings.emplace_back(R"($ Test string if lines)"); strings.emplace_back(R"({if("Greg")})"); strings.emplace_back(R"( This line should be echoed ("greg"))"); @@ -125,7 +127,8 @@ std::vector build_strings() strings.emplace_back(R"({endif})"); strings.emplace_back(R"()"); strings.emplace_back(R"()"); - strings.emplace_back(R"($ ========================================================================)"); + strings.emplace_back( + R"($ ========================================================================)"); strings.emplace_back(R"($ Test if lines)"); strings.emplace_back(R"({if(sqrt(4) == 2)})"); strings.emplace_back(R"( This line should be echoed. (a))"); @@ -176,7 +179,8 @@ std::vector build_strings() strings.emplace_back(R"( good)"); strings.emplace_back(R"( make sure it is still good)"); strings.emplace_back(R"({endif})"); - strings.emplace_back(R"($ ========================================================================)"); + strings.emplace_back( + R"($ ========================================================================)"); strings.emplace_back(R"($ Test switch)"); strings.emplace_back(R"({switch(PI)})"); strings.emplace_back(R"(This is in a switch, but prior to any case, it should not run)"); @@ -210,16 +214,25 @@ std::vector build_strings() strings.emplace_back(R"()"); strings.emplace_back(R"($ Test looping - print sin, cos from 0 to 90 by 5)"); strings.emplace_back(R"({Loop(19, _angle, 0, 5)})"); - strings.emplace_back(R"({_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} )"); + strings.emplace_back( + R"({_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} )"); strings.emplace_back(R"({EndLoop})"); strings.emplace_back(R"()"); strings.emplace_back(R"($$$$ Test formatting and string concatenation)"); strings.emplace_back(R"({_SAVE = _FORMAT})"); strings.emplace_back(R"({loop(20)})"); - strings.emplace_back(R"({IO(__loop_1+1)} Using the format {_FORMAT = "%." // tostring(__loop_1+1) // "g"}, PI = {PI})"); + strings.emplace_back( + R"({IO(__loop_1+1)} Using the format {_FORMAT = "%." // tostring(__loop_1+1) // "g"}, PI = {PI})"); strings.emplace_back(R"({endloop})"); strings.emplace_back(R"(Reset format to default: {_FORMAT = _SAVE})"); strings.emplace_back(R"()"); + strings.emplace_back( + R"($$$$ Test formatting using the `format` function. _FORMAT is not modified)"); + strings.emplace_back(R"({loop(20)}")"); + strings.emplace_back( + R"({__loop_1+1} Using the format {_f = "%." // tostring(__loop_1+1) // "f"}, PI = {format(PI,_f)})"); + strings.emplace_back(R"({endloop})"); + strings.emplace_back(R"()"); strings.emplace_back(R"($$$$ Test string rescanning and executing)"); strings.emplace_back(R"({ECHO(OFF)})"); strings.emplace_back(R"({Test = ' This is line 1: {a = atan2(0,-1)})"); @@ -278,9 +291,16 @@ std::vector build_strings() strings.emplace_back(R"({list1 ='51,52,53,54,61,62,63,64'})"); strings.emplace_back(R"({list2 ='71,72,73,74,81,82,83,84'})"); strings.emplace_back(R"({loop(8, _i, 1)})"); - strings.emplace_back(R"(Word {_i} of list1 and list2 are {get_word(_i,list1,',')} and {get_word(_i,list2,',')})"); + strings.emplace_back( + R"(Word {_i} of list1 and list2 are {get_word(_i,list1,',')} and {get_word(_i,list2,',')})"); strings.emplace_back(R"({endloop})"); strings.emplace_back(R"()"); + strings.emplace_back(R"($$$$ Test double brace echo off/on)"); + strings.emplace_back(R"(Nothing further on line: {{"not echoed"}})"); + strings.emplace_back( + R"(Noecho followed by non-parsing output: {{"not echoed"}}This should be echoed)"); + strings.emplace_back( + R"(Echo, noecho setting variable, then echo that variable: {e="echo"}+{{d="echo"}}+{d})"); strings.emplace_back(R"($End of test file)"); return strings; diff --git a/packages/seacas/libraries/aprepro_lib/test.inp_app b/packages/seacas/libraries/aprepro_lib/test.inp_app index ec54c83b1f96..6d5d4e7158bd 100644 --- a/packages/seacas/libraries/aprepro_lib/test.inp_app +++ b/packages/seacas/libraries/aprepro_lib/test.inp_app @@ -180,7 +180,7 @@ $ Test int and [] (shortcut for int) $ Test looping - print sin, cos from 0 to 90 by 5 {Loop(19, _angle, 0, 5)} -{_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} +{_angle} {_sa=sind(_angle)} {_ca=cosd(_angle)} {hypot(_sa, _ca)} {EndLoop} $$$$ Test formatting and string concatenation @@ -190,6 +190,11 @@ $$$$ Test formatting and string concatenation {endloop} Reset format to default: {_FORMAT = _SAVE} +$$$$ Test formatting using the `format` function. _FORMAT is not modified +{loop(20)} +{__loop_1+1} Using the format {_f = "%." // tostring(__loop_1+1) // "f"}, PI = {format(PI,_f)} +{endloop} + $$$$ Test string rescanning and executing {ECHO(OFF)} {Test = ' This is line 1: {a = atan2(0,-1)} @@ -200,12 +205,12 @@ $$$$ Test string rescanning and executing Original String: {Test} Rescanned String: -{rescan(Test)} +{rescan(Test)} Original String: {Test2} Print Value of variable T = {T} Rescanned String: -{rescan(Test2)} +{rescan(Test2)} Print Value of variable T = {T} Original String: {t1 = "atan2(0,-1)"} @@ -257,4 +262,8 @@ This should not be echoed {loop(undefined)} This should not be echoed {endloop} +$$$$ Test double brace echo off/on +Nothing further on line: {{"not echoed"}} +Noecho followed by non-parsing output: {{"not echoed"}}This should be echoed +Echo, noecho setting variable, then echo that variable: {e="echo"}+{{d="echo"}}+{d} $End of test file diff --git a/packages/seacas/libraries/aprepro_lib/test_standard.out b/packages/seacas/libraries/aprepro_lib/test_standard.out index 547666f429e2..ea024e83001e 100644 --- a/packages/seacas/libraries/aprepro_lib/test_standard.out +++ b/packages/seacas/libraries/aprepro_lib/test_standard.out @@ -3,7 +3,7 @@ $ Test number representations 1 1 1 1 1 1 1 1 1 1 - + Test assign statements: 5 5 $ Should print 5 5 10 10 $ Should print 10 10 @@ -38,21 +38,21 @@ correct correct $ Test ifdef lines - This line should be echoed. (a) +This line should be echoed. (a) This line should be echoed. (b) - This line should be echoed. (c) - This line should be echoed. (d) +This line should be echoed. (c) +This line should be echoed. (d) $ Test ifdef - else lines - This line should be echoed. (1) - This line should be echoed (4) +This line should be echoed. (1) +This line should be echoed (4) $ Test ifndef - else lines - This line should be echoed (6) - This line should be echoed. (7) +This line should be echoed (6) +This line should be echoed. (7) $ Lines a, b, c, d, 1, 4, 6, 7 should be echoed -$ Check line counting -- should be on line 78: - +$ Check line counting -- should be on line 78: + $ ======================================================================== $ Test string if lines This line should be echoed ("greg") @@ -89,25 +89,25 @@ $ Test int and [] (shortcut for int) 5 -5 $ Test looping - print sin, cos from 0 to 90 by 5 -0 0 1 1 -5 0.08715574275 0.9961946981 1 -10 0.1736481777 0.984807753 1 -15 0.2588190451 0.9659258263 1 -20 0.3420201433 0.9396926208 1 -25 0.4226182617 0.906307787 1 -30 0.5 0.8660254038 1 -35 0.5735764364 0.8191520443 1 -40 0.6427876097 0.7660444431 1 -45 0.7071067812 0.7071067812 1 -50 0.7660444431 0.6427876097 1 -55 0.8191520443 0.5735764364 1 -60 0.8660254038 0.5 1 -65 0.906307787 0.4226182617 1 -70 0.9396926208 0.3420201433 1 -75 0.9659258263 0.2588190451 1 -80 0.984807753 0.1736481777 1 -85 0.9961946981 0.08715574275 1 -90 1 6.123233996e-17 1 +0 0 1 1 +5 0.08715574275 0.9961946981 1 +10 0.1736481777 0.984807753 1 +15 0.2588190451 0.9659258263 1 +20 0.3420201433 0.9396926208 1 +25 0.4226182617 0.906307787 1 +30 0.5 0.8660254038 1 +35 0.5735764364 0.8191520443 1 +40 0.6427876097 0.7660444431 1 +45 0.7071067812 0.7071067812 1 +50 0.7660444431 0.6427876097 1 +55 0.8191520443 0.5735764364 1 +60 0.8660254038 0.5 1 +65 0.906307787 0.4226182617 1 +70 0.9396926208 0.3420201433 1 +75 0.9659258263 0.2588190451 1 +80 0.984807753 0.1736481777 1 +85 0.9961946981 0.08715574275 1 +90 1 6.123233996e-17 1 $$$$ Test formatting and string concatenation %.10g @@ -133,6 +133,28 @@ $$$$ Test formatting and string concatenation 20 Using the format %.20g, PI = 3.141592653589793116 Reset format to default: %.10g +$$$$ Test formatting using the `format` function. _FORMAT is not modified +1 Using the format %.1f, PI = 3.1 +2 Using the format %.2f, PI = 3.14 +3 Using the format %.3f, PI = 3.142 +4 Using the format %.4f, PI = 3.1416 +5 Using the format %.5f, PI = 3.14159 +6 Using the format %.6f, PI = 3.141593 +7 Using the format %.7f, PI = 3.1415927 +8 Using the format %.8f, PI = 3.14159265 +9 Using the format %.9f, PI = 3.141592654 +10 Using the format %.10f, PI = 3.1415926536 +11 Using the format %.11f, PI = 3.14159265359 +12 Using the format %.12f, PI = 3.141592653590 +13 Using the format %.13f, PI = 3.1415926535898 +14 Using the format %.14f, PI = 3.14159265358979 +15 Using the format %.15f, PI = 3.141592653589793 +16 Using the format %.16f, PI = 3.1415926535897931 +17 Using the format %.17f, PI = 3.14159265358979312 +18 Using the format %.18f, PI = 3.141592653589793116 +19 Using the format %.19f, PI = 3.1415926535897931160 +20 Using the format %.20f, PI = 3.14159265358979311600 + $$$$ Test string rescanning and executing Original String: @@ -142,12 +164,12 @@ Original String: Rescanned String: This is line 1: 3.141592654 This is line 2: 0.7071067812 - This is line 3: 0.7071067812 + This is line 3: 0.7071067812 Original String: This has an embedded string: {T = "This is a string"} Print Value of variable T = 0 Rescanned String: -This has an embedded string: This is a string +This has an embedded string: This is a string Print Value of variable T = This is a string Original String: atan2(0,-1) @@ -198,4 +220,8 @@ Word 6 of list1 and list2 are 62 and 82 Word 7 of list1 and list2 are 63 and 83 Word 8 of list1 and list2 are 64 and 84 +$$$$ Test double brace echo off/on +Nothing further on line: +Noecho followed by non-parsing output: This should be echoed +Echo, noecho setting variable, then echo that variable: echo++echo $End of test file diff --git a/packages/seacas/libraries/chaco/util/smalloc.c b/packages/seacas/libraries/chaco/util/smalloc.c index 9a4cca9274a7..e9fd2d172726 100644 --- a/packages/seacas/libraries/chaco/util/smalloc.c +++ b/packages/seacas/libraries/chaco/util/smalloc.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -19,7 +19,7 @@ static struct smalloc_debug_data { int order; /* which smalloc call is it? */ size_t size; /* size of malloc invocation */ - double *ptr; /* memory location returned */ + void *ptr; /* memory location returned */ struct smalloc_debug_data *next; /* pointer to next element */ } *top = NULL; diff --git a/packages/seacas/libraries/exoIIv2for32/CMakeLists.txt b/packages/seacas/libraries/exoIIv2for32/CMakeLists.txt index 0a93d767439f..1652bd6f19e2 100644 --- a/packages/seacas/libraries/exoIIv2for32/CMakeLists.txt +++ b/packages/seacas/libraries/exoIIv2for32/CMakeLists.txt @@ -29,7 +29,7 @@ if (SEACASExodus_ENABLE_STATIC) set_target_properties(exoIIv2for32_static PROPERTIES OUTPUT_NAME exoIIv2for32) # This keeps the library out of the `all_libs` targets... set_target_properties(exoIIv2for32_static PROPERTIES TRIBITS_TESTONLY_LIB TRUE) - INSTALL(TARGETS exoIIv2for32_static DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) + INSTALL(TARGETS exoIIv2for32_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() TRIBITS_ADD_TEST_DIRECTORIES(test) diff --git a/packages/seacas/libraries/exoIIv2for32/test/testrd.dmp b/packages/seacas/libraries/exoIIv2for32/test/testrd.dmp index 72d596dfb534..cdb62ffcb584 100644 --- a/packages/seacas/libraries/exoIIv2for32/test/testrd.dmp +++ b/packages/seacas/libraries/exoIIv2for32/test/testrd.dmp @@ -5,7 +5,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 3 num_nodes = 26 num_elem = 5 @@ -14,7 +14,7 @@ num_node_sets = 2 num_side_sets = 5 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -41,7 +41,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -68,7 +68,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -97,8 +97,8 @@ z coords = 0.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -111,40 +111,40 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad -block name = block_a +element type = quad +block name = block_a num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 11 -element type = quad -block name = block_b +element type = quad +block name = block_b num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 12 -element type = hex -block name = block_c +element type = hex +block name = block_c num_elem_in_block = 1 num_nodes_per_elem = 8 num_attr = 1 after exgelb, error = 0 element block id = 13 -element type = tetra -block name = block_d +element type = tetra +block name = block_d num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 14 -element type = wedge -block name = block_e +element type = wedge +block name = block_e num_elem_in_block = 1 num_nodes_per_elem = 6 num_attr = 1 @@ -209,11 +209,11 @@ connect array for elem block 14 26 after exgnams, error = 0 -element block 1 name: block_a -element block 2 name: block_b -element block 3 name: block_c -element block 4 name: block_d -element block 5 name: block_e +element block 1 name: block_a +element block 2 name: block_b +element block 3 name: block_c +element block 4 name: block_d +element block 5 name: block_e after exgeat, error = 0 @@ -249,7 +249,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -271,7 +271,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -288,8 +288,8 @@ dist factors for node set 21 3.10 after exgnams, error = 0 -node set 1 name: nodeset_a1 -node set 2 name: nodeset_b2 +node set 1 name: nodeset_a1 +node set 2 name: nodeset_b2 There are 3 properties for each node set after exgpn, error = 0 @@ -307,16 +307,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -325,7 +325,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -526,11 +526,11 @@ node list for side set 34 no dist factors for side set 34 after exgnams, error = 0 -side set 1 name: surf_first -side set 2 name: surf_second -side set 3 name: surf_third -side set 4 name: surf_fourth -side set 5 name: surf_fifth +side set 1 name: surf_first +side set 2 name: surf_second +side set 3 name: surf_third +side set 4 name: surf_fourth +side set 5 name: surf_fifth There are 2 properties for each side set after exgpn, error = 0 @@ -555,37 +555,37 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 5 -num_df_per_set = +num_df_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 1 3 5 12 16 -df_ind = +df_ind = 1 5 9 9 9 -elem_list = +elem_list = 2 2 1 @@ -606,7 +606,7 @@ elem_list = 5 5 5 -side_list = +side_list = 4 2 2 @@ -627,7 +627,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -638,41 +638,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwt -07/07/93 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwt +07/07/93 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvan, error = 0 There are 1 global variables; their names are : -glo_vars +glo_vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/exoIIv2for32/test/testrdd.dmp b/packages/seacas/libraries/exoIIv2for32/test/testrdd.dmp index 72d596dfb534..cdb62ffcb584 100644 --- a/packages/seacas/libraries/exoIIv2for32/test/testrdd.dmp +++ b/packages/seacas/libraries/exoIIv2for32/test/testrdd.dmp @@ -5,7 +5,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 3 num_nodes = 26 num_elem = 5 @@ -14,7 +14,7 @@ num_node_sets = 2 num_side_sets = 5 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -41,7 +41,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -68,7 +68,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -97,8 +97,8 @@ z coords = 0.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -111,40 +111,40 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad -block name = block_a +element type = quad +block name = block_a num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 11 -element type = quad -block name = block_b +element type = quad +block name = block_b num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 12 -element type = hex -block name = block_c +element type = hex +block name = block_c num_elem_in_block = 1 num_nodes_per_elem = 8 num_attr = 1 after exgelb, error = 0 element block id = 13 -element type = tetra -block name = block_d +element type = tetra +block name = block_d num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 14 -element type = wedge -block name = block_e +element type = wedge +block name = block_e num_elem_in_block = 1 num_nodes_per_elem = 6 num_attr = 1 @@ -209,11 +209,11 @@ connect array for elem block 14 26 after exgnams, error = 0 -element block 1 name: block_a -element block 2 name: block_b -element block 3 name: block_c -element block 4 name: block_d -element block 5 name: block_e +element block 1 name: block_a +element block 2 name: block_b +element block 3 name: block_c +element block 4 name: block_d +element block 5 name: block_e after exgeat, error = 0 @@ -249,7 +249,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -271,7 +271,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -288,8 +288,8 @@ dist factors for node set 21 3.10 after exgnams, error = 0 -node set 1 name: nodeset_a1 -node set 2 name: nodeset_b2 +node set 1 name: nodeset_a1 +node set 2 name: nodeset_b2 There are 3 properties for each node set after exgpn, error = 0 @@ -307,16 +307,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -325,7 +325,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -526,11 +526,11 @@ node list for side set 34 no dist factors for side set 34 after exgnams, error = 0 -side set 1 name: surf_first -side set 2 name: surf_second -side set 3 name: surf_third -side set 4 name: surf_fourth -side set 5 name: surf_fifth +side set 1 name: surf_first +side set 2 name: surf_second +side set 3 name: surf_third +side set 4 name: surf_fourth +side set 5 name: surf_fifth There are 2 properties for each side set after exgpn, error = 0 @@ -555,37 +555,37 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 5 -num_df_per_set = +num_df_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 1 3 5 12 16 -df_ind = +df_ind = 1 5 9 9 9 -elem_list = +elem_list = 2 2 1 @@ -606,7 +606,7 @@ elem_list = 5 5 5 -side_list = +side_list = 4 2 2 @@ -627,7 +627,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -638,41 +638,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwt -07/07/93 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwt +07/07/93 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvan, error = 0 There are 1 global variables; their names are : -glo_vars +glo_vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/exoIIv2for32/test/testrddi64.dmp b/packages/seacas/libraries/exoIIv2for32/test/testrddi64.dmp index 1f99f1f0ba2a..9d1e72b94dfc 100644 --- a/packages/seacas/libraries/exoIIv2for32/test/testrddi64.dmp +++ b/packages/seacas/libraries/exoIIv2for32/test/testrddi64.dmp @@ -5,7 +5,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 3 num_nodes = 26 num_elem = 5 @@ -14,7 +14,7 @@ num_node_sets = 2 num_side_sets = 5 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -41,7 +41,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -68,7 +68,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -97,8 +97,8 @@ z coords = 0.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -111,40 +111,40 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad -block name = block_a +element type = quad +block name = block_a num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 11 -element type = quad -block name = block_b +element type = quad +block name = block_b num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 12 -element type = hex -block name = block_c +element type = hex +block name = block_c num_elem_in_block = 1 num_nodes_per_elem = 8 num_attr = 1 after exgelb, error = 0 element block id = 13 -element type = tetra -block name = block_d +element type = tetra +block name = block_d num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 14 -element type = wedge -block name = block_e +element type = wedge +block name = block_e num_elem_in_block = 1 num_nodes_per_elem = 6 num_attr = 1 @@ -209,11 +209,11 @@ connect array for elem block 14 26 after exgnams, error = 0 -element block 1 name: block_a -element block 2 name: block_b -element block 3 name: block_c -element block 4 name: block_d -element block 5 name: block_e +element block 1 name: block_a +element block 2 name: block_b +element block 3 name: block_c +element block 4 name: block_d +element block 5 name: block_e after exgeat, error = 0 @@ -249,7 +249,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -271,7 +271,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -288,8 +288,8 @@ dist factors for node set 21 3.10 after exgnams, error = 0 -node set 1 name: nodeset_a1 -node set 2 name: nodeset_b2 +node set 1 name: nodeset_a1 +node set 2 name: nodeset_b2 There are 3 properties for each node set after exgpn, error = 0 @@ -307,16 +307,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -325,7 +325,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -526,11 +526,11 @@ node list for side set 34 no dist factors for side set 34 after exgnams, error = 0 -side set 1 name: surf_first -side set 2 name: surf_second -side set 3 name: surf_third -side set 4 name: surf_fourth -side set 5 name: surf_fifth +side set 1 name: surf_first +side set 2 name: surf_second +side set 3 name: surf_third +side set 4 name: surf_fourth +side set 5 name: surf_fifth There are 2 properties for each side set after exgpn, error = 0 @@ -555,37 +555,37 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 5 -num_df_per_set = +num_df_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 1 3 5 12 16 -df_ind = +df_ind = 1 5 9 9 9 -elem_list = +elem_list = 2 2 1 @@ -606,7 +606,7 @@ elem_list = 5 5 5 -side_list = +side_list = 4 2 2 @@ -627,7 +627,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -638,41 +638,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwt -07/07/93 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwt +07/07/93 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvan, error = 0 There are 1 global variables; their names are : -glo_vars +glo_vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/exodus/CMakeLists.txt b/packages/seacas/libraries/exodus/CMakeLists.txt index d2be5f9fa810..f9d7a2d500b6 100644 --- a/packages/seacas/libraries/exodus/CMakeLists.txt +++ b/packages/seacas/libraries/exodus/CMakeLists.txt @@ -50,7 +50,7 @@ if (SEACASExodus_ENABLE_SHARED) # This keeps the library out of the `all_libs` targets... set_target_properties(exodus_shared PROPERTIES TRIBITS_TESTONLY_LIB TRUE) set_target_properties(exodus_shared PROPERTIES OUTPUT_NAME exodus) - INSTALL(TARGETS exodus_shared DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) + INSTALL(TARGETS exodus_shared DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() endif() @@ -68,11 +68,11 @@ if (SEACASExodus_ENABLE_STATIC) # This keeps the library out of the `all_libs` targets... set_target_properties(exodus_static PROPERTIES TRIBITS_TESTONLY_LIB TRUE) set_target_properties(exodus_static PROPERTIES OUTPUT_NAME exodus) - INSTALL(TARGETS exodus_static DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) + INSTALL(TARGETS exodus_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) # For backwards compatibility, the C exodus library was called libexoIIv2c.a # Create a symbolic link from libexodus.a to libexoIIv2c.a -- do only for static lib - InstallSymLink(libexodus.a ${CMAKE_INSTALL_PREFIX}/lib/libexoIIv2c.a) + InstallSymLink(libexodus.a ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libexoIIv2c.a) endif() if (${CMAKE_PROJECT_NAME} STREQUAL "Seacas") diff --git a/packages/seacas/libraries/exodus/include/exodusII.h b/packages/seacas/libraries/exodus/include/exodusII.h index 8c978d67aa2a..600383c79047 100644 --- a/packages/seacas/libraries/exodus/include/exodusII.h +++ b/packages/seacas/libraries/exodus/include/exodusII.h @@ -55,12 +55,12 @@ #endif /* EXODUS version number */ -#define EXODUS_VERSION "9.01" +#define EXODUS_VERSION "9.04" #define EXODUS_VERSION_MAJOR 9 -#define EXODUS_VERSION_MINOR 1 -#define EXODUS_RELEASE_DATE "July 17, 2024" +#define EXODUS_VERSION_MINOR 4 +#define EXODUS_RELEASE_DATE "November 5, 2024" -#define EX_API_VERS 9.01f +#define EX_API_VERS 9.04f #define EX_API_VERS_NODOT (100 * EXODUS_VERSION_MAJOR + EXODUS_VERSION_MINOR) #define EX_VERS EX_API_VERS @@ -215,6 +215,7 @@ enum ex_inquiry { EX_INQ_NUM_ELEM_SET_VAR = 69, /**< number of element set variables */ EX_INQ_NUM_SIDE_SET_VAR = 70, /**< number of sideset variables */ EX_INQ_NUM_GLOBAL_VAR = 71, /**< number of global variables */ + EX_INQ_FILE_FORMAT = 72, /**< netCDF file format */ EX_INQ_INVALID = -1 }; @@ -242,9 +243,11 @@ NetCDF-4.?.? and later enum ex_option_type { EX_OPT_MAX_NAME_LENGTH = 1, /**< Maximum length of names that will be returned/passed via api call. */ - EX_OPT_COMPRESSION_TYPE, /**< Not currently used; default is gzip */ - EX_OPT_COMPRESSION_LEVEL, /**< In the range [0..9]. A value of 0 indicates no compression */ + EX_OPT_COMPRESSION_TYPE, /**< Default is gzip */ + EX_OPT_COMPRESSION_LEVEL, /**< Range depends on compression type. */ EX_OPT_COMPRESSION_SHUFFLE, /**< 1 if enabled, 0 if disabled */ + EX_OPT_QUANTIZE_NSD, /**< if > 0, Number of significant digits to retain in lossy quantize + compression */ EX_OPT_INTEGER_SIZE_API, /**< 4 or 8 indicating byte size of integers used in api functions. */ EX_OPT_INTEGER_SIZE_DB, /**< Query only, returns 4 or 8 indicating byte size of integers stored on the database. */ @@ -255,6 +258,8 @@ enum ex_compression_type { EX_COMPRESS_ZLIB = 1, /**< Use ZLIB-based compression (if available) */ EX_COMPRESS_GZIP = 1, /**< Same as ZLIB, but typical alias used */ EX_COMPRESS_SZIP, /**< Use SZIP-based compression (if available) */ + EX_COMPRESS_ZSTD, /**< Use ZStandard compression (if available) */ + EX_COMPRESS_BZ2, /**< Use BZ2 / Bzip2 compression (if available) */ }; typedef enum ex_compression_type ex_compression_type; /** @}*/ @@ -341,13 +346,13 @@ typedef struct ex_basis /* clang-format off * - * subc_dim: dimension of the subcell associated with the specified DoF ordinal + * subc_dim: dimension of the subcell associated with the specified DoF ordinal * -- 0 node, 1 edge, 2 face, 3 volume [Range: 0..3] * subc_ordinal: ordinal of the subcell relative to its parent cell - * -- 0..n for each ordinal with the same subc dim [Range: <= DoF ordinal] - * subc_dof_ordinal: ordinal of the DoF relative to the subcell - * subc_num_dof: cardinality of the DoF set associated with this subcell. - * xi, eta, mu (Ο, η, ζ): Parametric coordinate location of the DoF + * -- 0..n for each ordinal with the same subc dim [Range: <= DoF ordinal] + * subc_dof_ordinal: ordinal of the DoF relative to the subcell + * subc_num_dof: cardinality of the DoF set associated with this subcell. + * xi, eta, mu (Ο, η, ζ): Parametric coordinate location of the DoF * -- (Only first ndim values are valid) * clang-format on @@ -1955,8 +1960,9 @@ enum ex_error_return_code { EX_LASTERR = -1003, /**< in ex_err, use existing err_num value */ EX_NULLENTITY = -1006, /**< null entity found */ EX_NOENTITY = -1007, /**< no entities of that type on database */ - EX_INTSIZEMISMATCH = -1008, /**< integer sizes do not match on input/output databases in ex_copy */ EX_NOTFOUND = -1008, /**< could not find requested variable on database */ + EX_INTSIZEMISMATCH = + -1009, /**< integer sizes do not match on input/output databases in ex_copy */ EX_FATAL = -1, /**< fatal error flag def */ EX_NOERR = 0, /**< no error flag def */ diff --git a/packages/seacas/libraries/exodus/include/exodusII_int.h b/packages/seacas/libraries/exodus/include/exodusII_int.h index e8bb5aca4ebc..e1fbb3432597 100644 --- a/packages/seacas/libraries/exodus/include/exodusII_int.h +++ b/packages/seacas/libraries/exodus/include/exodusII_int.h @@ -26,6 +26,18 @@ #include "netcdf_meta.h" #endif +#if NC_HAS_ZSTD == 1 || NC_HAS_BZ2 +#include "netcdf_filter.h" +#endif + +#if !defined NC_FillValue +#if defined _FillValue +#define NC_FillValue _FillValue +#else +#define NC_FillValue "_FillValue" +#endif +#endif + #if defined(_WIN32) && defined(_MSC_VER) && _MSC_VER < 1900 #define PRId64 "I64d" #else @@ -685,19 +697,22 @@ typedef enum exi_element_type exi_element_type; struct exi_file_item { - int file_id; - nc_type netcdf_type_code; /**< NC_FLOAT or NC_DOUBLE */ - int int64_status; - int maximum_name_length; - int time_varid; /* Store to avoid lookup each timestep */ + int file_id; + nc_type netcdf_type_code; + int int64_status; + int maximum_name_length; + int time_varid; /* Store to avoid lookup each timestep */ + int compression_level; /**< 0 (disabled) to 9 (maximum) compression level for + gzip, 4..32 and even for szip; -131072..22 for zstd, NetCDF-4 only */ unsigned int assembly_count; unsigned int blob_count; - unsigned int compression_level; /**< 0 (disabled) to 9 (maximum) compression level for - gzip, 4..32 and even for szip; NetCDF-4 only */ + unsigned int persist_define_mode : 10; /**< Stay in define mode until exi_persist_leavedef is called. Set by exi_persist_redef... */ unsigned int compression_algorithm : 4; /**< GZIP/ZLIB, SZIP, more may be supported by NetCDF soon */ + unsigned int quantize_nsd : 4; /**< 0 (disabled) to 15 (maximum) number of significant digits + retained for lossy quanitzation compression */ unsigned int shuffle : 1; /**< 1 true, 0 false */ unsigned int user_compute_wordsize : 1; /**< 0 for 4 byte or 1 for 8 byte reals */ unsigned int diff --git a/packages/seacas/libraries/exodus/src/deprecated/ex_get_var_param.c b/packages/seacas/libraries/exodus/src/deprecated/ex_get_var_param.c index e53efc947f19..43f5e8e6bd73 100644 --- a/packages/seacas/libraries/exodus/src/deprecated/ex_get_var_param.c +++ b/packages/seacas/libraries/exodus/src/deprecated/ex_get_var_param.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -36,5 +36,5 @@ int ex_get_var_param(int exoid, const char *var_type, int *num_vars) { ex_entity_type obj_type; obj_type = ex_var_type_to_ex_entity_type(*var_type); - return (ex_get_variable_param(exoid, obj_type, num_vars)); + return ex_get_variable_param(exoid, obj_type, num_vars); } diff --git a/packages/seacas/libraries/exodus/src/deprecated/ex_put_var_param.c b/packages/seacas/libraries/exodus/src/deprecated/ex_put_var_param.c index d503fc9f4a90..a942db88c287 100644 --- a/packages/seacas/libraries/exodus/src/deprecated/ex_put_var_param.c +++ b/packages/seacas/libraries/exodus/src/deprecated/ex_put_var_param.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -39,5 +39,5 @@ int ex_put_var_param(int exoid, const char *var_type, int num_vars) { ex_entity_type obj_type; obj_type = ex_var_type_to_ex_entity_type(*var_type); - return (ex_put_variable_param(exoid, obj_type, num_vars)); + return ex_put_variable_param(exoid, obj_type, num_vars); } diff --git a/packages/seacas/libraries/exodus/src/ex__put_homogenous_block_params.c b/packages/seacas/libraries/exodus/src/ex__put_homogenous_block_params.c index 0e16d4a9e0f8..7fad13f25826 100644 --- a/packages/seacas/libraries/exodus/src/ex__put_homogenous_block_params.c +++ b/packages/seacas/libraries/exodus/src/ex__put_homogenous_block_params.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -47,7 +47,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct "ERROR: Bad block type (%d) specified for all blocks file id %d", blocks[0].type, exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); - return (EX_FATAL); + return EX_FATAL; } { /* Output ids for this block */ @@ -58,7 +58,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct "array in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (EX_FATAL); + return EX_FATAL; } for (size_t i = 0; i < block_count; i++) { @@ -70,7 +70,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct ex_name_of_object(blocks[0].type), exoid); ex_err_fn(exoid, __func__, errmsg, status); free(ids); - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_put_var_longlong(exoid, varid, ids)) != NC_NOERR) { @@ -78,7 +78,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct ex_name_of_object(blocks[0].type), exoid); ex_err_fn(exoid, __func__, errmsg, status); free(ids); - return (EX_FATAL); + return EX_FATAL; } free(ids); } @@ -91,7 +91,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct "array in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (EX_FATAL); + return EX_FATAL; } for (size_t i = 0; i < block_count; i++) { @@ -103,7 +103,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct ex_name_of_object(blocks[0].type), exoid); ex_err_fn(exoid, __func__, errmsg, status); free(stat); - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_put_var_int(exoid, varid, stat)) != NC_NOERR) { @@ -111,7 +111,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct ex_name_of_object(blocks[0].type), exoid); ex_err_fn(exoid, __func__, errmsg, status); free(stat); - return (EX_FATAL); + return EX_FATAL; } free(stat); } @@ -121,7 +121,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct if ((status = exi_redef(exoid, __func__)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to place file id %d into define mode", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* inquire previously defined dimensions */ @@ -348,7 +348,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct if ((status = exi_leavedef(exoid, __func__)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to exit define mode in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* ======================================================================== */ @@ -357,7 +357,7 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct case EX_EDGE_BLOCK: vblkids = VAR_ID_ED_BLK; break; case EX_FACE_BLOCK: vblkids = VAR_ID_FA_BLK; break; case EX_ELEM_BLOCK: vblkids = VAR_ID_EL_BLK; break; - default: return (EX_FATAL); /* should have been handled earlier; quiet compiler here */ + default: return EX_FATAL; /* should have been handled earlier; quiet compiler here */ } int att_name_varid = -1; @@ -375,17 +375,17 @@ int exi_put_homogenous_block_params(int exoid, size_t block_count, const struct start[1] = 0; count[1] = strlen(text) + 1; - for (size_t j = 0; j < blocks[i].num_attribute; j++) { + for (int64_t j = 0; j < blocks[i].num_attribute; j++) { start[0] = j; nc_put_vara_text(exoid, att_name_varid, start, count, text); } } } - return (EX_NOERR); + return EX_NOERR; /* Fatal error: exit definition mode and return */ error_ret: exi_leavedef(exoid, __func__); - return (EX_FATAL); + return EX_FATAL; } diff --git a/packages/seacas/libraries/exodus/src/ex__put_nodal_var_multi_time.c b/packages/seacas/libraries/exodus/src/ex__put_nodal_var_multi_time.c index 5f7afbf35c99..c2d25009542b 100644 --- a/packages/seacas/libraries/exodus/src/ex__put_nodal_var_multi_time.c +++ b/packages/seacas/libraries/exodus/src/ex__put_nodal_var_multi_time.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -88,7 +88,7 @@ int exi_put_nodal_var_time(int exoid, int nodal_var_index, int64_t num_nodes, in snprintf(errmsg, MAX_ERR_LENGTH, "Warning: could not find nodal variable %d in file id %d", nodal_var_index, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_WARN); + return EX_WARN; } start[0] = --beg_time_step; start[1] = 0; @@ -106,7 +106,7 @@ int exi_put_nodal_var_time(int exoid, int nodal_var_index, int64_t num_nodes, in if (status != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store nodal variables in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } diff --git a/packages/seacas/libraries/exodus/src/ex_conv.c b/packages/seacas/libraries/exodus/src/ex_conv.c index f053f185d37c..4b96ee7e2e21 100644 --- a/packages/seacas/libraries/exodus/src/ex_conv.c +++ b/packages/seacas/libraries/exodus/src/ex_conv.c @@ -37,7 +37,7 @@ struct exi_file_item *exi_find_file_item(int exoid) } ptr = ptr->next; } - return (ptr); + return ptr; } #define EX__MAX_PATHLEN 8192 @@ -240,6 +240,7 @@ int exi_conv_init(int exoid, int *comp_wordsize, int *io_wordsize, int file_word new_file->assembly_count = 0; new_file->blob_count = 0; new_file->compression_level = 0; + new_file->quantize_nsd = 0; new_file->shuffle = 0; new_file->file_type = filetype - 1; new_file->is_parallel = is_parallel; @@ -443,19 +444,76 @@ int ex_set_option(int exoid, ex_option_type option, int option_value) char errmsg[MAX_ERR_LENGTH]; snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: invalid value %d for SZIP Compression. Must be even and 4 <= value <= " - "32. Ignoring.", + "32. Setting value to 4.", value); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); - EX_FUNC_LEAVE(EX_FATAL); + value = 4; } } + else if (file->compression_algorithm == EX_COMPRESS_ZSTD) { +#if NC_HAS_ZSTD == 1 + if (value < -131072 || value > 22) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: invalid value %d for ZSTD Compression. Must be between -131072 and 22. " + "Setting value to 4", + value); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); + value = 4; + } +#else + char errmsg[MAX_ERR_LENGTH]; + snprintf( + errmsg, MAX_ERR_LENGTH, + "ERROR: Zstandard compression is not supported in this version of netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); +#endif + } + else if (file->compression_algorithm == EX_COMPRESS_BZ2) { +#if NC_HAS_BZ2 == 1 + if (value < 0 || value > 9) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: invalid value %d for BZIP2 Compression. Must be between 0 and 9 " + "inclusive. Setting value to 1.", + value); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); + value = 1; + } +#else + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Bzip2 compression is not supported in this version of netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); +#endif + } file->compression_level = value; - assert(value == file->compression_level); } else { file->compression_level = 0; } break; + case EX_OPT_QUANTIZE_NSD: +#if NC_HAS_QUANTIZE == 1 + if (option_value > 15) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: invalid value %d for Quantize NSD. Must be less than or equal to 15. " + "Setting value to 15.", + option_value); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); + option_value = 15; + } + file->quantize_nsd = option_value; +#else + { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Quanitzation is not supported in this version of netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); + } +#endif + break; case EX_OPT_COMPRESSION_SHUFFLE: /* 0 (disabled); 1 (enabled) */ file->shuffle = option_value != 0 ? 1 : 0; break; @@ -488,10 +546,10 @@ int exi_comp_ws(int exoid) char errmsg[MAX_ERR_LENGTH]; snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: unknown file id %d", exoid); ex_err(__func__, errmsg, EX_BADFILEID); - return (EX_FATAL); + return EX_FATAL; } /* Stored as 0 for 4-byte; 1 for 8-byte */ - return ((file->user_compute_wordsize + 1) * 4); + return (file->user_compute_wordsize + 1) * 4; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_copy.c b/packages/seacas/libraries/exodus/src/ex_copy.c index 8ccb00505f2b..89462e204eb4 100644 --- a/packages/seacas/libraries/exodus/src/ex_copy.c +++ b/packages/seacas/libraries/exodus/src/ex_copy.c @@ -21,7 +21,7 @@ #define EXCHECKI(funcall) \ if ((funcall) != NC_NOERR) { \ fprintf(stderr, "Error calling %s\n", TOSTRING(funcall)); \ - return (EX_FATAL); \ + return EX_FATAL; \ } #define EXCHECKF(funcall) \ @@ -66,7 +66,7 @@ static int is_truth_table_variable(const char *var_name) /* If copying just the "mesh" or "non-transient" portion of the * input DB, these are the variables that won't be copied: */ - return (strstr(var_name, "_var_tab") != NULL); + return strstr(var_name, "_var_tab") != NULL; } static int is_non_mesh_variable(const char *var_name) @@ -176,6 +176,7 @@ int ex_copy_transient(int in_exoid, int out_exoid) static int cpy_variable_data(int in_exoid, int out_exoid, int in_large, int mesh_only) { int nvars; /* number of variables */ + /* NOTE: This is incorrect for files containing groups */ EXCHECKI(nc_inq(in_exoid, NULL, &nvars, NULL, NULL)); for (int varid = 0; varid < nvars; varid++) { bool is_filtered; @@ -216,6 +217,7 @@ static int cpy_variables(int in_exoid, int out_exoid, int in_large, int mesh_onl { int recdimid; /* id of unlimited dimension */ int nvars; /* number of variables */ + /* NOTE: This is incorrect for files containing groups */ EXCHECKI(nc_inq(in_exoid, NULL, &nvars, NULL, &recdimid)); for (int varid = 0; varid < nvars; varid++) { struct ncvar var; /* variable */ @@ -259,6 +261,7 @@ static int cpy_dimension(int in_exoid, int out_exoid, int mesh_only) int ndims; /* number of dimensions */ int recdimid; /* id of unlimited dimension */ + /* NOTE: This is incorrect for files containing groups */ EXCHECKI(nc_inq(in_exoid, &ndims, NULL, NULL, &recdimid)); for (int dimid = 0; dimid < ndims; dimid++) { @@ -344,6 +347,7 @@ static int cpy_global_att(int in_exoid, int out_exoid) struct ncatt att; /* attribute */ int ngatts; + /* NOTE: This is incorrect for files containing groups */ EXCHECKI(nc_inq(in_exoid, NULL, NULL, &ngatts, NULL)); /* copy global attributes */ @@ -413,7 +417,7 @@ static int cpy_att(int in_id, int out_id, int var_in_id, int var_out_id) nc_copy_att(in_id, var_in_id, att_nm, out_id, var_out_id); } - return (EX_NOERR); + return EX_NOERR; } /*! \endcond */ @@ -718,11 +722,11 @@ static int cpy_var_val(int in_id, int out_id, char *var_nm) /* Free the space that held the variable */ free(void_ptr); - return (EX_NOERR); + return EX_NOERR; err_ret: free(void_ptr); - return (EX_FATAL); + return EX_FATAL; } /* end cpy_var_val() */ @@ -789,7 +793,7 @@ static int cpy_coord_val(int in_id, int out_id, char *var_nm, int in_large) /* Free the space that held the variable */ free(void_ptr); - return (EX_NOERR); + return EX_NOERR; } /* end cpy_coord_val() */ diff --git a/packages/seacas/libraries/exodus/src/ex_cvt_nodes_to_sides.c b/packages/seacas/libraries/exodus/src/ex_cvt_nodes_to_sides.c index 5da57f6ce0cc..0d0a552c3ee2 100644 --- a/packages/seacas/libraries/exodus/src/ex_cvt_nodes_to_sides.c +++ b/packages/seacas/libraries/exodus/src/ex_cvt_nodes_to_sides.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -171,7 +171,6 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n void_int *side_sets_elem_list, void_int *side_sets_node_list, void_int *side_sets_side_list) { - size_t i, j, k, n; int num_side_sets, num_elem_blks; int64_t tot_num_elem = 0, tot_num_ss_elem = 0, elem_num = 0, ndim; void_int *elem_blk_ids = NULL; @@ -179,7 +178,7 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n void_int *ss_elem_ndx = NULL; void_int *ss_elem_node_ndx = NULL; void_int *ss_parm_ndx = NULL; - size_t elem_ctr, node_ctr, elem_num_pos; + int64_t elem_ctr, node_ctr, elem_num_pos; int num_nodes_per_elem, num_node_per_side; int *same_elem_type = NULL; @@ -255,12 +254,12 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n /* First count up # of elements in the side sets*/ if (ints_64) { - for (i = 0; i < num_side_sets; i++) { + for (int i = 0; i < num_side_sets; i++) { tot_num_ss_elem += ((int64_t *)num_elem_per_set)[i]; } } else { - for (i = 0; i < num_side_sets; i++) { + for (int i = 0; i < num_side_sets; i++) { tot_num_ss_elem += ((int *)num_elem_per_set)[i]; } } @@ -279,7 +278,7 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n if (int_size == sizeof(int64_t)) { /* Sort side set element list into index array - non-destructive */ int64_t *elems = (int64_t *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (int i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort64(side_sets_elem_list, elems, tot_num_ss_elem); @@ -287,7 +286,7 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n else { /* Sort side set element list into index array - non-destructive */ int *elems = (int *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (int i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort(side_sets_elem_list, elems, tot_num_ss_elem); @@ -325,7 +324,7 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n goto cleanup; } elem_ctr = 0; - for (i = 0; i < num_elem_blks; i++) { + for (int i = 0; i < num_elem_blks; i++) { ex_entity_id id; if (ints_64) { id = ((int64_t *)elem_blk_ids)[i]; @@ -383,9 +382,10 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n same_elem_type[0] = true; if (ints_64) { elem_ctr = ((int64_t *)num_elem_per_set)[0]; - for (i = 0, k = 0; i < tot_num_ss_elem; i++) { + for (int64_t i = 0, k = 0; i < tot_num_ss_elem; i++) { int64_t elem = ((int64_t *)side_sets_elem_list)[i]; - for (j = 0; j < num_elem_blks; j++) { + int j = 0; + for (; j < num_elem_blks; j++) { if (elem <= elem_blk_parms[j].elem_ctr) { break; } @@ -420,10 +420,12 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n */ node_ctr = 0; elem_ctr = ((int64_t *)num_elem_per_set)[0]; - for (i = 0, k = 0; i < tot_num_ss_elem; i++) { + int i = 0; + for (int k = 0; i < tot_num_ss_elem; i++) { int64_t elem = ((int64_t *)side_sets_elem_list)[i]; - for (j = 0; j < num_elem_blks; j++) { + int j = 0; + for (; j < num_elem_blks; j++) { if (elem <= elem_blk_parms[j].elem_ctr) { break; } @@ -460,10 +462,11 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n } else { elem_ctr = ((int *)num_elem_per_set)[0]; - for (i = 0, k = 0; i < tot_num_ss_elem; i++) { + for (int i = 0, k = 0; i < tot_num_ss_elem; i++) { int elem = ((int *)side_sets_elem_list)[i]; - for (j = 0; j < num_elem_blks; j++) { + int j = 0; + for (; j < num_elem_blks; j++) { if (elem <= elem_blk_parms[j].elem_ctr) { break; } @@ -498,10 +501,12 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n */ node_ctr = 0; elem_ctr = ((int *)num_elem_per_set)[0]; - for (i = 0, k = 0; i < tot_num_ss_elem; i++) { + int i = 0; + for (int k = 0; i < tot_num_ss_elem; i++) { int elem = ((int *)side_sets_elem_list)[i]; - for (j = 0; j < num_elem_blks; j++) { + int j = 0; + for (; j < num_elem_blks; j++) { if (elem <= elem_blk_parms[j].elem_ctr) { break; } @@ -541,7 +546,7 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n elem_ctr = 0; - for (j = 0; j < tot_num_ss_elem; j++) { + for (int j = 0; j < tot_num_ss_elem; j++) { int64_t elem; int64_t idx; int64_t ss_node0, ss_node1; @@ -617,7 +622,8 @@ int ex_cvt_nodes_to_sides(int exoid, void_int *num_elem_per_set, void_int *num_n num_nodes_per_elem = elem_blk_parms[p_ndx].num_nodes_per_elem; - for (n = 0; n < num_nodes_per_elem; n++) { + int n = 0; + for (; n < num_nodes_per_elem; n++) { /* find node in connectivity array that matches first node in side set */ if (((int_size == sizeof(int64_t)) && (ss_node0 == ((int64_t *)connect)[num_nodes_per_elem * (elem_num_pos) + n])) || diff --git a/packages/seacas/libraries/exodus/src/ex_err.c b/packages/seacas/libraries/exodus/src/ex_err.c index a2400ab978c9..4fb4b08321c0 100644 --- a/packages/seacas/libraries/exodus/src/ex_err.c +++ b/packages/seacas/libraries/exodus/src/ex_err.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -225,6 +225,7 @@ void ex_err_fn(int exoid, const char *module_name, const char *message, int err_ fprintf(stderr, " exerrval = %d\n", EX_ERR_NUM); fprintf(stderr, "\t%s\n", ex_strerror(EX_ERR_NUM)); + fflush(stderr); EX_FUNC_VOID(); } @@ -239,6 +240,7 @@ void ex_err_fn(int exoid, const char *module_name, const char *message, int err_ if (err_num == EX_NULLENTITY) { if (exoptval & EX_NULLVERBOSE) { fprintf(stderr, "\nExodus Library Warning: [%s]\n\t%s\n", module_name, message); + fflush(stderr); } } @@ -262,8 +264,8 @@ void ex_err_fn(int exoid, const char *module_name, const char *message, int err_ fprintf(stderr, "\nExodus Library Warning/Error: [%s]\n\t%s\n", module_name, message); } fprintf(stderr, "\t%s\n", ex_strerror(err_num)); + fflush(stderr); } - fflush(stderr); /* with netCDF 3.4, (fatal) system error codes are > 0; so all EXODUS fatal error codes are > 0 */ @@ -345,6 +347,7 @@ const char *ex_strerror(int err_num) case EX_INTERNAL: return "Internal logic error in exodus library."; case EX_NOTROOTID: return "File id is not the root id; it is a subgroup id."; case EX_NULLENTITY: return "Null entity found."; + case EX_NOTFOUND: return "Could not find requested variable on database."; case EX_INTSIZEMISMATCH: return "Integer sizes must match for input and output file in ex_copy."; case EX_MSG: return "Message printed; no error implied."; default: return nc_strerror(err_num); diff --git a/packages/seacas/libraries/exodus/src/ex_field_utils.c b/packages/seacas/libraries/exodus/src/ex_field_utils.c index 098e3c589f26..f9e5e4ccce40 100644 --- a/packages/seacas/libraries/exodus/src/ex_field_utils.c +++ b/packages/seacas/libraries/exodus/src/ex_field_utils.c @@ -60,7 +60,7 @@ static int number_width(size_t number) static void verify_valid_component(int component, size_t cardinality, size_t suffix_size) { assert(cardinality == suffix_size); - assert(component - 1 < suffix_size); + assert(component - 1 < (int)suffix_size); } const char *ex_component_field_name(ex_field *field, int component[EX_MAX_FIELD_NESTING]) @@ -76,7 +76,7 @@ const char *ex_component_field_name(ex_field *field, int component[EX_MAX_FIELD_ } // Build up name incrementally which makes it easier to handle an empty component_separator... - sprintf(field_name, "%s", field->name); + snprintf(field_name, EX_MAX_NAME + 1, "%s", field->name); for (int i = 0; i < field->nesting; i++) { if (field->component_separator[i]) { @@ -332,8 +332,8 @@ const char *ex_field_component_suffix(ex_field *field, int nest_level, int compo static char user_suffix[32]; static char format[8]; int width = number_width(field->cardinality[nest_level]); - sprintf(format, "%c%d%dd", '%', 0, width); - sprintf(user_suffix, format, component); + snprintf(format, 8, "%c%d%dd", '%', 0, width); + snprintf(user_suffix, 32, format, component); return user_suffix; } @@ -343,8 +343,8 @@ const char *ex_field_component_suffix(ex_field *field, int nest_level, int compo static char user_suffix[32]; static char format[8]; int width = number_width(field->cardinality[nest_level]); - sprintf(format, "%c%d%dd", '%', 0, width); - sprintf(user_suffix, format, component - 1); + snprintf(format, 8, "%c%d%dd", '%', 0, width); + snprintf(user_suffix, 32, format, component - 1); return user_suffix; } diff --git a/packages/seacas/libraries/exodus/src/ex_get_assemblies.c b/packages/seacas/libraries/exodus/src/ex_get_assemblies.c index 153d51eca729..aee75c0d007b 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_assemblies.c +++ b/packages/seacas/libraries/exodus/src/ex_get_assemblies.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -26,7 +26,7 @@ int ex_get_assemblies(int exoid, ex_assembly *assembly) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to inquire ASSEMBLY count in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, num_assembly); - return (EX_FATAL); + return EX_FATAL; } if (ex_int64_status(exoid) & EX_IDS_INT64_API) { diff --git a/packages/seacas/libraries/exodus/src/ex_get_blobs.c b/packages/seacas/libraries/exodus/src/ex_get_blobs.c index fde8ca7ab581..9b08148ebd54 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_blobs.c +++ b/packages/seacas/libraries/exodus/src/ex_get_blobs.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -23,7 +23,7 @@ int ex_get_blobs(int exoid, ex_blob *blob) char errmsg[MAX_ERR_LENGTH]; snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to inquire BLOB count in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, num_blob); - return (EX_FATAL); + return EX_FATAL; } if (ex_int64_status(exoid) & EX_IDS_INT64_API) { diff --git a/packages/seacas/libraries/exodus/src/ex_get_block_params.c b/packages/seacas/libraries/exodus/src/ex_get_block_params.c index d7e939293ea9..9b48ad81de62 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_block_params.c +++ b/packages/seacas/libraries/exodus/src/ex_get_block_params.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -22,9 +22,8 @@ int ex_get_block_params(int exoid, size_t block_count, struct ex_block **blocks) { - size_t i; EX_FUNC_ENTER(); - for (i = 0; i < block_count; i++) { + for (size_t i = 0; i < block_count; i++) { int status = ex_get_block_param(exoid, blocks[i]); if (status != EX_NOERR) { EX_FUNC_LEAVE(status); diff --git a/packages/seacas/libraries/exodus/src/ex_get_concat_sets.c b/packages/seacas/libraries/exodus/src/ex_get_concat_sets.c index 2e99ac0ca528..417d0eb991fb 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_concat_sets.c +++ b/packages/seacas/libraries/exodus/src/ex_get_concat_sets.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -39,11 +39,7 @@ int ex_get_concat_sets(int exoid, ex_entity_type set_type, struct ex_set_specs * void *sets_dist_fact = set_specs->sets_dist_fact; - int num_sets, i; - float *flt_dist_fact; - double *dbl_dist_fact; - char errmsg[MAX_ERR_LENGTH]; - ex_inquiry ex_inq_val; + char errmsg[MAX_ERR_LENGTH]; EX_FUNC_ENTER(); if (exi_check_valid_file_id(exoid, __func__) == EX_FATAL) { @@ -53,6 +49,7 @@ int ex_get_concat_sets(int exoid, ex_entity_type set_type, struct ex_set_specs * /* setup pointers based on set_type NOTE: there is another block that sets more stuff later ... */ + ex_inquiry ex_inq_val; if (set_type == EX_NODE_SET) { ex_inq_val = EX_INQ_NODE_SETS; } @@ -91,7 +88,7 @@ int ex_get_concat_sets(int exoid, ex_entity_type set_type, struct ex_set_specs * /* inquire how many sets have been stored */ - num_sets = ex_inquire_int(exoid, ex_inq_val); + int num_sets = ex_inquire_int(exoid, ex_inq_val); if (num_sets < 0) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get number of %ss defined for file id %d", ex_name_of_object(set_type), exoid); @@ -117,7 +114,7 @@ int ex_get_concat_sets(int exoid, ex_entity_type set_type, struct ex_set_specs * ((int *)sets_dist_index)[0] = 0; } - for (i = 0; i < num_sets; i++) { + for (int i = 0; i < num_sets; i++) { int64_t set_id; if (ex_int64_status(exoid) & EX_IDS_INT64_API) { set_id = ((int64_t *)set_specs->sets_ids)[i]; @@ -200,12 +197,12 @@ int ex_get_concat_sets(int exoid, ex_entity_type set_type, struct ex_set_specs * } if (num_dist > 0) { /* only get df if they exist */ if (exi_comp_ws(exoid) == sizeof(float)) { - flt_dist_fact = sets_dist_fact; - status = ex_get_set_dist_fact(exoid, set_type, set_id, &(flt_dist_fact[df_idx])); + float *flt_dist_fact = sets_dist_fact; + status = ex_get_set_dist_fact(exoid, set_type, set_id, &(flt_dist_fact[df_idx])); } else { - dbl_dist_fact = sets_dist_fact; - status = ex_get_set_dist_fact(exoid, set_type, set_id, &(dbl_dist_fact[df_idx])); + double *dbl_dist_fact = sets_dist_fact; + status = ex_get_set_dist_fact(exoid, set_type, set_id, &(dbl_dist_fact[df_idx])); } if (status != NC_NOERR) { EX_FUNC_LEAVE(EX_FATAL); /* error will be reported by subroutine */ diff --git a/packages/seacas/libraries/exodus/src/ex_get_field_metadata.c b/packages/seacas/libraries/exodus/src/ex_get_field_metadata.c index 1d25ed3c2956..e97b41c3eeaf 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_field_metadata.c +++ b/packages/seacas/libraries/exodus/src/ex_get_field_metadata.c @@ -11,7 +11,7 @@ #include #include -static const char *exi_get_metadata_attribute(char *name, const char *prefix, int pre_len) +static const char *exi_get_metadata_attribute(const char *name, const char *prefix, int pre_len) { /* * Each field or basis attribute metadata attribute consists of 2 or more attributes. @@ -30,7 +30,7 @@ static const char *exi_get_metadata_attribute(char *name, const char *prefix, in return NULL; } -static const char *exi_get_attribute_metadata_name(char *attrib, int offset) +static const char *exi_get_attribute_metadata_name(const char *attrib, int offset) { /* * PRECONDITION: `attrib` is a basis or field metadata attribute of the form @@ -165,9 +165,9 @@ int ex_get_field_metadata(int exoid, ex_field *field) if (found == -1) { which = count; strcpy(field[count].name, fld_name); - /* Set default separator type... */ - field[count].component_separator[0] = '_'; - field[count].component_separator[1] = '\0'; + /* Set default separator type... */ + field[count].component_separator[0] = '_'; + field[count].component_separator[1] = '\0'; count++; } diff --git a/packages/seacas/libraries/exodus/src/ex_get_group_id.c b/packages/seacas/libraries/exodus/src/ex_get_group_id.c index c07ac1f1b7c4..d515edfdebe6 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_group_id.c +++ b/packages/seacas/libraries/exodus/src/ex_get_group_id.c @@ -40,17 +40,20 @@ int ex_get_group_id(int parent_id, const char *group_name, int *group_id) "group in file id %d", group_name, parent_id); ex_err_fn(parent_id, __func__, errmsg, status); + *group_id = 0; EX_FUNC_LEAVE(EX_FATAL); } } else { /* Full path name */ - int status = nc_inq_grp_full_ncid(parent_id, group_name, group_id); + int rootid = parent_id & EX_FILE_ID_MASK; + int status = nc_inq_grp_full_ncid(rootid, group_name, group_id); if (status != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Failed to locate group with full path name %s in file id %d", group_name, parent_id); ex_err_fn(parent_id, __func__, errmsg, status); + *group_id = 0; EX_FUNC_LEAVE(EX_FATAL); } } @@ -64,6 +67,7 @@ int ex_get_group_id(int parent_id, const char *group_name, int *group_id) "ERROR: Group capabilities are not available in this netcdf " "version--not netcdf4"); ex_err_fn(parent_id, __func__, errmsg, NC_ENOTNC4); + *group_id = 0; EX_FUNC_LEAVE(EX_FATAL); #endif } diff --git a/packages/seacas/libraries/exodus/src/ex_get_ids.c b/packages/seacas/libraries/exodus/src/ex_get_ids.c index 01365b71541f..bc2753cde4c3 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_ids.c +++ b/packages/seacas/libraries/exodus/src/ex_get_ids.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -46,6 +46,11 @@ static int ex_get_nonstandard_ids(int exoid, ex_entity_type obj_type, void_int * int num_found = 0; struct ncvar var; int nvars; + int rootid = exoid & EX_FILE_ID_MASK; + int root_var_count = 0; + if (rootid != exoid) { + nc_inq(rootid, NULL, &root_var_count, NULL, NULL); + } nc_inq(exoid, NULL, &nvars, NULL, NULL); char *type = NULL; if (obj_type == EX_ASSEMBLY) { @@ -55,7 +60,7 @@ static int ex_get_nonstandard_ids(int exoid, ex_entity_type obj_type, void_int * type = "blob_entity"; } - for (int varid = 0; varid < nvars; varid++) { + for (int varid = root_var_count; varid < nvars + root_var_count; varid++) { int status; if ((status = nc_inq_var(exoid, varid, var.name, &var.type, &var.ndims, var.dims, &var.natts)) != NC_NOERR) { diff --git a/packages/seacas/libraries/exodus/src/ex_get_init_ext.c b/packages/seacas/libraries/exodus/src/ex_get_init_ext.c index 7be588c2fcd9..cd2fa90e2165 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_init_ext.c +++ b/packages/seacas/libraries/exodus/src/ex_get_init_ext.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -26,12 +26,16 @@ static void exi_get_entity_count(int exoid, ex_init_params *info) { - int ndims; - nc_inq(exoid, &ndims, NULL, NULL, NULL); + int include_parent_group = 0; // Only want dims in current group + int ndims = 0; + nc_inq_dimids(exoid, &ndims, NULL, include_parent_group); + int *dimids = calloc(ndims, sizeof(int)); + nc_inq_dimids(exoid, &ndims, dimids, include_parent_group); + for (int dimid = 0; dimid < ndims; dimid++) { char dim_nm[NC_MAX_NAME + 1] = {'\0'}; size_t dim_sz; - nc_inq_dim(exoid, dimid, dim_nm, &dim_sz); + nc_inq_dim(exoid, dimids[dimid], dim_nm, &dim_sz); /* For assemblies, we check for a dim starting with "num_entity_assembly" */ if (strncmp(dim_nm, "num_entity_assembly", 19) == 0) { info->num_assembly++; @@ -40,6 +44,7 @@ static void exi_get_entity_count(int exoid, ex_init_params *info) info->num_blob++; } } + free(dimids); } /* Used to reduce repeated code below */ @@ -58,11 +63,11 @@ static int ex_get_dim_value(int exoid, const char *name, const char *dimension_n snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get number of %s in file id %d", name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } *value = tmp; } - return (EX_NOERR); + return EX_NOERR; } /*! @@ -176,32 +181,28 @@ int ex_get_init_ext(int exoid, ex_init_params *info) int status; size_t title_len = 0; nc_type title_type = 0; - if ((status = nc_inq_att(rootid, NC_GLOBAL, ATT_TITLE, &title_type, &title_len)) != NC_NOERR) { - char errmsg[MAX_ERR_LENGTH]; - snprintf(errmsg, MAX_ERR_LENGTH, "Warning: no title in file id %d", rootid); - ex_err_fn(exoid, __func__, errmsg, status); - } - - /* Check title length to avoid overrunning clients memory space; include - * trailing null */ - if (title_len > 0) { - if (title_len > MAX_LINE_LENGTH) { - char *title = malloc(title_len + 1); - if ((status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, title)) == NC_NOERR) { - ex_copy_string(info->title, title, MAX_LINE_LENGTH + 1); - info->title[MAX_LINE_LENGTH] = '\0'; + if ((status = nc_inq_att(rootid, NC_GLOBAL, ATT_TITLE, &title_type, &title_len)) == NC_NOERR) { + /* Check title length to avoid overrunning clients memory space; include + * trailing null */ + if (title_len > 0) { + if (title_len > MAX_LINE_LENGTH) { + char *title = malloc(title_len + 1); + if ((status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, title)) == NC_NOERR) { + ex_copy_string(info->title, title, MAX_LINE_LENGTH + 1); + info->title[MAX_LINE_LENGTH] = '\0'; + } + free(title); + } + else { + status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, info->title); + info->title[title_len] = '\0'; + } + if (status != NC_NOERR) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get title in file id %d", rootid); + ex_err_fn(exoid, __func__, errmsg, status); + EX_FUNC_LEAVE(EX_FATAL); } - free(title); - } - else { - status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, info->title); - info->title[title_len] = '\0'; - } - if (status != NC_NOERR) { - char errmsg[MAX_ERR_LENGTH]; - snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get title in file id %d", rootid); - ex_err_fn(exoid, __func__, errmsg, status); - EX_FUNC_LEAVE(EX_FATAL); } } else { diff --git a/packages/seacas/libraries/exodus/src/ex_get_init_global.c b/packages/seacas/libraries/exodus/src/ex_get_init_global.c index 518316a7e40e..67264487c87b 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_init_global.c +++ b/packages/seacas/libraries/exodus/src/ex_get_init_global.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -49,11 +49,11 @@ static int ex_get_dim_value(int exoid, const char *name, const char *dimension_n snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get number of %s in file id %d", name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } *value = tmp; } - return (EX_NOERR); + return EX_NOERR; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_get_names.c b/packages/seacas/libraries/exodus/src/ex_get_names.c index c71d7abbf650..72e239f802ba 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_names.c +++ b/packages/seacas/libraries/exodus/src/ex_get_names.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -50,7 +50,7 @@ int ex_get_names(int exoid, ex_entity_type obj_type, char **names) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to inquire ASSEMBLY count in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, num_assembly); - return (EX_FATAL); + return EX_FATAL; } if (ex_int64_status(exoid) & EX_IDS_INT64_API) { diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_attr.c b/packages/seacas/libraries/exodus/src/ex_get_partial_attr.c index b9e637579a68..b9d3def69f85 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_attr.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_attr.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -150,7 +150,7 @@ int ex_get_partial_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj_id, EX_FUNC_LEAVE(EX_FATAL); } - if (start_num + num_ent - 1 > num_entries_this_obj) { + if (start_num + num_ent - 1 > (int64_t)num_entries_this_obj) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + count (%" PRId64 ") is larger than total number of entities (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_coord.c b/packages/seacas/libraries/exodus/src/ex_get_partial_coord.c index 44b1b1c8f7aa..5eacd75a43c8 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_coord.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_coord.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -81,7 +81,7 @@ int ex_get_partial_coord(int exoid, int64_t start_node_num, int64_t num_nodes, v } --start_node_num; - if (start_node_num + num_nodes > num_nod) { + if (start_node_num + num_nodes > (int64_t)num_nod) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + node count (%" PRId64 ") is larger than total number of nodes (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_coord_component.c b/packages/seacas/libraries/exodus/src/ex_get_partial_coord_component.c index 9b12c68db3d7..2ab09b0fbe28 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_coord_component.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_coord_component.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -57,7 +57,7 @@ int ex_get_partial_coord_component(int exoid, int64_t start_node_num, int64_t nu } --start_node_num; - if (start_node_num + num_nodes > num_nod) { + if (start_node_num + num_nodes > (int64_t)num_nod) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + node count (%" PRId64 ") is larger than total number of nodes (%zu) in file id %d", @@ -71,7 +71,7 @@ int ex_get_partial_coord_component(int exoid, int64_t start_node_num, int64_t nu EX_FUNC_LEAVE(EX_FATAL); } - if (component > num_dim) { + if (component > (int64_t)num_dim) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Component (%d) is larger than number of dimensions (%zu) in file id %d", component, num_dim, exoid); diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_id_map.c b/packages/seacas/libraries/exodus/src/ex_get_partial_id_map.c index 764072bec2c0..5df3505091cc 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_id_map.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_id_map.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -90,7 +90,7 @@ int ex_get_partial_id_map(int exoid, ex_entity_type map_type, int64_t start_enti EX_FUNC_LEAVE(EX_FATAL); } - if (start_entity_num + num_entities - 1 > num_entries) { + if (start_entity_num + num_entities - 1 > (int64_t)num_entries) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + entity count (%" PRId64 ") is larger than total number of entities (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_num_map.c b/packages/seacas/libraries/exodus/src/ex_get_partial_num_map.c index 6ba48bfe414e..5a6d8641106c 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_num_map.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_num_map.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -81,7 +81,7 @@ int ex_get_partial_num_map(int exoid, ex_entity_type map_type, ex_entity_id map_ } /* Check input parameters for a valid range of numbers */ - if (ent_start <= 0 || ent_start > num_mobj) { + if (ent_start <= 0 || ent_start > (int64_t)num_mobj) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start count is invalid in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); EX_FUNC_LEAVE(EX_FATAL); @@ -93,7 +93,7 @@ int ex_get_partial_num_map(int exoid, ex_entity_type map_type, ex_entity_id map_ EX_FUNC_LEAVE(EX_FATAL); } - if (ent_start + ent_count - 1 > num_mobj) { + if (ent_start + ent_count - 1 > (int64_t)num_mobj) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start+count-1 is larger than element count in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); diff --git a/packages/seacas/libraries/exodus/src/ex_get_partial_one_attr.c b/packages/seacas/libraries/exodus/src/ex_get_partial_one_attr.c index d9ef130ecd43..5da909921d50 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_partial_one_attr.c +++ b/packages/seacas/libraries/exodus/src/ex_get_partial_one_attr.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -152,7 +152,7 @@ int ex_get_partial_one_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj EX_FUNC_LEAVE(EX_FATAL); } - if (start_num + num_ent - 1 > num_entries_this_obj && num_ent > 0) { + if (start_num + num_ent - 1 > (int64_t)num_entries_this_obj && num_ent > 0) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + count (%" PRId64 ") is larger than total number of entities (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_get_prop_names.c b/packages/seacas/libraries/exodus/src/ex_get_prop_names.c index 2824e80c5f68..2476d5c46145 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_prop_names.c +++ b/packages/seacas/libraries/exodus/src/ex_get_prop_names.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -128,7 +128,7 @@ int ex_get_prop_names(int exoid, ex_entity_type obj_type, char **prop_names) EX_FUNC_LEAVE(EX_FATAL); } - int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH); + size_t api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH); if (att_len - 1 <= api_name_size) { /* Client has large enough char string to hold text... */ if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, prop_names[i])) != NC_NOERR) { diff --git a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_count.c b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_count.c index 12236c6a0333..cf4f331441be 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_count.c +++ b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_count.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -27,7 +27,6 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_set_node_cnt_list) { int status; - size_t ii, i, j; int num_side_sets, num_elem_blks, ndim; size_t tot_num_ss_elem = 0; int64_t side, elem; @@ -171,7 +170,7 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_se if (int_size == sizeof(int64_t)) { /* Sort side set element list into index array - non-destructive */ int64_t *elems = (int64_t *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (size_t i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort64(side_set_elem_list, elems, tot_num_ss_elem); @@ -179,7 +178,7 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_se else { /* Sort side set element list into index array - non-destructive */ int *elems = (int *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (size_t i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort(side_set_elem_list, elems, tot_num_ss_elem); @@ -224,22 +223,22 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_se } elem_ctr = 0; - for (i = 0; i < num_elem_blks; i++) { + for (int ib = 0; ib < num_elem_blks; ib++) { ex_entity_id id; if (ex_int64_status(exoid) & EX_IDS_INT64_API) { - id = ((int64_t *)elem_blk_ids)[i]; + id = ((int64_t *)elem_blk_ids)[ib]; } else { - id = ((int *)elem_blk_ids)[i]; + id = ((int *)elem_blk_ids)[ib]; } - err_stat = exi_get_block_param(exoid, id, ndim, &elem_blk_parms[i]); + err_stat = exi_get_block_param(exoid, id, ndim, &elem_blk_parms[ib]); if (err_stat != EX_NOERR) { goto cleanup; } - elem_ctr += elem_blk_parms[i].num_elem_in_blk; - elem_blk_parms[i].elem_ctr = elem_ctr; /* save elem number max */ + elem_ctr += elem_blk_parms[ib].num_elem_in_blk; + elem_blk_parms[ib].elem_ctr = elem_ctr; /* save elem number max */ } /* Finally... Create the list of node counts for each face in the @@ -252,9 +251,10 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_se * NULL` */ if (side_set_node_cnt_list != NULL) { - j = 0; /* The current element block... */ - for (ii = 0; ii < tot_num_ss_elem; ii++) { + int jb = 0; /* The current element block... */ + for (size_t ii = 0; ii < tot_num_ss_elem; ii++) { + size_t i = 0; if (ints_64) { i = ((int64_t *)ss_elem_ndx)[ii]; elem = ((int64_t *)side_set_elem_list)[i]; @@ -272,15 +272,15 @@ int ex_get_side_set_node_count(int exoid, ex_entity_id side_set_id, int *side_se * from block 0 to block[num_elem_blks-1]. Once we find an element * not in this block, find a following block that contains it... */ - for (; j < num_elem_blks; j++) { - if (elem <= elem_blk_parms[j].elem_ctr) { + for (; jb < num_elem_blks; jb++) { + if (elem <= elem_blk_parms[jb].elem_ctr) { break; } } - if (j < num_elem_blks) { - assert(side < elem_blk_parms[j].num_sides); - side_set_node_cnt_list[i] = elem_blk_parms[j].num_nodes_per_side[side]; + if (jb < num_elem_blks) { + assert(side < elem_blk_parms[jb].num_sides); + side_set_node_cnt_list[i] = elem_blk_parms[jb].num_nodes_per_side[side]; } else { snprintf(errmsg, MAX_ERR_LENGTH, diff --git a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list.c b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list.c index 82bb47856dbe..604ca3696c91 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list.c +++ b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -42,7 +42,7 @@ static int check_valid_side(size_t side_num, size_t max_sides, char *topology, i ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); err_stat = EX_FATAL; } - return (err_stat); + return err_stat; } static void get_nodes(int exoid, void_int *to, size_t ito, void_int *from, size_t ifrom) @@ -58,7 +58,6 @@ static void get_nodes(int exoid, void_int *to, size_t ito, void_int *from, size_ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *side_set_node_cnt_list, void_int *side_set_node_list) { - size_t ii, i, j; int64_t elem, side; int64_t num_side_sets, num_elem_blks, num_df, ndim; int64_t tot_num_elem = 0, tot_num_ss_elem = 0, elem_num = 0; @@ -70,7 +69,7 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid int64_t *ss_parm_ndx = NULL; void_int *side_set_elem_list = NULL; void_int *side_set_side_list = NULL; - size_t elem_ctr, node_ctr, elem_num_pos; + int64_t elem_ctr, node_ctr, elem_num_pos; size_t num_nodes_per_elem; int int_size, ids_size; @@ -228,7 +227,7 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid if (int_size == sizeof(int64_t)) { /* Sort side set element list into index array - non-destructive */ int64_t *elems = (int64_t *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (int i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort64(side_set_elem_list, ss_elem_ndx, tot_num_ss_elem); @@ -236,7 +235,7 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid else { /* Sort side set element list into index array - non-destructive */ int *elems = (int *)ss_elem_ndx; - for (i = 0; i < tot_num_ss_elem; i++) { + for (int i = 0; i < tot_num_ss_elem; i++) { elems[i] = i; /* init index array to current position */ } exi_iqsort(side_set_elem_list, ss_elem_ndx, tot_num_ss_elem); @@ -270,7 +269,7 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid } elem_ctr = 0; - for (i = 0; i < num_elem_blks; i++) { + for (int i = 0; i < num_elem_blks; i++) { ex_entity_id id; if (ids_size == sizeof(int64_t)) { id = ((int64_t *)elem_blk_ids)[i]; @@ -315,8 +314,9 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid parameter index. */ node_ctr = 0; - j = 0; /* The current element block... */ - for (ii = 0; ii < tot_num_ss_elem; ii++) { + int j = 0; /* The current element block... */ + for (int64_t ii = 0; ii < tot_num_ss_elem; ii++) { + size_t i = 0; if (ex_int64_status(exoid) & EX_BULK_INT64_API) { i = ((int64_t *)ss_elem_ndx)[ii]; elem = ((int64_t *)side_set_elem_list)[i]; @@ -361,7 +361,8 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid if (node_ctr != num_df) { snprintf(errmsg, MAX_ERR_LENGTH, "Warning: In side set %" PRId64 " the distribution factor count (%" PRId64 - ") does not match the side set node list length (%zu). These should match and this " + ") does not match the side set node list length (%" PRId64 + "). These should match and this " "may indicate a corrupt database in file %d", side_set_id, num_df, node_ctr, exoid); ex_err_fn(exoid, __func__, errmsg, EX_MSG); @@ -372,18 +373,18 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid * exclusive scan to determine where the nodes will be put in the list for each face */ if (ex_int64_status(exoid) & EX_BULK_INT64_API) { - for (i = 0; i < tot_num_ss_elem; i++) { + for (int64_t i = 0; i < tot_num_ss_elem; i++) { ((int64_t *)side_set_node_cnt_list)[i] = ss_elem_node_ndx[i]; } } else { - for (i = 0; i < tot_num_ss_elem; i++) { + for (int64_t i = 0; i < tot_num_ss_elem; i++) { ((int *)side_set_node_cnt_list)[i] = (int)ss_elem_node_ndx[i]; } } int64_t sum = 0; - for (i = 0; i < tot_num_ss_elem; i++) { + for (int64_t i = 0; i < tot_num_ss_elem; i++) { int64_t cnt = ss_elem_node_ndx[i]; ss_elem_node_ndx[i] = sum; sum += cnt; @@ -482,12 +483,12 @@ int ex_get_side_set_node_list(int exoid, ex_entity_id side_set_id, void_int *sid case EX_EL_BEAM: { /* Note: no side-node lookup table is used for this simple case */ if (side_num == 0) { - for (i = 0; i < num_nodes_per_elem; i++) { + for (size_t i = 0; i < num_nodes_per_elem; i++) { get_nodes(exoid, side_set_node_list, node_pos + i, connect, connect_offset + i); } } else { - for (i = 0; i < num_nodes_per_elem; i++) { + for (size_t i = 0; i < num_nodes_per_elem; i++) { int nn = num_nodes_per_elem - i - 1; get_nodes(exoid, side_set_node_list, node_pos + i, connect, connect_offset + nn); } diff --git a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list_len.c b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list_len.c index 28e12874d271..6e0ac40f98b8 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list_len.c +++ b/packages/seacas/libraries/exodus/src/ex_get_side_set_node_list_len.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -36,9 +36,9 @@ int ex_get_side_set_node_list_len(int exoid, ex_entity_id side_set_id, void_int *side_set_node_list_len) { - size_t ii, i, j; + int64_t ii, i, j; int64_t num_side_sets, num_elem_blks, num_df, ndim; - size_t list_len = 0; + int64_t list_len = 0; int64_t tot_num_elem = 0, tot_num_ss_elem = 0; void_int *elem_blk_ids = NULL; int *ss_elem_ndx = NULL; @@ -261,8 +261,8 @@ int ex_get_side_set_node_list_len(int exoid, ex_entity_id side_set_id, list_len = 0; j = 0; /* The current element block... */ for (ii = 0; ii < tot_num_ss_elem; ii++) { - size_t elem; - size_t side; + int64_t elem; + int64_t side; if (ints_64) { i = ss_elem_ndx_64[ii]; elem = ((int64_t *)side_set_elem_list)[i]; @@ -290,8 +290,8 @@ int ex_get_side_set_node_list_len(int exoid, ex_entity_id side_set_id, if (j >= num_elem_blks) { snprintf(errmsg, MAX_ERR_LENGTH, - "ERROR: Invalid element number %zu found in side set %" PRId64 " in file %d", elem, - side_set_id, exoid); + "ERROR: Invalid element number %" PRId64 " found in side set %" PRId64 " in file %d", + elem, side_set_id, exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); err_stat = EX_FATAL; goto cleanup; @@ -310,7 +310,8 @@ int ex_get_side_set_node_list_len(int exoid, ex_entity_id side_set_id, if (list_len != num_df) { snprintf(errmsg, MAX_ERR_LENGTH, "Warning: In side set %" PRId64 " the distribution factor count (%" PRId64 - ") does not match the side set node list length (%zu). These should match and this " + ") does not match the side set node list length (%" PRId64 + "). These should match and this " "may indicate a corrupt database in file %d", side_set_id, num_df, list_len, exoid); ex_err_fn(exoid, __func__, errmsg, EX_MSG); diff --git a/packages/seacas/libraries/exodus/src/ex_get_var_time.c b/packages/seacas/libraries/exodus/src/ex_get_var_time.c index be5b685ade53..ddff7941f453 100644 --- a/packages/seacas/libraries/exodus/src/ex_get_var_time.c +++ b/packages/seacas/libraries/exodus/src/ex_get_var_time.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -47,7 +47,7 @@ int ex_get_var_time(int exoid, ex_entity_type var_type, int var_index, int64_t i int dimid, varid; int status; int *stat_vals = NULL; - size_t numel = 0; + int64_t numel = 0; size_t num_obj, i; size_t num_entries_this_obj = 0; size_t start[2], count[2]; diff --git a/packages/seacas/libraries/exodus/src/ex_inquire.c b/packages/seacas/libraries/exodus/src/ex_inquire.c index b104dbb42064..885b465cd41e 100644 --- a/packages/seacas/libraries/exodus/src/ex_inquire.c +++ b/packages/seacas/libraries/exodus/src/ex_inquire.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -975,6 +975,14 @@ static int ex_inquire_internal(int exoid, int req_info, int64_t *ret_int, float #endif break; + case EX_INQ_FILE_FORMAT: { + /* return netCDF file format. + */ + int nc_format = 0; + nc_inq_format(exoid, &nc_format); + *ret_int = nc_format; + } break; + case EX_INQ_THREADSAFE: /* Return 1 if the library was compiled in thread-safe mode. * Return 0 otherwise diff --git a/packages/seacas/libraries/exodus/src/ex_int_get_block_param.c b/packages/seacas/libraries/exodus/src/ex_int_get_block_param.c index c960e93a7ca5..647e1e2d5b7b 100644 --- a/packages/seacas/libraries/exodus/src/ex_int_get_block_param.c +++ b/packages/seacas/libraries/exodus/src/ex_int_get_block_param.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -17,7 +17,7 @@ static int el_node_count_error(int exoid, struct exi_elem_blk_parm elem_blk_parm snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: An element of type '%s' with %d nodes is not valid.", elem_blk_parms.elem_type, elem_blk_parms.num_nodes_per_elem); ex_err_fn(exoid, __func__, errmsg, EX_MSG); - return (EX_FATAL); + return EX_FATAL; } int exi_get_block_param(int exoid, ex_entity_id id, int ndim, diff --git a/packages/seacas/libraries/exodus/src/ex_ne_util.c b/packages/seacas/libraries/exodus/src/ex_ne_util.c index 1161820445f6..be897605db3d 100644 --- a/packages/seacas/libraries/exodus/src/ex_ne_util.c +++ b/packages/seacas/libraries/exodus/src/ex_ne_util.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -46,7 +46,7 @@ int nei_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id n snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to find variable ID for \"%s\" in file ID %d", ne_var_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* check if I need the length for this variable */ @@ -62,7 +62,7 @@ int nei_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id n "in file ID %d", ne_var_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* Get the length of this variable */ @@ -73,7 +73,7 @@ int nei_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id n "ERROR: failed to find dimension for variable \"%s\" in file ID %d", ne_var_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } idx[1] = length; @@ -94,7 +94,7 @@ int nei_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id n snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to find variable \"%s\" in file ID %d", ne_var_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } if (id_val == ne_var_id) { @@ -102,7 +102,7 @@ int nei_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id n break; } } - return (ret); + return ret; } /*****************************************************************************/ diff --git a/packages/seacas/libraries/exodus/src/ex_open.c b/packages/seacas/libraries/exodus/src/ex_open.c index baac050f4a14..91901eb62ba1 100644 --- a/packages/seacas/libraries/exodus/src/ex_open.c +++ b/packages/seacas/libraries/exodus/src/ex_open.c @@ -190,6 +190,8 @@ int ex_open_int(const char *path, int mode, int *comp_ws, int *io_ws, float *ver "issue.\n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #else /* This is an hdf5 (netcdf4) file. If NC_HAS_HDF5 is not defined, then we either don't have hdf5 support in this netcdf version, @@ -206,6 +208,8 @@ int ex_open_int(const char *path, int mode, int *comp_ws, int *io_ws, float *ver "other issue.\n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #endif } else if (type == 4) { @@ -217,6 +221,8 @@ int ex_open_int(const char *path, int mode, int *comp_ws, int *io_ws, float *ver "issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #else /* This is an cdf5 (64BIT_DATA) file. If NC_64BIT_DATA is not defined, then we either don't have cdf5 support in this netcdf version, @@ -233,6 +239,8 @@ int ex_open_int(const char *path, int mode, int *comp_ws, int *io_ws, float *ver "other issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #endif } diff --git a/packages/seacas/libraries/exodus/src/ex_open_par.c b/packages/seacas/libraries/exodus/src/ex_open_par.c index 5bfad214c030..8b91169b5c43 100644 --- a/packages/seacas/libraries/exodus/src/ex_open_par.c +++ b/packages/seacas/libraries/exodus/src/ex_open_par.c @@ -222,6 +222,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #else /* This is an hdf5 (netcdf4) file. If NC_HAS_HDF5 is not defined, then we either don't have hdf5 support in this netcdf version, @@ -238,6 +240,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "other issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #endif } else if (type == 4) { @@ -249,6 +253,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #else /* This is an cdf5 (64BIT_DATA) file. If NC_64BIT_DATA is not defined, then we either don't have cdf5 support in this netcdf version, @@ -265,6 +271,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "other issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #endif } else if (type == 1 || type == 2) { @@ -277,6 +285,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "issue \n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #else /* This is an normal NetCDF format file, for parallel reading, the PNetCDF library is required but that is not compiled into this version. @@ -287,6 +297,8 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "built with PNetCDF support as required for parallel access to this file.\n", canon_path); ex_err(__func__, errmsg, status); + free(canon_path); + EX_FUNC_LEAVE(EX_FATAL); #endif } @@ -294,7 +306,7 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float "ERROR: failed to open %s of type %d for reading.\n\t\tThe " "file does not exist, or there is a permission or file " "format issue.", - canon_path); + canon_path, type); ex_err(__func__, errmsg, status); free(canon_path); EX_FUNC_LEAVE(EX_FATAL); @@ -384,12 +396,10 @@ int ex_open_par_int(const char *path, int mode, int *comp_ws, int *io_ws, float int ngatts; /* number of global attributes */ int recdimid; /* id of unlimited dimension */ - int varid; - /* Determine number of variables on the database... */ nc_inq(exoid, &ndims, &nvars, &ngatts, &recdimid); - for (varid = 0; varid < nvars; varid++) { + for (int varid = 0; varid < nvars; varid++) { struct ncvar var; nc_inq_var(exoid, varid, var.name, &var.type, &var.ndims, var.dims, &var.natts); diff --git a/packages/seacas/libraries/exodus/src/ex_put_all_var_param_ext.c b/packages/seacas/libraries/exodus/src/ex_put_all_var_param_ext.c index 7bcf30eb1ef9..be763293f47e 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_all_var_param_ext.c +++ b/packages/seacas/libraries/exodus/src/ex_put_all_var_param_ext.c @@ -356,7 +356,7 @@ static int define_dimension(int exoid, const char *DIMENSION, int count, const c ex_err_fn(exoid, __func__, errmsg, status); } } - return (status); + return status; } static int define_variable_name_variable(int exoid, const char *VARIABLE, int dimension, @@ -387,7 +387,7 @@ static int define_variable_name_variable(int exoid, const char *VARIABLE, int di int fill = NC_FILL_CHAR; nc_def_var_fill(exoid, variable, 0, &fill); #endif - return (status); + return status; } static int *get_status_array(int exoid, int var_count, const char *VARIABLE, const char *label) @@ -399,7 +399,7 @@ static int *get_status_array(int exoid, int var_count, const char *VARIABLE, con snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to allocate memory for %s status array for file id %d", label, exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (NULL); + return NULL; } /* get variable id of status array */ @@ -415,7 +415,7 @@ static int *get_status_array(int exoid, int var_count, const char *VARIABLE, con snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get %s status array from file id %d", label, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (NULL); + return NULL; } } else { @@ -489,7 +489,7 @@ static int define_truth_table(ex_entity_type obj_type, int exoid, int num_ent, i "ERROR: failed to locate number of entities in %s %" PRId64 " in file id %d", label, id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); + return status; } /* define netCDF variable to store variable values; @@ -506,7 +506,7 @@ static int define_truth_table(ex_entity_type obj_type, int exoid, int num_ent, i "ERROR: failed to define %s variable for %s %" PRId64 " in file id %d", label, label, id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); + return status; } } exi_compress_variable(exoid, varid, 2); diff --git a/packages/seacas/libraries/exodus/src/ex_put_assemblies.c b/packages/seacas/libraries/exodus/src/ex_put_assemblies.c index a731215b546a..a8ee3e14d470 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_assemblies.c +++ b/packages/seacas/libraries/exodus/src/ex_put_assemblies.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -37,8 +37,8 @@ int ex_put_assemblies(int exoid, size_t count, const struct ex_assembly *assembl int *entlst_id = (int *)calloc(count, sizeof(int)); - int max_name_len = 0; - bool in_define = false; + size_t max_name_len = 0; + bool in_define = false; for (size_t i = 0; i < count; i++) { /* See if an assembly with this id has already been defined or exists on file... */ if (nc_inq_varid(exoid, VAR_ENTITY_ASSEMBLY(assemblies[i].id), &entlst_id[i]) != NC_NOERR) { @@ -176,7 +176,9 @@ int ex_put_assemblies(int exoid, size_t count, const struct ex_assembly *assembl } /* Update the maximum_name_length attribute on the file. */ - exi_update_max_name_length(exoid, max_name_len - 1); + if (max_name_len > 0) { + exi_update_max_name_length(exoid, max_name_len - 1); + } /* Assembly are now all defined; see if any set data needs to be output... */ for (size_t i = 0; i < count; i++) { diff --git a/packages/seacas/libraries/exodus/src/ex_put_block_params.c b/packages/seacas/libraries/exodus/src/ex_put_block_params.c index b6d16dd3ccd8..a30774b2d59e 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_block_params.c +++ b/packages/seacas/libraries/exodus/src/ex_put_block_params.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -55,7 +55,7 @@ int ex_put_block_params(int exoid, size_t block_count, const struct ex_block *bl const char *dnfpe = NULL; if (block_count == 0) { - return (EX_NOERR); + return EX_NOERR; } EX_FUNC_ENTER(); @@ -584,13 +584,12 @@ int ex_put_block_params(int exoid, size_t block_count, const struct ex_block *bl */ size_t count[2]; char *text = ""; - size_t j; count[0] = 1; start[1] = 0; count[1] = strlen(text) + 1; - for (j = 0; j < blocks[i].num_attribute; j++) { + for (int64_t j = 0; j < blocks[i].num_attribute; j++) { start[0] = j; nc_put_vara_text(exoid, att_name_varid, start, count, text); } diff --git a/packages/seacas/libraries/exodus/src/ex_put_concat_elem_block.c b/packages/seacas/libraries/exodus/src/ex_put_concat_elem_block.c index 92ce78b781b0..1e59fd48909d 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_concat_elem_block.c +++ b/packages/seacas/libraries/exodus/src/ex_put_concat_elem_block.c @@ -80,13 +80,13 @@ int ex_put_concat_elem_block(int exoid, const void_int *elem_blk_id, char *const } if (ex_int64_status(exoid) & EX_IDS_INT64_API) { - for (i = 0; i < num_elem_blk; i++) { - eb_array[i] = (((int64_t *)num_elem_this_blk)[i] == 0) ? 0 : 1; + for (int ib = 0; ib < num_elem_blk; ib++) { + eb_array[ib] = (((int64_t *)num_elem_this_blk)[ib] == 0) ? 0 : 1; } } else { - for (i = 0; i < num_elem_blk; i++) { - eb_array[i] = (((int *)num_elem_this_blk)[i] == 0) ? 0 : 1; + for (int ib = 0; ib < num_elem_blk; ib++) { + eb_array[ib] = (((int *)num_elem_this_blk)[ib] == 0) ? 0 : 1; } } diff --git a/packages/seacas/libraries/exodus/src/ex_put_conn.c b/packages/seacas/libraries/exodus/src/ex_put_conn.c index cc1497a82286..c0393593b888 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_conn.c +++ b/packages/seacas/libraries/exodus/src/ex_put_conn.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -26,7 +26,7 @@ int ex_int_write_conn(int exoid, ex_entity_id blk_id, const char *type, int var_ "ERROR: failed to write connectivity array for %s block %" PRId64 " in file id %d", type, blk_id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); + return status; } return status; } diff --git a/packages/seacas/libraries/exodus/src/ex_put_field_metadata.c b/packages/seacas/libraries/exodus/src/ex_put_field_metadata.c index ff388de656db..db5fa2fe4d66 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_field_metadata.c +++ b/packages/seacas/libraries/exodus/src/ex_put_field_metadata.c @@ -76,10 +76,10 @@ int ex_put_field_metadata(int exoid, const ex_field field) #endif exi_persist_redef(exoid, __func__); - int status = 0; - static char *field_template = "Field@%s@%s"; - char attribute_name[NC_MAX_NAME + 1]; - sprintf(attribute_name, field_template, field.name, "type"); + int status = 0; + static const char *field_template = "Field@%s@%s"; + char attribute_name[NC_MAX_NAME + 1]; + snprintf(attribute_name, NC_MAX_NAME + 1, field_template, field.name, "type"); if ((status = ex_put_integer_attribute(exoid, field.entity_type, field.entity_id, attribute_name, field.nesting, field.type)) != EX_NOERR) { exi_persist_leavedef(exoid, __func__); @@ -89,7 +89,7 @@ int ex_put_field_metadata(int exoid, const ex_field field) /* Do not write if empty... */ if (field.type_name[0] != '\0') { - sprintf(attribute_name, field_template, field.name, "type_name"); + snprintf(attribute_name, NC_MAX_NAME + 1, field_template, field.name, "type_name"); if ((status = ex_put_text_attribute(exoid, field.entity_type, field.entity_id, attribute_name, field.type_name)) != EX_NOERR) { exi_persist_leavedef(exoid, __func__); @@ -100,7 +100,7 @@ int ex_put_field_metadata(int exoid, const ex_field field) /* Default component_separator is '_'. Avoid writing if that is what it is... */ if (field.component_separator[0] != '_' || field.nesting > 1) { - sprintf(attribute_name, field_template, field.name, "separator"); + snprintf(attribute_name, NC_MAX_NAME + 1, field_template, field.name, "separator"); if ((status = ex_put_text_attribute(exoid, field.entity_type, field.entity_id, attribute_name, field.component_separator)) != EX_NOERR) { exi_persist_leavedef(exoid, __func__); @@ -117,7 +117,7 @@ int ex_put_field_metadata(int exoid, const ex_field field) } } if (needs_cardinality) { - sprintf(attribute_name, field_template, field.name, "cardinality"); + snprintf(attribute_name, NC_MAX_NAME + 1, field_template, field.name, "cardinality"); if ((status = ex_put_integer_attribute(exoid, field.entity_type, field.entity_id, attribute_name, field.nesting, field.cardinality)) != EX_NOERR) { @@ -136,9 +136,9 @@ int exi_put_type_attribute(int exoid, const char *att_root, const char *name, co { int status = EX_NOERR; if (entry != NULL) { - static char *template = "%s@%s@%s"; + static const char *template = "%s@%s@%s"; char attribute_name[NC_MAX_NAME + 1]; - sprintf(attribute_name, template, att_root, name, type); + snprintf(attribute_name, NC_MAX_NAME + 1, template, att_root, name, type); if (value_type == EX_INTEGER) { status = ex_put_integer_attribute(exoid, EX_GLOBAL, 0, attribute_name, cardinality, entry); } @@ -300,8 +300,8 @@ int ex_put_field_suffices(int exoid, const ex_field field, const char *suffices) int status; char errmsg[MAX_ERR_LENGTH]; - char attribute_name[NC_MAX_NAME + 1]; - static char *field_template = "Field@%s@%s"; + char attribute_name[NC_MAX_NAME + 1]; + static const char *field_template = "Field@%s@%s"; if (field.type[0] != EX_FIELD_TYPE_USER_DEFINED) { snprintf( @@ -329,7 +329,7 @@ int ex_put_field_suffices(int exoid, const ex_field field, const char *suffices) return EX_FATAL; } - sprintf(attribute_name, field_template, field.name, "suffices"); + snprintf(attribute_name, NC_MAX_NAME + 1, field_template, field.name, "suffices"); if ((status = ex_put_text_attribute(exoid, field.entity_type, field.entity_id, attribute_name, suffices)) != EX_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, diff --git a/packages/seacas/libraries/exodus/src/ex_put_init.c b/packages/seacas/libraries/exodus/src/ex_put_init.c index 4b7ebc07e8dd..7f8a72dc26c9 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_init.c +++ b/packages/seacas/libraries/exodus/src/ex_put_init.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -76,5 +76,5 @@ int ex_put_init(int exoid, const char *title, int64_t num_dim, int64_t num_nodes par.num_elem_maps = 0; par.num_assembly = 0; - return (ex_put_init_ext(exoid, &par)); + return ex_put_init_ext(exoid, &par); } diff --git a/packages/seacas/libraries/exodus/src/ex_put_init_ext.c b/packages/seacas/libraries/exodus/src/ex_put_init_ext.c index e07e8434444b..ccf305255517 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_init_ext.c +++ b/packages/seacas/libraries/exodus/src/ex_put_init_ext.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -55,7 +55,7 @@ static int ex_write_object_names(int exoid, const char *type, const char *dimens snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define %s name array in file id %d", type, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } exi_set_compact_storage(exoid, varid); #if defined(EX_CAN_USE_NC_DEF_VAR_FILL) @@ -63,7 +63,7 @@ static int ex_write_object_names(int exoid, const char *type, const char *dimens nc_def_var_fill(exoid, varid, 0, &fill); #endif } - return (NC_NOERR); + return EX_NOERR; } static int ex_write_object_params(int exoid, const char *type, const char *dimension_name, @@ -79,7 +79,7 @@ static int ex_write_object_params(int exoid, const char *type, const char *dimen snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define number of %ss in file id %d", type, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } /* ...and some variables */ /* element block id status array */ @@ -91,10 +91,10 @@ static int ex_write_object_params(int exoid, const char *type, const char *dimen snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define %s status array in file id %d", type, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } - int sixty_four_kb = 64 * 1024; // Compact storage can only be used for < 64KiByte data sizes + size_t sixty_four_kb = 64 * 1024; // Compact storage can only be used for < 64KiByte data sizes if (4 * count < sixty_four_kb) { exi_set_compact_storage(exoid, varid); } @@ -112,7 +112,7 @@ static int ex_write_object_params(int exoid, const char *type, const char *dimen snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define %s id array in file id %d", type, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } if (int_size * count < sixty_four_kb) { exi_set_compact_storage(exoid, varid); @@ -124,10 +124,10 @@ static int ex_write_object_params(int exoid, const char *type, const char *dimen snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store %s property name %s in file id %d", type, "ID", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); + return status; } } - return (NC_NOERR); + return EX_NOERR; } static int ex_write_map_params(int exoid, const char *map_name, const char *map_dim_name, @@ -147,7 +147,7 @@ static int ex_write_map_params(int exoid, const char *map_name, const char *map_ snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define number of %ss in file id %d", map_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } int dim[] = {*map_dimension}; @@ -159,7 +159,7 @@ static int ex_write_map_params(int exoid, const char *map_name, const char *map_ snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to define %s id array in file id %d", map_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (status); /* exit define mode and return */ + return status; /* exit define mode and return */ } /* store property name as attribute of property array variable */ @@ -168,10 +168,10 @@ static int ex_write_map_params(int exoid, const char *map_name, const char *map_ snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store %s property name %s in file id %d", map_name, "ID", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } - return (NC_NOERR); + return EX_NOERR; } static void invalidate_id_status(int exoid, const char *var_stat, const char *var_id, int count, @@ -293,10 +293,18 @@ int ex_put_init_ext(int exoid, const ex_init_params *model) ex_err_fn(exoid, __func__, errmsg, status); goto error_ret; } + { struct exi_file_item *file = exi_find_file_item(exoid); - file->time_varid = temp; + if (!file) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: unknown file id %d.", exoid); + ex_err_fn(exoid, __func__, errmsg, EX_BADFILEID); + goto error_ret; + } + file->time_varid = temp; } + exi_compress_variable(exoid, temp, -2); /* Don't compress, but do set collective io */ if (model->num_dim > 0) { @@ -542,8 +550,8 @@ int ex_put_init_ext(int exoid, const ex_init_params *model) /* Fill the id and status arrays with EX_INVALID_ID */ { - int *invalid_ids = NULL; - size_t maxset = model->num_elem_blk; + int *invalid_ids = NULL; + int64_t maxset = model->num_elem_blk; if (maxset < model->num_edge_blk) { maxset = model->num_edge_blk; } diff --git a/packages/seacas/libraries/exodus/src/ex_put_partial_coord_component.c b/packages/seacas/libraries/exodus/src/ex_put_partial_coord_component.c index e2ec6aa72ce8..83e8b7f03037 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_partial_coord_component.c +++ b/packages/seacas/libraries/exodus/src/ex_put_partial_coord_component.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -79,7 +79,7 @@ int ex_put_partial_coord_component(int exoid, int64_t start_node_num, int64_t nu EX_FUNC_LEAVE(EX_FATAL); } - if (component > num_dim) { + if (component > (int)num_dim) { char errmsg[MAX_ERR_LENGTH]; snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Component (%d) is larger than number of dimensions (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_put_partial_num_map.c b/packages/seacas/libraries/exodus/src/ex_put_partial_num_map.c index 1f111503f239..e1569edd3d9b 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_partial_num_map.c +++ b/packages/seacas/libraries/exodus/src/ex_put_partial_num_map.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2022 National Technology & Engineering Solutions + * Copyright(C) 1999-2022, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -163,7 +163,7 @@ int ex_put_partial_num_map(int exoid, ex_entity_type map_type, ex_entity_id map_ ent_start = 0; } - if (ent_start < 0 || ent_start > num_mobj) { + if (ent_start < 0 || ent_start > (int64_t)num_mobj) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start count is invalid in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); EX_FUNC_LEAVE(EX_FATAL); @@ -173,7 +173,7 @@ int ex_put_partial_num_map(int exoid, ex_entity_type map_type, ex_entity_id map_ ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); EX_FUNC_LEAVE(EX_FATAL); } - if (ent_count > 0 && (ent_start + ent_count - 1 > num_mobj)) { + if (ent_count > 0 && (ent_start + ent_count - 1 > (int64_t)num_mobj)) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start+count-1 is larger than mesh object count in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); diff --git a/packages/seacas/libraries/exodus/src/ex_put_partial_one_attr.c b/packages/seacas/libraries/exodus/src/ex_put_partial_one_attr.c index 11223c3528b2..20febe548408 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_partial_one_attr.c +++ b/packages/seacas/libraries/exodus/src/ex_put_partial_one_attr.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -137,7 +137,7 @@ int ex_put_partial_one_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj EX_FUNC_LEAVE(EX_FATAL); } - if (start_num + num_ent - 1 > num_entries_this_obj) { + if (start_num + num_ent - 1 > (int64_t)num_entries_this_obj) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: start index (%" PRId64 ") + count (%" PRId64 ") is larger than total number of entities (%zu) in file id %d", diff --git a/packages/seacas/libraries/exodus/src/ex_put_partial_var.c b/packages/seacas/libraries/exodus/src/ex_put_partial_var.c index bc62bca91732..a0b6066a02de 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_partial_var.c +++ b/packages/seacas/libraries/exodus/src/ex_put_partial_var.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -31,7 +31,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, VOBJID, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } obj_id_ndx = obj_id; } @@ -42,7 +42,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, VOBJID, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } obj_id_ndx = obj_id; } @@ -58,14 +58,14 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex "Warning: no variables allowed for NULL block %" PRId64 " in file id %d", obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, EX_NULLENTITY); - return (EX_WARN); + return EX_WARN; } snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, VOBJID, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } } @@ -79,13 +79,13 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex status = exi_get_dimension(exoid, DNUMOBJ, ex_name_of_object(var_type), &num_obj, &dimid, __func__); if (status != NC_NOERR) { - return (status); + return status; } status = exi_get_dimension(exoid, DNUMOBJVAR, ex_name_of_object(var_type), &num_obj_var, &dimid, __func__); if (status != NC_NOERR) { - return (status); + return status; } if (!(obj_var_truth_tab = malloc(num_obj * num_obj_var * sizeof(int)))) { @@ -94,7 +94,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex "truth table in file id %d", ex_name_of_object(var_type), exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (EX_FATAL); + return EX_FATAL; } /* read in the TNAME variable truth table */ @@ -102,7 +102,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get truth table from file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } if (obj_var_truth_tab[num_obj_var * (obj_id_ndx - 1) + var_index - 1] == 0L) { @@ -111,7 +111,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex errmsg, MAX_ERR_LENGTH, "ERROR: Invalid %s variable %d, %s %" PRId64 " in file id %d", ex_name_of_object(var_type), var_index, ex_name_of_object(var_type), obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); - return (EX_FATAL); + return EX_FATAL; } free(obj_var_truth_tab); } @@ -130,7 +130,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex if ((status = exi_redef(exoid, __func__)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to put file id %d into define mode", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* define netCDF variable to store TNAME variable values */ @@ -147,7 +147,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex /* leave define mode */ if ((status = exi_leavedef(exoid, __func__)) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } else { @@ -155,15 +155,15 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex ex_name_of_object(var_type), exi_name_var_of_object(var_type, var_index, obj_id_ndx), exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } - return (EX_NOERR); + return EX_NOERR; /* Fatal error: exit definition mode and return */ error_ret: exi_leavedef(exoid, __func__); - return (EX_FATAL); + return EX_FATAL; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_put_prop.c b/packages/seacas/libraries/exodus/src/ex_put_prop.c index 9300d2fb3026..9f6ed4b779e3 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_prop.c +++ b/packages/seacas/libraries/exodus/src/ex_put_prop.c @@ -243,7 +243,8 @@ int ex_put_prop(int exoid, ex_entity_type obj_type, ex_entity_id obj_id, const c vals[0] = 0; /* fill value */ /* create attribute to cause variable to fill with zeros per routine spec */ - if ((status = nc_put_att_longlong(exoid, propid, _FillValue, int_type, 1, vals)) != NC_NOERR) { + if ((status = nc_put_att_longlong(exoid, propid, NC_FillValue, int_type, 1, vals)) != + NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to create property name fill attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); diff --git a/packages/seacas/libraries/exodus/src/ex_put_prop_names.c b/packages/seacas/libraries/exodus/src/ex_put_prop_names.c index bcf063f05012..5a8816e19e8e 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_prop_names.c +++ b/packages/seacas/libraries/exodus/src/ex_put_prop_names.c @@ -172,7 +172,8 @@ int ex_put_prop_names(int exoid, ex_entity_type obj_type, int num_props, char ** /* create attribute to cause variable to fill with zeros per routine spec */ - if ((status = nc_put_att_longlong(exoid, propid, _FillValue, int_type, 1, vals)) != NC_NOERR) { + if ((status = nc_put_att_longlong(exoid, propid, NC_FillValue, int_type, 1, vals)) != + NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to create property name fill attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); diff --git a/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_names.c b/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_names.c index 22db5ede7985..ca17283ca875 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_names.c +++ b/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_names.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -54,9 +54,9 @@ static int ex_put_var_names_int(int exoid, ex_entity_type obj_type, int num_vars tname, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_param.c b/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_param.c index d3d28c85685d..f4b6b26db22e 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_param.c +++ b/packages/seacas/libraries/exodus/src/ex_put_reduction_variable_param.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -34,14 +34,14 @@ static int exi_prepare_result_var(int exoid, int num_vars, char *type_name, char "ERROR: failed to define number of %s variables in file id %d", type_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); /* exit define mode and return */ + return EX_FATAL; /* exit define mode and return */ } /* Now define type_name variable name variable */ if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &dim_str_name)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get string length in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } dims[0] = dimid; @@ -57,13 +57,13 @@ static int exi_prepare_result_var(int exoid, int num_vars, char *type_name, char type_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); /* exit define mode and return */ + return EX_FATAL; /* exit define mode and return */ } #if defined(EX_CAN_USE_NC_DEF_VAR_FILL) int fill = NC_FILL_CHAR; nc_def_var_fill(exoid, varid, 0, &fill); #endif - return (EX_NOERR); + return EX_NOERR; } /*! \endcond */ diff --git a/packages/seacas/libraries/exodus/src/ex_put_reduction_vars.c b/packages/seacas/libraries/exodus/src/ex_put_reduction_vars.c index f39948bcd026..301f032a3745 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_reduction_vars.c +++ b/packages/seacas/libraries/exodus/src/ex_put_reduction_vars.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -23,7 +23,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, var_obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } obj_id_ndx = obj_id; } @@ -34,7 +34,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, var_obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } obj_id_ndx = obj_id; } @@ -50,14 +50,14 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ "Warning: no variables allowed for NULL block %" PRId64 " in file id %d", obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, EX_NULLENTITY); - return (EX_WARN); + return EX_WARN; } snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate %s id %" PRId64 " in %s array in file id %d", ex_name_of_object(var_type), obj_id, var_obj_id, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } } @@ -87,7 +87,7 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ if ((status = exi_redef(exoid, __func__)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to put file id %d into define mode", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* define NetCDF variable to store reduction variable values */ @@ -98,13 +98,13 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ ex_name_of_object(var_type), exoid); ex_err_fn(exoid, __func__, errmsg, status); exi_leavedef(exoid, __func__); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exoid, *varid, 2); /* leave define mode */ if ((status = exi_leavedef(exoid, __func__)) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } else { @@ -112,10 +112,10 @@ static int exi_look_up_var(int exoid, ex_entity_type var_type, ex_entity_id obj_ ex_name_of_object(var_type), exi_name_red_var_of_object(var_type, obj_id_ndx), exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } - return (EX_NOERR); + return EX_NOERR; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_put_variable_names.c b/packages/seacas/libraries/exodus/src/ex_put_variable_names.c index 00303bb6326d..58248c8b998a 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_variable_names.c +++ b/packages/seacas/libraries/exodus/src/ex_put_variable_names.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -43,7 +43,7 @@ static int ex_put_var_names_int(int exoid, char *tname, char *dnumvar, char *vna "ERROR: failed to locate number of %s variables in file id %d", tname, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_inq_varid(exoid, vnames, varid)) != NC_NOERR) { @@ -57,9 +57,9 @@ static int ex_put_var_names_int(int exoid, char *tname, char *dnumvar, char *vna tname, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } /*! diff --git a/packages/seacas/libraries/exodus/src/ex_put_variable_param.c b/packages/seacas/libraries/exodus/src/ex_put_variable_param.c index e19a10833f5f..3e48464c3cc9 100644 --- a/packages/seacas/libraries/exodus/src/ex_put_variable_param.c +++ b/packages/seacas/libraries/exodus/src/ex_put_variable_param.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -34,14 +34,14 @@ static int ex_prepare_result_var(int exoid, int num_vars, char *type_name, char "ERROR: failed to define number of %s variables in file id %d", type_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); /* exit define mode and return */ + return EX_FATAL; /* exit define mode and return */ } /* Now define type_name variable name variable */ if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &dim_str_name)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get string length in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } dims[0] = dimid; @@ -57,14 +57,14 @@ static int ex_prepare_result_var(int exoid, int num_vars, char *type_name, char type_name, exoid); ex_err_fn(exoid, __func__, errmsg, status); } - return (EX_FATAL); /* exit define mode and return */ + return EX_FATAL; /* exit define mode and return */ } exi_set_compact_storage(exoid, varid); #if defined(EX_CAN_USE_NC_DEF_VAR_FILL) int fill = NC_FILL_CHAR; nc_def_var_fill(exoid, varid, 0, &fill); #endif - return (EX_NOERR); + return EX_NOERR; } /*! \endcond */ diff --git a/packages/seacas/libraries/exodus/src/ex_utils.c b/packages/seacas/libraries/exodus/src/ex_utils.c index 0c33d625a32f..ca6fe97c42c5 100644 --- a/packages/seacas/libraries/exodus/src/ex_utils.c +++ b/packages/seacas/libraries/exodus/src/ex_utils.c @@ -110,6 +110,16 @@ const char *ex_config(void) #else j += snprintf(buffer + j, buffer_size - j, "\t\tSZip Compression (read/write) NOT enabled\n"); #endif +#if NC_HAS_ZSTD == 1 + j += snprintf(buffer + j, buffer_size - j, "\t\tZstd Compression enabled\n"); +#else + j += snprintf(buffer + j, buffer_size - j, "\t\tZstd Compression NOT enabled\n"); +#endif +#if NC_HAS_QUANTIZE == 1 + j += snprintf(buffer + j, buffer_size - j, "\t\tQuanization support enabled\n"); +#else + j += snprintf(buffer + j, buffer_size - j, "\t\tQuanization support NOT enabled\n"); +#endif #endif #endif #if defined(PARALLEL_AWARE_EXODUS) @@ -193,7 +203,7 @@ int exi_check_file_type(const char *path, int *type) FILE *fp; if (!(fp = fopen(path, "r"))) { char errmsg[MAX_ERR_LENGTH]; - snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Could not open file '%s', error = %s.", path, + snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Could not open file '%s',\n\t\terror = %s.", path, strerror(errno)); ex_err(__func__, errmsg, EX_WRONGFILETYPE); EX_FUNC_LEAVE(EX_FATAL); @@ -203,8 +213,9 @@ int exi_check_file_type(const char *path, int *type) fclose(fp); if (i != MAGIC_NUMBER_LEN) { char errmsg[MAX_ERR_LENGTH]; - snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Could not read magic data from file '%s', err = %s.", - path, strerror(errno)); + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Could not read magic data from file '%s',\n\t\terror = %s.", path, + strerror(errno)); ex_err(__func__, errmsg, EX_WRONGFILETYPE); EX_FUNC_LEAVE(EX_FATAL); } @@ -337,7 +348,7 @@ int exi_put_names(int exoid, int varid, size_t num_names, char *const *names, found_name = 1; ex_copy_string(&int_names[idx], names[i], name_length); size_t length = strlen(names[i]) + 1; - if (length > name_length) { + if (length > (size_t)name_length) { fprintf(stderr, "Warning: The %s %s name '%s' is too long.\n\tIt will " "be truncated from %d to %d characters. [Called from %s]\n", @@ -346,7 +357,7 @@ int exi_put_names(int exoid, int varid, size_t num_names, char *const *names, length = name_length; } - if (length > max_name_len) { + if (length > (size_t)max_name_len) { max_name_len = length; } } @@ -412,7 +423,7 @@ int exi_put_name(int exoid, int varid, size_t index, const char *name, ex_entity snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store %s name in file id %d", ex_name_of_object(obj_type), exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* Add the trailing null if the variable name was too long */ @@ -424,7 +435,7 @@ int exi_put_name(int exoid, int varid, size_t index, const char *name, ex_entity /* Update the maximum_name_length attribute on the file. */ exi_update_max_name_length(exoid, count[1] - 1); } - return (EX_NOERR); + return EX_NOERR; } /*! @@ -444,10 +455,10 @@ int exi_get_names(int exoid, int varid, size_t num_names, char **names, ex_entit for (size_t i = 0; i < num_names; i++) { int status = exi_get_name(exoid, varid, i, names[i], name_size, obj_type, routine); if (status != NC_NOERR) { - return (status); + return status; } } - return (EX_NOERR); + return EX_NOERR; } /*! @@ -472,14 +483,14 @@ int exi_get_name(int exoid, int varid, size_t index, char *name, int name_size, "ERROR: failed to get %s name at index %d from file id %d [Called from %s]", ex_name_of_object(obj_type), (int)index, exoid, routine); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH); name[api_name_size] = '\0'; exi_trim(name); - return (EX_NOERR); + return EX_NOERR; } /*! @@ -521,7 +532,7 @@ char *exi_catstr(const char *string, int num) if (cur_string - ret_string > 9 * (MAX_VAR_NAME_LENGTH + 1)) { cur_string = ret_string; } - return (tmp_string); + return tmp_string; } /** exi_catstr2 - concatenate string1num1string2num2 */ @@ -538,7 +549,7 @@ char *exi_catstr2(const char *string1, int num1, const char *string2, int num2) if (cur_string - ret_string > 9 * (MAX_VAR_NAME_LENGTH + 1)) { cur_string = ret_string; } - return (tmp_string); + return tmp_string; } /*! @@ -640,7 +651,7 @@ char *exi_dim_num_objects(ex_entity_type obj_type) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: object type %d not supported in call to %s", obj_type, __func__); ex_err(__func__, errmsg, EX_BADPARAM); - return (NULL); + return NULL; } } } @@ -695,7 +706,7 @@ char *exi_name_var_of_object(ex_entity_type obj_type, int i, int j) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: object type %d not supported in call to %s", obj_type, __func__); ex_err(__func__, errmsg, EX_BADPARAM); - return (NULL); + return NULL; } } } @@ -722,7 +733,7 @@ char *exi_name_red_var_of_object(ex_entity_type obj_type, int id) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: object type %d not supported in call to %s", obj_type, __func__); ex_err(__func__, errmsg, EX_BADPARAM); - return (NULL); + return NULL; } } } @@ -781,8 +792,8 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) char errmsg[MAX_ERR_LENGTH]; switch (id_type) { - case EX_NODAL: return (0); - case EX_GLOBAL: return (0); + case EX_NODAL: return 0; + case EX_GLOBAL: return 0; case EX_ASSEMBLY: return num; case EX_BLOB: return num; case EX_ELEM_BLOCK: @@ -861,7 +872,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: unsupported id array type %d for file id %d", id_type, exoid); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); - return (EX_FATAL); + return EX_FATAL; } if ((tmp_stats->id_vals == NULL) || (!(tmp_stats->valid_ids))) { @@ -875,7 +886,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate id array dimension in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* Next get value of dimension */ @@ -883,7 +894,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate %s array length in file id %d", id_table, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* get variable id of id array */ @@ -891,7 +902,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate %s array in file id %d", id_table, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* allocate space for id array and initialize to zero to ensure @@ -900,7 +911,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to allocate memory for %s array for file id %d", id_table, exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (EX_FATAL); + return EX_FATAL; } if (ex_int64_status(exoid) & EX_IDS_INT64_API) { @@ -915,12 +926,12 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); free(id_vals); - return (EX_FATAL); + return EX_FATAL; } status = nc_get_var_int(exoid, varid, id_vals_int); if (status == NC_NOERR) { - for (i = 0; i < dim_len; i++) { - id_vals[i] = (int64_t)id_vals_int[i]; + for (size_t iii = 0; iii < dim_len; iii++) { + id_vals[iii] = (int64_t)id_vals_int[iii]; } } free(id_vals_int); @@ -931,17 +942,17 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) exoid); ex_err_fn(exoid, __func__, errmsg, status); free(id_vals); - return (EX_FATAL); + return EX_FATAL; } /* check if values in stored arrays are filled with non-zeroes */ bool filled = true; sequential = true; - for (i = 0; i < dim_len; i++) { - if (id_vals[i] != i + 1) { + for (size_t iii = 0; iii < dim_len; iii++) { + if (id_vals[iii] != (int64_t)iii + 1) { sequential = false; } - if (id_vals[i] == EX_INVALID_ID || id_vals[i] == NC_FILL_INT) { + if (id_vals[iii] == EX_INVALID_ID || id_vals[iii] == NC_FILL_INT) { filled = false; sequential = false; break; /* id array hasn't been completely filled with valid ids yet */ @@ -961,19 +972,19 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) sequential = tmp_stats->sequential; } - if (sequential && num < dim_len) { + if (sequential && (size_t)num < dim_len) { i = num - 1; } else { /* Do a linear search through the id array to find the array value corresponding to the passed index number */ - for (i = 0; i < dim_len; i++) { + for (i = 0; i < (int64_t)dim_len; i++) { if (id_vals[i] == num) { break; /* found the id requested */ } } } - if (i >= dim_len) /* failed to find id number */ + if (i >= (int64_t)dim_len) /* failed to find id number */ { if (!(tmp_stats->valid_ids)) { free(id_vals); @@ -981,7 +992,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to locate id %" PRId64 " for file id %d", num, exoid); ex_set_err(__func__, errmsg, EX_LOOKUPFAIL); - return (-EX_LOOKUPFAIL); /*if we got here, the id array value doesn't exist */ + return -EX_LOOKUPFAIL; /*if we got here, the id array value doesn't exist */ } /* Now check status array to see if object is null */ @@ -993,7 +1004,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to allocate memory for %s array for file id %d", id_table, exoid); ex_err_fn(exoid, __func__, errmsg, EX_MEMFAIL); - return (EX_FATAL); + return EX_FATAL; } /* first time through or status arrays haven't been filled yet */ @@ -1008,7 +1019,7 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to get %s array from file id %d", stat_table, exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } else { @@ -1036,12 +1047,12 @@ int exi_id_lkup(int exoid, ex_entity_type id_type, ex_entity_id num) if (!(tmp_stats->valid_stat)) { free(stat_vals); } - return (-((int)i + 1)); /* return index into id array (1-based) */ + return -((int)i + 1); /* return index into id array (1-based) */ } if (!(tmp_stats->valid_stat)) { free(stat_vals); } - return (i + 1); /* return index into id array (1-based) */ + return i + 1; /* return index into id array (1-based) */ } /****************************************************************************** @@ -1164,7 +1175,7 @@ struct exi_list_item **exi_get_counter_list(ex_entity_type obj_type) case EX_ELEM_SET: return &els_ctr_list; case EX_EDGE_MAP: return &edm_ctr_list; case EX_FACE_MAP: return &fam_ctr_list; - default: return (NULL); + default: return NULL; } } @@ -1214,7 +1225,7 @@ int exi_inc_file_item(int exoid, /* file id */ tlist_ptr->next = *list_ptr; /* insert into head of list */ *list_ptr = tlist_ptr; /* fix up new head of list */ } - return (tlist_ptr->value++); + return tlist_ptr->value++; } /***************************************************************************** @@ -1261,10 +1272,10 @@ int exi_get_file_item(int exoid, /* file id */ } if (!tlist_ptr) { /* ptr NULL? */ - return (-1); + return -1; } - return (tlist_ptr->value); + return tlist_ptr->value; } /***************************************************************************** @@ -1367,7 +1378,7 @@ int ex_get_num_props(int exoid, ex_entity_type obj_type) \ingroup Utilities \undoc */ -int exi_get_cpu_ws(void) { return (sizeof(float)); } +int exi_get_cpu_ws(void) { return sizeof(float); } /* swap - interchange v[i] and v[j] */ /*! @@ -1627,7 +1638,7 @@ void exi_iqsort64(int64_t v[], int64_t iv[], int64_t N) int ex_large_model(int exoid) { if (exoid < 0) { - return (EXODUS_DEFAULT_SIZE); /* Specified in exodusII_int.h */ + return EXODUS_DEFAULT_SIZE; /* Specified in exodusII_int.h */ } /* See if the ATT_FILESIZE attribute is defined in the file */ @@ -1717,6 +1728,7 @@ void exi_set_compact_storage(int exoid, int varid) \internal \undoc */ + void exi_compress_variable(int exoid, int varid, int type) { #if NC_HAS_HDF5 @@ -1730,13 +1742,14 @@ void exi_compress_variable(int exoid, int varid, int type) } else { /* Compression only supported on HDF5 (NetCDF-4) files; Do not try to compress character data */ + int status = NC_NOERR; if ((type == 1 || type == 2) && file->is_hdf5) { if (file->compression_algorithm == EX_COMPRESS_GZIP) { int deflate_level = file->compression_level; if (deflate_level > 0) { int compress = 1; int shuffle = file->shuffle; - nc_def_var_deflate(exoid, varid, shuffle, compress, deflate_level); + status = nc_def_var_deflate(exoid, varid, shuffle, compress, deflate_level); } } else if (file->compression_algorithm == EX_COMPRESS_SZIP) { @@ -1755,12 +1768,58 @@ void exi_compress_variable(int exoid, int varid, int type) /* Even and between 4 and 32; typical values are 8, 10, 16, 32 */ const int SZIP_PIXELS_PER_BLOCK = file->compression_level == 0 ? 32 : file->compression_level; - nc_def_var_szip(exoid, varid, NC_SZIP_NN, SZIP_PIXELS_PER_BLOCK); + status = nc_def_var_szip(exoid, varid, NC_SZIP_NN, SZIP_PIXELS_PER_BLOCK); #else char errmsg[MAX_ERR_LENGTH]; snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: Compression algorithm SZIP is not supported yet (EXPERIMENTAL)."); ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); +#endif + } + else if (file->compression_algorithm == EX_COMPRESS_ZSTD) { +#if NC_HAS_ZSTD == 1 + status = nc_def_var_zstandard(exoid, varid, file->compression_level); +#else + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Compression algorithm ZSTANDARD is not supported in this version of the " + "netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); +#endif + } + else if (file->compression_algorithm == EX_COMPRESS_BZ2) { +#if NC_HAS_BZ2 == 1 + status = nc_def_var_bzip2(exoid, varid, file->compression_level); +#else + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Compression algorithm BZIP2 / BZ2 is not supported in this version of the " + "netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); +#endif + } + if (status != NC_NOERR) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: failed to set compression attribute on variable in file id %d", exoid); + ex_err_fn(exoid, __func__, errmsg, status); + } + + if (type == 2 && file->quantize_nsd > 0) { +#if NC_HAS_QUANTIZE == 1 + // Lossy compression using netCDF quantize methods. + if ((status = nc_def_var_quantize(exoid, varid, NC_QUANTIZE_GRANULARBR, + file->quantize_nsd)) != NC_NOERR) { + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: failed to set quanitzation method on variable in file id %d", exoid); + ex_err_fn(exoid, __func__, errmsg, status); + } +#else + char errmsg[MAX_ERR_LENGTH]; + snprintf(errmsg, MAX_ERR_LENGTH, + "ERROR: Quanitzation is not supported in this version of netCDF library."); + ex_err_fn(exoid, __func__, errmsg, EX_BADPARAM); #endif } } @@ -1797,11 +1856,11 @@ int exi_leavedef(int exoid, const char *call_func) exoid); ex_err_fn(exoid, call_func, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } file->in_define_mode = 0; } - return (EX_NOERR); + return EX_NOERR; } int exi_redef(int exoid, const char *call_func) @@ -1881,12 +1940,12 @@ int exi_persist_leavedef(int exoid, const char *call_func) exoid); ex_err_fn(exoid, call_func, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } file->in_define_mode = 0; file->persist_define_mode = 0; } - return (EX_NOERR); + return EX_NOERR; } static int warning_output = 0; @@ -2247,7 +2306,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle if ((status = nc_set_fill(exoid, NC_NOFILL, &old_fill)) != NC_NOERR) { snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to set nofill mode in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* Verify that there is not an existing file_item struct for this @@ -2267,7 +2326,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle exoid, path); ex_err_fn(exoid, __func__, errmsg, EX_BADFILEID); nc_close(exoid); - return (EX_FATAL); + return EX_FATAL; } /* initialize floating point size conversion. since creating new file, @@ -2290,7 +2349,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to init conversion routines in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, EX_LASTERR); - return (EX_FATAL); + return EX_FATAL; } /* put the EXODUS version number, and i/o floating point word size as @@ -2307,7 +2366,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store Exodus II API version attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } @@ -2321,7 +2380,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store Exodus II file version attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } @@ -2334,7 +2393,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle "attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } /* store Exodus file size (1=large, 0=normal) as an attribute */ @@ -2342,7 +2401,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to store Exodus II file size attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } { @@ -2352,7 +2411,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to add maximum_name_length attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } @@ -2363,7 +2422,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to add int64_status attribute in file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } } @@ -2375,7 +2434,7 @@ int exi_populate_header(int exoid, const char *path, int my_mode, int is_paralle #endif snprintf(errmsg, MAX_ERR_LENGTH, "ERROR: failed to complete definition for file id %d", exoid); ex_err_fn(exoid, __func__, errmsg, status); - return (EX_FATAL); + return EX_FATAL; } return EX_NOERR; } diff --git a/packages/seacas/libraries/exodus/test/CMakeLists.txt b/packages/seacas/libraries/exodus/test/CMakeLists.txt index 6b1641c53c77..fc3596d89435 100644 --- a/packages/seacas/libraries/exodus/test/CMakeLists.txt +++ b/packages/seacas/libraries/exodus/test/CMakeLists.txt @@ -168,15 +168,14 @@ IF ( NETCDF_NCDUMP_BINARY ) ) IF (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - -# TRIBITS_ADD_TEST( -# testall -# NOEXEPREFIX -# NOEXESUFFIX -# NAME exodus_unit_tests -# COMM mpi serial -# NUM_MPI_PROCS 1 -# ) + TRIBITS_ADD_TEST( + testall + NOEXEPREFIX + NOEXESUFFIX + NAME exodus_unit_tests + COMM mpi serial + NUM_MPI_PROCS 1 + ) if ( TPL_Netcdf_Enables_Netcdf4 ) TRIBITS_ADD_TEST( @@ -200,15 +199,15 @@ IF ( NETCDF_NCDUMP_BINARY ) endif() # if ( TPL_Netcdf_Enables_Netcdf5 ) -# TRIBITS_ADD_TEST( -# testall -# NOEXEPREFIX -# NOEXESUFFIX -# NAME exodus_unit_tests_nc5_env -# ARGS netcdf5 -# COMM mpi serial -# NUM_MPI_PROCS 1 -# ) + TRIBITS_ADD_TEST( + testall + NOEXEPREFIX + NOEXESUFFIX + NAME exodus_unit_tests_nc5_env + ARGS netcdf5 + COMM mpi serial + NUM_MPI_PROCS 1 + ) # endif() endif() ELSE() diff --git a/packages/seacas/libraries/exodus/test/create_mesh.c b/packages/seacas/libraries/exodus/test/create_mesh.c index 3f8e56d0b95a..af606d515071 100644 --- a/packages/seacas/libraries/exodus/test/create_mesh.c +++ b/packages/seacas/libraries/exodus/test/create_mesh.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -53,7 +53,7 @@ INT StringToCount(char *size_str) else if (rc == 0) { size = -1; } - return (size); + return size; } /* StringToCount() */ void get_file_name(const char *base, const char *ext, int rank, int nprocs, const char *other, @@ -334,9 +334,9 @@ void make_mesh(realtyp *x, realtyp *y, realtyp *z, INT *connect, INT map_origin, { /* create global coordinates */ size_t k = 0; - for (size_t m = 0; m < (num_elements_1d + 1); m++) { - for (size_t i = 0; i < (num_elements_1d + 1); i++) { - for (size_t j = 0; j < (num_elements_1d + 1); j++, k++) { + for (INT m = 0; m < (num_elements_1d + 1); m++) { + for (INT i = 0; i < (num_elements_1d + 1); i++) { + for (INT j = 0; j < (num_elements_1d + 1); j++, k++) { x[k] = (realtyp)j; y[k] = (realtyp)i; z[k] = (realtyp)m; @@ -347,10 +347,10 @@ void make_mesh(realtyp *x, realtyp *y, realtyp *z, INT *connect, INT map_origin, /* build connectivity array (node list) for mesh */ size_t elp1sq = (num_elements_1d + 1) * (num_elements_1d + 1); size_t cnt = 0; - for (size_t m = 0; m < num_elements_1d; m++) { + for (INT m = 0; m < num_elements_1d; m++) { k = 0; - for (size_t i = 0; i < num_elements_1d; i++) { - for (size_t j = 0; j < num_elements_1d; j++, k++) { + for (INT i = 0; i < num_elements_1d; i++) { + for (INT j = 0; j < num_elements_1d; j++, k++) { size_t base = (m * elp1sq) + k + i + map_origin; connect[cnt++] = base; connect[cnt++] = base + 1; diff --git a/packages/seacas/libraries/exodus/test/makedmp b/packages/seacas/libraries/exodus/test/makedmp index 5f338fccfb25..02d09adc0231 100644 --- a/packages/seacas/libraries/exodus/test/makedmp +++ b/packages/seacas/libraries/exodus/test/makedmp @@ -1,8 +1,8 @@ #! /usr/bin/env bash -# Copyright(C) 1999-2021 National Technology & Engineering Solutions +# Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions # of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with # NTESS, the U.S. Government retains certain rights in this software. -# +# # See packages/seacas/LICENSE for details # script to run all tests and compare them to saved dump files. @@ -234,19 +234,19 @@ echo "begin test_ts_nvar" >> test.output ${PREFIX} ${BINDIR}/test_ts_nvar${SUFFIX} >> test.output echo "end test_ts_nvar" >> test.output ${NCDUMP} -d5,5 test.exo | grep -v version | grep -v _FillValue |grep -v "maximum_name_length" > ${SRCDIR}/test_ts_nvar.dmp - + echo "test_ts_nvar_rd - each thread reads data for a single nodal variable..." echo "begin test_ts_nvar_rd" >> test.output ${PREFIX} ${BINDIR}/test_ts_nvar_rd${SUFFIX} > ${SRCDIR}/test_ts_nvar_rd.dmp echo "end test_ts_nvar_rd" >> test.output - + echo "test_ts_partial_nvar - each thread writes data for a single nodal variable..." echo "begin test_ts_partial_nvar" >> test.output ${PREFIX} ${BINDIR}/test_ts_partial_nvar${SUFFIX} >> test.output echo "end test_ts_partial_nvar" >> test.output ${NCDUMP} -d5,5 test.exo | grep -v version | grep -v _FillValue |grep -v "maximum_name_length" > ${SRCDIR}/test_ts_partial_nvar.dmp - + echo "test_ts_partial_nvar_rd - each thread reads data for a single nodal variable..." echo "begin test_ts_partial_nvar_rd" >> test.output ${PREFIX} ${BINDIR}/test_ts_partial_nvar${SUFFIX} >> test.output @@ -277,4 +277,3 @@ echo "begin test_ts_errval" >> test.output ${PREFIX} ${BINDIR}/test_ts_errval${SUFFIX} >> test.output echo "end test_ts_errval" >> test.output fi - diff --git a/packages/seacas/libraries/exodus/test/rd_wt_mesh.c b/packages/seacas/libraries/exodus/test/rd_wt_mesh.c index c7dcf632dd54..ddb3b176eedc 100644 --- a/packages/seacas/libraries/exodus/test/rd_wt_mesh.c +++ b/packages/seacas/libraries/exodus/test/rd_wt_mesh.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -250,7 +250,7 @@ int main(int argc, char **argv) #ifdef PARALLEL_AWARE_EXODUS MPI_Finalize(); #endif - return (0); + return 0; } /*********************************************************************** @@ -349,16 +349,16 @@ int parse_input(int argc, char *argv[], bool *exodus, bool *close_files, char *f fprintf(stderr, "-C minimize open files. \n"); fprintf(stderr, "-u display help/usage information \n"); fprintf(stderr, "-w time wait (sleep) specified time between timesteps.\n"); - return (1); + return 1; } else { fprintf(stderr, "Unknown option: %s\n", argv[arg]); fprintf(stderr, "Enter rd_wt_mesh -h for description of valid options.\n"); - return (1); + return 1; } } - return (0); + return 0; } /*********************************************************************** @@ -402,7 +402,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (exoid < 0) { printf("after ex_open\n"); - return (1); + return 1; } raw_read_time = 0.0; @@ -416,7 +416,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_init, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } len_connect = (size_t)NUM_NODES_PER_ELEM * (*num_elems); @@ -450,7 +450,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_coord, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } err = ex_get_block(exoid, EX_ELEM_BLOCK, EBLK_ID, type, num_elems, &num_nodes_per_elem, 0, 0, @@ -459,7 +459,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_elem_block, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } t_tmp1 = my_timer(); @@ -474,7 +474,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_elem_conn, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } /* read element and node maps */ @@ -497,7 +497,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_variable_param, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } *num_nodal_fields = num_vars; @@ -505,7 +505,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_variable_param, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } *num_global_fields = num_vars; if (*num_global_fields > 0) { @@ -520,7 +520,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (globals) { free(globals); } - return (1); + return 1; } *num_element_fields = num_vars; @@ -566,7 +566,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_nodal_var, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } } @@ -580,7 +580,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_glob_vars, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } for (i = 1; i <= *num_element_fields; i++) { @@ -594,7 +594,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (err) { printf("after ex_get_elem_var, error = %d\n", err); ex_close(exoid); - return (1); + return 1; } } } @@ -607,7 +607,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int err = ex_close(exoid); if (err) { printf("after ex_close, error = %d\n", err); - return (1); + return 1; } tend = my_timer(); @@ -645,7 +645,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (rank == 0) { fprintf(stderr, "Exodus Read: cannot get %s file size.\n", tmp_name); } - return (1); + return 1; } { file_size = file_status.st_size; @@ -689,7 +689,7 @@ int read_exo_mesh(char *file_name, int rank, int *num_dim, int num_domains, int if (*num_global_fields > 0) { free(globals); } - return (0); + return 0; } /*********************************************************************** @@ -748,7 +748,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int if (exoid[npd] < 0) { printf("after ex_create\n"); free(exoid); - return (1); + return 1; } } t_tmp2 = my_timer(); @@ -778,7 +778,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int globals = NULL; } free(exoid); - return (1); + return 1; } } err = ex_put_init(exoid[npd], "This is an EXODUSII performance test.", num_dim, num_nodes, @@ -789,7 +789,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } #if 0 @@ -814,7 +814,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int printf("after ex_put_elem_block, error = %d\n", err); ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } t_tmp1 = my_timer(); @@ -829,7 +829,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } t_tmp1 = my_timer(); @@ -844,7 +844,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } /* write out element and node maps */ @@ -860,7 +860,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } t_tmp1 = my_timer(); @@ -877,7 +877,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int ex_close(exoid[npd]); free(exoid); - return (1); + return 1; } /* write out simulated results fields; @@ -1075,7 +1075,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int if (err) { printf("after ex_close, error = %d\n", err); free(exoid); - return (1); + return 1; } } if (rank == 0) { @@ -1144,7 +1144,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int } free(exoid); - return (1); + return 1; } { file_size = file_status.st_size * files_per_domain; @@ -1192,7 +1192,7 @@ int write_exo_mesh(char *file_name, int rank, int num_dim, int num_domains, int free(globals); globals = NULL; } - return (0); + return 0; } /*****************************************************************************/ diff --git a/packages/seacas/libraries/exodus/test/test_nemesis.c b/packages/seacas/libraries/exodus/test/test_nemesis.c index 71b184e4c50d..fbcff42e404a 100644 --- a/packages/seacas/libraries/exodus/test/test_nemesis.c +++ b/packages/seacas/libraries/exodus/test/test_nemesis.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2021 National Technology & Engineering Solutions + * Copyright(C) 1999-2021, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -472,7 +472,7 @@ int ne_test_piinf(int fileid) ex_copy_string(ftype, "s", 3); - return (ex_put_init_info(fileid, NPROC, NPROCF, ftype)); + return ex_put_init_info(fileid, NPROC, NPROCF, ftype); } /*****************************************************************************/ @@ -480,7 +480,7 @@ int ne_test_pinig(int fileid) { int nng = NNG, neg = NEG, nebg = NEBG, nnsg = NNSG, nssg = NSSG; - return (ex_put_init_global(fileid, nng, neg, nebg, nnsg, nssg)); + return ex_put_init_global(fileid, nng, neg, nebg, nnsg, nssg); } /*****************************************************************************/ @@ -493,7 +493,7 @@ int ne_test_pelbid(int fileid) elblk_cnt[i] = NEBCG; } - return (ex_put_eb_info_global(fileid, elblk_ids, elblk_cnt)); + return ex_put_eb_info_global(fileid, elblk_ids, elblk_cnt); } /*****************************************************************************/ @@ -507,7 +507,7 @@ int ne_test_pnsp(int fileid) global_df_cnts[i] = 1; } - return (ex_put_ns_param_global(fileid, global_ids, global_n_cnts, global_df_cnts)); + return ex_put_ns_param_global(fileid, global_ids, global_n_cnts, global_df_cnts); } /*****************************************************************************/ @@ -521,7 +521,7 @@ int ne_test_pssp(int fileid) global_df_cnts[i] = 1; } - return (ex_put_ss_param_global(fileid, global_ids, global_el_cnts, global_df_cnts)); + return ex_put_ss_param_global(fileid, global_ids, global_el_cnts, global_df_cnts); } /*****************************************************************************/ @@ -979,8 +979,8 @@ int ne_test_plbpc(int fileid) num_elem_cmaps[iproc] = NECMAP; } - return (ex_put_loadbal_param_cc(fileid, num_int_nodes, num_bor_nodes, num_ext_nodes, - num_int_elems, num_bor_elems, num_node_cmaps, num_elem_cmaps)); + return ex_put_loadbal_param_cc(fileid, num_int_nodes, num_bor_nodes, num_ext_nodes, num_int_elems, + num_bor_elems, num_node_cmaps, num_elem_cmaps); } /*****************************************************************************/ @@ -1011,6 +1011,6 @@ int ne_test_pcmpc(int fileid) emap_proc_ptr[iproc + 1] = emap_proc_ptr[iproc] + NECMAP; } - return (ex_put_cmap_params_cc(fileid, nmap_ids, nmap_n_cnts, nmap_proc_ptr, emap_ids, emap_e_cnts, - emap_proc_ptr)); + return ex_put_cmap_params_cc(fileid, nmap_ids, nmap_n_cnts, nmap_proc_ptr, emap_ids, emap_e_cnts, + emap_proc_ptr); } diff --git a/packages/seacas/libraries/exodus/test/testall.in b/packages/seacas/libraries/exodus/test/testall.in index 889cf15434a0..aae1e4a0a588 100755 --- a/packages/seacas/libraries/exodus/test/testall.in +++ b/packages/seacas/libraries/exodus/test/testall.in @@ -357,7 +357,7 @@ echo "begin testwt-field-metadata" >> test.output ${PREFIX} ${BINDIR}/testwt-field-metadata${SUFFIX} >> test.output ret_status=$((ret_status+$?)) # Filter out the "maximum_name_length" attribute. Moves around in ncdump output for nc4 vs nc3 -${NCDUMP} -d5,5 test-field-metadata.exo | grep @ |sort | ${DIFF} - ${SRCDIR}/testwt-field-metadata.dmp | tee testwt-field-metadata.res +${NCDUMP} -d5,5 test-field-metadata.exo | grep @ |sort -bdf | ${DIFF} - ${SRCDIR}/testwt-field-metadata.dmp | tee testwt-field-metadata.res ret_status=$((ret_status+${PIPESTATUS[0]}+${PIPESTATUS[3]})) echo "end testwt-field-metadata, status = $ret_status" >> test.output diff --git a/packages/seacas/libraries/exodus/test/testall.in1 b/packages/seacas/libraries/exodus/test/testall.in1 index ab0b0bf69c2e..e5c7d124b4eb 100644 --- a/packages/seacas/libraries/exodus/test/testall.in1 +++ b/packages/seacas/libraries/exodus/test/testall.in1 @@ -1,7 +1,7 @@ -# Copyright(C) 1999-2020 National Technology & Engineering Solutions +# Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions # of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with # NTESS, the U.S. Government retains certain rights in this software. -# +# # See packages/seacas/LICENSE for details # script to run all tests and compare them to saved dump files. diff --git a/packages/seacas/libraries/exodus/test/testrd-assembly.c b/packages/seacas/libraries/exodus/test/testrd-assembly.c index f10f39a313f8..70e795ed8467 100644 --- a/packages/seacas/libraries/exodus/test/testrd-assembly.c +++ b/packages/seacas/libraries/exodus/test/testrd-assembly.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -232,7 +232,7 @@ int main(int argc, char **argv) for (int j = 0; j < att_count; j++) { printf("\tName: '%s', Type = %d, Value Count = %d\n\t", attr[j].name, attr[j].type, (int)attr[j].value_count); - for (size_t k = 0; k < attr[j].value_count; k++) { + for (int k = 0; k < attr[j].value_count; k++) { if (attr[j].type == EX_INTEGER) { int *vals = attr[j].values; printf("\t%d", vals[k]); diff --git a/packages/seacas/libraries/exodus/test/testrd-assembly.dmp b/packages/seacas/libraries/exodus/test/testrd-assembly.dmp index 3c8f9d4aad73..a1dea44f6b8e 100644 --- a/packages/seacas/libraries/exodus/test/testrd-assembly.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-assembly.dmp @@ -75,16 +75,16 @@ name = 'block_G' after ex_get_names(exoid, EX_ASSEMBLY, assembly_name2), error = 0 after ex_get_assembly(exoid, &assemblies[i]), error = 0 Assembly named 'Root' has id 100. It contains 3 entities of type 'assembly' - 200, 300, 400, + 200, 300, 400, after ex_get_assembly(exoid, &assemblies[i]), error = 0 Assembly named 'Child2' has id 200. It contains 4 entities of type 'element block' - 10, 11, 12, 13, + 10, 11, 12, 13, after ex_get_assembly(exoid, &assemblies[i]), error = 0 Assembly named 'Child3' has id 300. It contains 3 entities of type 'element block' - 14, 15, 16, + 14, 15, 16, after ex_get_assembly(exoid, &assemblies[i]), error = 0 Assembly named 'Child4' has id 400. It contains 2 entities of type 'element block' - 10, 16, + 10, 16, after ex_get_assemblies(exoid, assmbly), error = 0 Assembly named 'Root' has id 100. It contains 3 entities of type 'assembly' Assembly named 'Child2' has id 200. It contains 4 entities of type 'element block' diff --git a/packages/seacas/libraries/exodus/test/testrd-blob.c b/packages/seacas/libraries/exodus/test/testrd-blob.c index 5c65949a0d89..a7f948326b5c 100644 --- a/packages/seacas/libraries/exodus/test/testrd-blob.c +++ b/packages/seacas/libraries/exodus/test/testrd-blob.c @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -136,7 +136,7 @@ int main(int argc, char **argv) for (int j = 0; j < att_count; j++) { printf("\tName: '%s', Type = %d, Value Count = %d\n\t", attr[j].name, attr[j].type, (int)attr[j].value_count); - for (size_t k = 0; k < attr[j].value_count; k++) { + for (int k = 0; k < attr[j].value_count; k++) { if (attr[j].type == EX_INTEGER) { int *vals = attr[j].values; printf("\t%d", vals[k]); diff --git a/packages/seacas/libraries/exodus/test/testrd-blob.dmp b/packages/seacas/libraries/exodus/test/testrd-blob.dmp index 24f8ca1395ab..faddc2bf2b4a 100644 --- a/packages/seacas/libraries/exodus/test/testrd-blob.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-blob.dmp @@ -16,13 +16,13 @@ num_node_sets = 0 num_side_sets = 0 after ex_get_blob(exoid, &blobs[i]), error = 0 Blob named 'Tempus' has id 100. It contains 10 entries. - + after ex_get_blob(exoid, &blobs[i]), error = 0 Blob named 'IOSS' has id 200. It contains 20 entries. - + after ex_get_blob(exoid, &blobs[i]), error = 0 Blob named 'Solver' has id 300. It contains 15 entries. - + after ex_get_blobs(exoid, blb), error = 0 Blob named 'Tempus' has id 100. It contains 10 entries. Blob named 'IOSS' has id 200. It contains 20 entries. diff --git a/packages/seacas/libraries/exodus/test/testrd-field-metadata.c b/packages/seacas/libraries/exodus/test/testrd-field-metadata.c index 67d140e453ed..c4fa4f1c8816 100644 --- a/packages/seacas/libraries/exodus/test/testrd-field-metadata.c +++ b/packages/seacas/libraries/exodus/test/testrd-field-metadata.c @@ -54,13 +54,13 @@ static char *my_strsep(char **stringp, const char *delim) } \ } while (0) -static char *get_type_name(char *type_name, size_t which) +static char *get_type_name(const char *type_name, size_t which) { if (type_name != NULL && type_name[0] != '\0') { char *string = my_strdup(type_name); char *tofree = string; char *token = my_strsep(&string, ","); - for (int i = 0; i < which; i++) { + for (size_t i = 0; i < which; i++) { token = my_strsep(&string, ","); } if (token != NULL) { @@ -74,8 +74,8 @@ static char *get_type_name(char *type_name, size_t which) return NULL; } -static void get_field_cardinality(ex_field *field, ex_basis *basis, int bas_cnt, - ex_quadrature *quad, int quad_cnt) +static void get_field_cardinality(ex_field *field, const ex_basis *basis, int bas_cnt, + const ex_quadrature *quad, int quad_cnt) { for (int j = 0; j < field->nesting; j++) { if (field->cardinality[j] == 0) { @@ -120,7 +120,7 @@ static void get_field_cardinality(ex_field *field, ex_basis *basis, int bas_cnt, } } -static void print_basis_metadata(ex_basis *basis, size_t num_basis) +static void print_basis_metadata(const ex_basis *basis, size_t num_basis) { for (size_t j = 0; j < num_basis; j++) { printf("\nBasis Metadata: Name: `%s`, Cardinality: %d\n", basis[j].name, basis[j].cardinality); @@ -136,7 +136,7 @@ static void print_basis_metadata(ex_basis *basis, size_t num_basis) } } -static void print_quad_metadata(ex_quadrature *quad, size_t num_quad) +static void print_quad_metadata(const ex_quadrature *quad, size_t num_quad) { for (size_t j = 0; j < num_quad; j++) { printf("\nQuadrature Metadata: Name: `%s`, Cardinality: %d\n", quad[j].name, @@ -152,7 +152,7 @@ static void print_quad_metadata(ex_quadrature *quad, size_t num_quad) } } -static void print_field_metadata(ex_field *field) +static void print_field_metadata(const ex_field *field) { printf("\n"); printf("Field Metadata: Name: `%s`, Nesting: %d\n", field->name, field->nesting); diff --git a/packages/seacas/libraries/exodus/test/testrd-long-name.dmp b/packages/seacas/libraries/exodus/test/testrd-long-name.dmp index 3071eb10f4e2..3f2707b3a99c 100644 --- a/packages/seacas/libraries/exodus/test/testrd-long-name.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-long-name.dmp @@ -15,7 +15,7 @@ num_side_sets = 5 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -49,7 +49,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -83,7 +83,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -197,13 +197,13 @@ nodal attribute 1 = 'Node_attr_2' 10.0 after ex_get_id_map, error = 0 -elem_map(0) = 1 -elem_map(1) = 2 -elem_map(2) = 3 -elem_map(3) = 4 -elem_map(4) = 5 -elem_map(5) = 6 -elem_map(6) = 7 +elem_map(0) = 1 +elem_map(1) = 2 +elem_map(2) = 3 +elem_map(3) = 4 +elem_map(4) = 5 +elem_map(5) = 6 +elem_map(6) = 7 after ex_get_elem_blk_ids, error = 0 @@ -376,7 +376,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = 'nset_1' @@ -409,7 +409,7 @@ nodeset attribute 0 = 'Nodeset_attribute' after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = 'nset_2' @@ -448,16 +448,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -466,7 +466,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -739,37 +739,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 8 10 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 19 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -799,7 +799,7 @@ elem_list = 7 7 7 -side_list = +side_list = 4 2 2 @@ -829,7 +829,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -840,7 +840,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -853,7 +853,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd-nfaced.dmp b/packages/seacas/libraries/exodus/test/testrd-nfaced.dmp index 933936b2d87c..1179ad6c21f2 100644 --- a/packages/seacas/libraries/exodus/test/testrd-nfaced.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-nfaced.dmp @@ -14,7 +14,7 @@ num_node_sets = 0 num_side_sets = 0 after ex_get_coord, error = 0 -x, y, z coords = +x, y, z coords = 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 0.0 @@ -53,9 +53,9 @@ after ex_get_entity_count_per_polyhedra, error = 0 after ex_get_conn, error = 0 face connectivity array for elem block 10 -Element 1, 5 faces: 1 2 3 4 5 -Element 2, 5 faces: 4 6 7 8 9 -Element 3, 7 faces: 8 10 11 12 13 14 15 +Element 1, 5 faces: 1 2 3 4 5 +Element 2, 5 faces: 4 6 7 8 9 +Element 3, 7 faces: 8 10 11 12 13 14 15 after ex_get_block (EX_FACE_BLOCK), error = 0 @@ -71,24 +71,24 @@ after ex_get_entity_count_per_polyhedra, error = 0 after ex_get_conn, error = 0 node connectivity array for face block 10 -Face 1, 3 nodes: 5 6 8 -Face 2, 3 nodes: 2 1 4 -Face 3, 4 nodes: 6 2 4 8 -Face 4, 4 nodes: 8 4 1 5 -Face 5, 4 nodes: 1 2 6 5 -Face 6, 3 nodes: 5 8 7 -Face 7, 3 nodes: 1 3 4 -Face 8, 4 nodes: 7 8 4 3 -Face 9, 4 nodes: 7 3 1 5 -Face 10, 5 nodes: 8 4 14 10 12 -Face 11, 5 nodes: 7 11 9 13 3 -Face 12, 4 nodes: 7 8 12 11 -Face 13, 4 nodes: 11 12 10 9 -Face 14, 4 nodes: 9 10 14 13 -Face 15, 4 nodes: 13 14 4 3 +Face 1, 3 nodes: 5 6 8 +Face 2, 3 nodes: 2 1 4 +Face 3, 4 nodes: 6 2 4 8 +Face 4, 4 nodes: 8 4 1 5 +Face 5, 4 nodes: 1 2 6 5 +Face 6, 3 nodes: 5 8 7 +Face 7, 3 nodes: 1 3 4 +Face 8, 4 nodes: 7 8 4 3 +Face 9, 4 nodes: 7 3 1 5 +Face 10, 5 nodes: 8 4 14 10 12 +Face 11, 5 nodes: 7 11 9 13 3 +Face 12, 4 nodes: 7 8 12 11 +Face 13, 4 nodes: 11 12 10 9 +Face 14, 4 nodes: 9 10 14 13 +Face 15, 4 nodes: 13 14 4 3 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT-NFACED' 'testwt-nfaced' '2010/02/15' @@ -101,7 +101,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd-nm32.dmp b/packages/seacas/libraries/exodus/test/testrd-nm32.dmp index 84c554f7df40..70ec8a3c6ba1 100644 --- a/packages/seacas/libraries/exodus/test/testrd-nm32.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-nm32.dmp @@ -13,7 +13,7 @@ num_side_sets = 5 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -47,7 +47,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -81,7 +81,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -195,13 +195,13 @@ nodal attribute 1 = 'Node_attr_2' 10.0 after ex_get_id_map, error = 0 -elem_id_map(0) = 1 -elem_id_map(1) = 2 -elem_id_map(2) = 3 -elem_id_map(3) = 4 -elem_id_map(4) = 5 -elem_id_map(5) = 6 -elem_id_map(6) = 7 +elem_id_map(0) = 1 +elem_id_map(1) = 2 +elem_id_map(2) = 3 +elem_id_map(3) = 4 +elem_id_map(4) = 5 +elem_id_map(5) = 6 +elem_id_map(6) = 7 after ex_get_elem_blk_ids, error = 0 @@ -374,7 +374,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = 'nset_1' @@ -407,7 +407,7 @@ nodeset attribute 0 = 'Nodeset_attribute' after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = 'nset_2' @@ -444,16 +444,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -462,7 +462,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -733,37 +733,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 8 10 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 19 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -793,7 +793,7 @@ elem_list = 7 7 7 -side_list = +side_list = 4 2 2 @@ -823,7 +823,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -834,7 +834,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -847,7 +847,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd-nsided.dmp b/packages/seacas/libraries/exodus/test/testrd-nsided.dmp index 20b77f3779f1..98ae3d0f9370 100644 --- a/packages/seacas/libraries/exodus/test/testrd-nsided.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-nsided.dmp @@ -12,7 +12,7 @@ num_node_sets = 2 num_side_sets = 5 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -46,7 +46,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -80,7 +80,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -193,13 +193,13 @@ nodal attribute 1 = 'Node_attr_2' 10.0 after ex_get_id_map, error = 0 -elem_map(0) = 1 -elem_map(1) = 2 -elem_map(2) = 3 -elem_map(3) = 4 -elem_map(4) = 5 -elem_map(5) = 6 -elem_map(6) = 7 +elem_map(0) = 1 +elem_map(1) = 2 +elem_map(2) = 3 +elem_map(3) = 4 +elem_map(4) = 5 +elem_map(5) = 6 +elem_map(6) = 7 after ex_get_elem_blk_ids, error = 0 @@ -222,13 +222,13 @@ after ex_get_entity_count_per_polyhedra, error = 0 after ex_get_conn, error = 0 connect array for elem block 10 -Element 1, 4 nodes: 1 2 3 4 -Element 2, 4 nodes: 5 6 7 8 -Element 3, 8 nodes: 9 10 11 12 13 14 15 16 -Element 4, 4 nodes: 17 18 19 20 -Element 5, 6 nodes: 21 22 23 24 25 26 -Element 6, 8 nodes: 17 18 19 20 27 28 30 29 -Element 7, 3 nodes: 31 32 33 +Element 1, 4 nodes: 1 2 3 4 +Element 2, 4 nodes: 5 6 7 8 +Element 3, 8 nodes: 9 10 11 12 13 14 15 16 +Element 4, 4 nodes: 17 18 19 20 +Element 5, 6 nodes: 21 22 23 24 25 26 +Element 6, 8 nodes: 17 18 19 20 27 28 30 29 +Element 7, 3 nodes: 31 32 33 after ex_get_node_set_ids, error = 0 @@ -236,7 +236,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = 'nset_1' @@ -269,7 +269,7 @@ nodeset attribute 0 = 'Nodeset_attribute' after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = 'nset_2' @@ -308,16 +308,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -326,7 +326,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -488,37 +488,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 8 10 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 19 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -548,7 +548,7 @@ elem_list = 7 7 7 -side_list = +side_list = 4 2 2 @@ -578,7 +578,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -589,7 +589,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -602,7 +602,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd-oned.dmp b/packages/seacas/libraries/exodus/test/testrd-oned.dmp index d0ea2e9319c2..2489a65ebb10 100644 --- a/packages/seacas/libraries/exodus/test/testrd-oned.dmp +++ b/packages/seacas/libraries/exodus/test/testrd-oned.dmp @@ -13,7 +13,7 @@ num_side_sets = 2 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = 1.0 1.1 1.2 @@ -44,16 +44,16 @@ nodal attribute 0 = 'Node_attr_1' 2.5 after ex_get_id_map, error = 0 -elem_id_map(0) = 10 -elem_id_map(1) = 20 -elem_id_map(2) = 30 -elem_id_map(3) = 40 -elem_id_map(4) = 50 -elem_id_map(5) = 60 -elem_id_map(6) = 70 -elem_id_map(7) = 80 -elem_id_map(8) = 90 -elem_id_map(9) = 100 +elem_id_map(0) = 10 +elem_id_map(1) = 20 +elem_id_map(2) = 30 +elem_id_map(3) = 40 +elem_id_map(4) = 50 +elem_id_map(5) = 60 +elem_id_map(6) = 70 +elem_id_map(7) = 80 +elem_id_map(8) = 90 +elem_id_map(9) = 100 after ex_get_elem_blk_ids, error = 0 @@ -119,7 +119,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = 'all_odd_nodes' @@ -152,7 +152,7 @@ nodeset attribute 0 = 'Nodeset_attribute' after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = 'some_even_nodes' @@ -189,16 +189,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 1 3 5 @@ -207,7 +207,7 @@ node_list = 2 4 6 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -276,33 +276,33 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 2, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 1 2 -num_elem_per_set = +num_elem_per_set = 1 1 -num_dist_per_set = +num_dist_per_set = 1 1 -elem_ind = +elem_ind = 0 1 -dist_ind = +dist_ind = 0 1 -elem_list = +elem_list = 1 9 -side_list = +side_list = 1 2 -dist_fact = +dist_fact = 2.000 3.000 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -315,7 +315,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd.dmp b/packages/seacas/libraries/exodus/test/testrd.dmp index d44c65196bab..3f94abce4b06 100644 --- a/packages/seacas/libraries/exodus/test/testrd.dmp +++ b/packages/seacas/libraries/exodus/test/testrd.dmp @@ -13,7 +13,7 @@ num_side_sets = 5 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -47,7 +47,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -81,7 +81,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -195,13 +195,13 @@ nodal attribute 1 = 'Node_attr_2' 10.0 after ex_get_id_map, error = 0 -elem_id_map(0) = 10 -elem_id_map(1) = 20 -elem_id_map(2) = 30 -elem_id_map(3) = 40 -elem_id_map(4) = 50 -elem_id_map(5) = 60 -elem_id_map(6) = 70 +elem_id_map(0) = 10 +elem_id_map(1) = 20 +elem_id_map(2) = 30 +elem_id_map(3) = 40 +elem_id_map(4) = 50 +elem_id_map(5) = 60 +elem_id_map(6) = 70 after ex_get_elem_blk_ids, error = 0 @@ -374,7 +374,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = 'nset_1' @@ -407,7 +407,7 @@ nodeset attribute 0 = 'Nodeset_attribute' after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = 'nset_2' @@ -444,16 +444,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -462,7 +462,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -733,37 +733,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 8 10 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 19 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -793,7 +793,7 @@ elem_list = 7 7 7 -side_list = +side_list = 4 2 2 @@ -823,7 +823,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -834,7 +834,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -847,7 +847,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' 'This info record is exactly 80 characters long. last character should be pipe |' diff --git a/packages/seacas/libraries/exodus/test/testrd1.dmp b/packages/seacas/libraries/exodus/test/testrd1.dmp index dd4a05c55d46..135f3905c894 100644 --- a/packages/seacas/libraries/exodus/test/testrd1.dmp +++ b/packages/seacas/libraries/exodus/test/testrd1.dmp @@ -14,7 +14,7 @@ num_node_sets = 2 num_side_sets = 5 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -43,7 +43,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -72,7 +72,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -112,25 +112,25 @@ after ex_get_prop_array, error = 0 after ex_get_elem_map, error = 0 element map id = 111 -elem_map(0) = 1 -elem_map(1) = 2 -elem_map(2) = 3 -elem_map(3) = 4 -elem_map(4) = 5 -elem_map(5) = 6 -elem_map(6) = 7 -elem_map(7) = 8 +elem_map(0) = 1 +elem_map(1) = 2 +elem_map(2) = 3 +elem_map(3) = 4 +elem_map(4) = 5 +elem_map(5) = 6 +elem_map(6) = 7 +elem_map(7) = 8 after ex_get_elem_map, error = 0 element map id = 222 -elem_map(0) = 2 -elem_map(1) = 4 -elem_map(2) = 6 -elem_map(3) = 8 -elem_map(4) = 10 -elem_map(5) = 12 -elem_map(6) = 14 -elem_map(7) = 16 +elem_map(0) = 2 +elem_map(1) = 4 +elem_map(2) = 6 +elem_map(3) = 8 +elem_map(4) = 10 +elem_map(5) = 12 +elem_map(6) = 14 +elem_map(7) = 16 after ex_inquire, error = 0 @@ -150,34 +150,34 @@ after ex_get_prop_array, error = 0 after ex_get_node_map, error = 0 node map id = 333 -node_map(0) = 3 -node_map(1) = 6 -node_map(2) = 9 -node_map(3) = 12 -node_map(4) = 15 -node_map(5) = 18 -node_map(6) = 21 -node_map(7) = 24 -node_map(8) = 27 -node_map(9) = 30 -node_map(10) = 33 -node_map(11) = 36 -node_map(12) = 39 -node_map(13) = 42 -node_map(14) = 45 -node_map(15) = 48 -node_map(16) = 51 -node_map(17) = 54 -node_map(18) = 57 -node_map(19) = 60 -node_map(20) = 63 -node_map(21) = 66 -node_map(22) = 69 -node_map(23) = 72 -node_map(24) = 75 -node_map(25) = 78 -node_map(26) = 81 -node_map(27) = 84 +node_map(0) = 3 +node_map(1) = 6 +node_map(2) = 9 +node_map(3) = 12 +node_map(4) = 15 +node_map(5) = 18 +node_map(6) = 21 +node_map(7) = 24 +node_map(8) = 27 +node_map(9) = 30 +node_map(10) = 33 +node_map(11) = 36 +node_map(12) = 39 +node_map(13) = 42 +node_map(14) = 45 +node_map(15) = 48 +node_map(16) = 51 +node_map(17) = 54 +node_map(18) = 57 +node_map(19) = 60 +node_map(20) = 63 +node_map(21) = 66 +node_map(22) = 69 +node_map(23) = 72 +node_map(24) = 75 +node_map(25) = 78 +node_map(26) = 81 +node_map(27) = 84 after ex_inquire, error = 0 @@ -363,7 +363,7 @@ after ex_get_node_set_ids, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after ex_get_node_set, error = 0 @@ -385,7 +385,7 @@ dist factors for node set 20 after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after ex_get_node_set, error = 0 @@ -421,16 +421,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -439,7 +439,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -637,37 +637,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 2 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 15 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 3 3 1 @@ -685,7 +685,7 @@ elem_list = 5 6 7 -side_list = +side_list = 6 4 4 @@ -703,7 +703,7 @@ side_list = 4 1 1 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -714,7 +714,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT1' 'testwt1' '03/16/94' @@ -727,7 +727,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' 'This is the second information record.' 'This is the third information record.' diff --git a/packages/seacas/libraries/exodus/test/testrd_nc.dmp b/packages/seacas/libraries/exodus/test/testrd_nc.dmp index e50ee4c6b806..f07948061224 100644 --- a/packages/seacas/libraries/exodus/test/testrd_nc.dmp +++ b/packages/seacas/libraries/exodus/test/testrd_nc.dmp @@ -14,7 +14,7 @@ num_side_sets = 5 after ex_get_coord, error = 0 after ex_get_coord (x), error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -50,7 +50,7 @@ x coords = 10.0 after ex_get_coord (y), error = 0 -y coords = +y coords = 0.0 0.0 1.0 @@ -86,7 +86,7 @@ y coords = 10.0 after ex_get_coord (z), error = 0 -z coords = +z coords = 0.0 0.0 0.0 @@ -126,13 +126,13 @@ x coord name = 'xcoor' y coord name = 'ycoor' after ex_get_id_map, error = 0 -elem_map(0) = 10 -elem_map(1) = 20 -elem_map(2) = 30 -elem_map(3) = 40 -elem_map(4) = 50 -elem_map(5) = 60 -elem_map(6) = 70 +elem_map(0) = 10 +elem_map(1) = 20 +elem_map(2) = 30 +elem_map(3) = 40 +elem_map(4) = 50 +elem_map(5) = 60 +elem_map(6) = 70 after ex_get_elem_blk_ids, error = 0 @@ -294,7 +294,7 @@ after ex_get_node_set_ids, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after ex_get_node_set, error = 0 @@ -316,7 +316,7 @@ dist factors for node set 20 after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after ex_get_node_set, error = 0 @@ -352,16 +352,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -370,7 +370,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -636,37 +636,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 8 10 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 19 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -696,7 +696,7 @@ elem_list = 7 7 7 -side_list = +side_list = 4 2 2 @@ -726,7 +726,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -737,7 +737,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -750,7 +750,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' 'This info record is exactly 80 characters long. last character should be pipe |' diff --git a/packages/seacas/libraries/exodus/test/testrd_ss.dmp b/packages/seacas/libraries/exodus/test/testrd_ss.dmp index c40e1b94e4b4..a44a2841e821 100644 --- a/packages/seacas/libraries/exodus/test/testrd_ss.dmp +++ b/packages/seacas/libraries/exodus/test/testrd_ss.dmp @@ -411,7 +411,7 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 @@ -421,7 +421,7 @@ ids = 36 37 38 -num_elem_per_set = +num_elem_per_set = 0 0 2 @@ -431,7 +431,7 @@ num_elem_per_set = 2 4 2 -num_dist_per_set = +num_dist_per_set = 0 0 4 @@ -441,7 +441,7 @@ num_dist_per_set = 0 0 0 -elem_ind = +elem_ind = 0 0 0 @@ -451,7 +451,7 @@ elem_ind = 15 17 21 -dist_ind = +dist_ind = 0 0 0 @@ -461,7 +461,7 @@ dist_ind = 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -485,7 +485,7 @@ elem_list = 7 8 8 -side_list = +side_list = 4 2 2 @@ -509,7 +509,7 @@ side_list = 6 1 3 -dist_fact = +dist_fact = 30.000 30.100 30.200 diff --git a/packages/seacas/libraries/exodus/test/testrd_zeroe.dmp b/packages/seacas/libraries/exodus/test/testrd_zeroe.dmp index 41b5261351ab..ea6c7f41d313 100644 --- a/packages/seacas/libraries/exodus/test/testrd_zeroe.dmp +++ b/packages/seacas/libraries/exodus/test/testrd_zeroe.dmp @@ -13,7 +13,7 @@ num_side_sets = 0 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -47,7 +47,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -81,7 +81,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -131,7 +131,7 @@ after ex_get_names, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 name = '' @@ -156,7 +156,7 @@ num nodeset attributes for nodeset 20 = 0 after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 name = '' @@ -193,16 +193,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -211,7 +211,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -222,7 +222,7 @@ dist_fact = 3.100 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -235,7 +235,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrd_zeron.dmp b/packages/seacas/libraries/exodus/test/testrd_zeron.dmp index 217fd539e4fc..2a2409974c69 100644 --- a/packages/seacas/libraries/exodus/test/testrd_zeron.dmp +++ b/packages/seacas/libraries/exodus/test/testrd_zeron.dmp @@ -13,7 +13,7 @@ num_side_sets = 0 after ex_inquire, error = 0 after ex_get_coord, error = 0 -x coords = +x coords = after ex_get_coord_names, error = 0 x coord name = 'xcoor' @@ -23,7 +23,7 @@ num nodal attributes = 0 after ex_get_id_map, error = 0 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWT' 'testwt' '07/07/93' @@ -36,7 +36,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' '' '' diff --git a/packages/seacas/libraries/exodus/test/testrdd.dmp b/packages/seacas/libraries/exodus/test/testrdd.dmp index e95e8f8cdaa7..fc5fbfcb2dff 100644 --- a/packages/seacas/libraries/exodus/test/testrdd.dmp +++ b/packages/seacas/libraries/exodus/test/testrdd.dmp @@ -13,7 +13,7 @@ num_node_sets = 2 num_side_sets = 5 after ex_get_coord, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -40,7 +40,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -67,7 +67,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -100,11 +100,11 @@ x coord name = 'xcoor' y coord name = 'ycoor' after ex_get_id_map, error = 0 -elem_map(0) = 1 -elem_map(1) = 2 -elem_map(2) = 3 -elem_map(3) = 4 -elem_map(4) = 5 +elem_map(0) = 1 +elem_map(1) = 2 +elem_map(2) = 3 +elem_map(3) = 4 +elem_map(4) = 5 after ex_get_elem_blk_ids, error = 0 @@ -223,7 +223,7 @@ after ex_get_node_set_ids, error = 0 after ex_get_node_set_param, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after ex_get_node_set, error = 0 @@ -245,7 +245,7 @@ dist factors for node set 20 after ex_get_node_set_param, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after ex_get_node_set, error = 0 @@ -281,16 +281,16 @@ after ex_inquire: EX_INQ_NS_DF_LEN = 8, error = 0 after ex_get_concat_node_sets, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 0 5 -node_list = +node_list = 10 11 12 @@ -299,7 +299,7 @@ node_list = 20 21 22 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -519,37 +519,37 @@ after ex_inquire: EX_INQ_SS_DF_LEN = 8, error = 0 after ex_get_concat_side_sets, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 5 -num_dist_per_set = +num_dist_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 0 2 4 11 15 -dist_ind = +dist_ind = 0 4 8 8 8 -elem_list = +elem_list = 2 2 1 @@ -570,7 +570,7 @@ elem_list = 5 5 5 -side_list = +side_list = 4 2 2 @@ -591,7 +591,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -602,7 +602,7 @@ dist_fact = 31.300 after ex_get_qa, error = 0 -QA records = +QA records = 'TESTWTD' 'testwtd' '07/07/93' @@ -615,7 +615,7 @@ QA records = after ex_inquire, error = 0 after ex_get_info, error = 0 -info records = +info records = 'This is the first information record.' 'This is the second information record.' 'This is the third information record.' diff --git a/packages/seacas/libraries/exodus/test/testwt-blob.dmp b/packages/seacas/libraries/exodus/test/testwt-blob.dmp index 6d32177ea075..4e9cf1a09b72 100644 --- a/packages/seacas/libraries/exodus/test/testwt-blob.dmp +++ b/packages/seacas/libraries/exodus/test/testwt-blob.dmp @@ -107,62 +107,62 @@ data: 0.16, 1.16, 2.16, 3.16, 4.16, 5.16, 6.16, 7.16, 8.16, 9.16 ; vals_blob_var1blob200 = - 0.03, 1.03, 2.03, 3.03, 4.03, 5.03, 6.03, 7.03, 8.03, 9.03, 10.03, 11.03, + 0.03, 1.03, 2.03, 3.03, 4.03, 5.03, 6.03, 7.03, 8.03, 9.03, 10.03, 11.03, 12.03, 13.03, 14.03, 15.03, 16.03, 17.03, 18.03, 19.03, - 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, + 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, 12.05, 13.05, 14.05, 15.05, 16.05, 17.05, 18.05, 19.05, - 0.07, 1.07, 2.07, 3.07, 4.07, 5.07, 6.07, 7.07, 8.07, 9.07, 10.07, 11.07, + 0.07, 1.07, 2.07, 3.07, 4.07, 5.07, 6.07, 7.07, 8.07, 9.07, 10.07, 11.07, 12.07, 13.07, 14.07, 15.07, 16.07, 17.07, 18.07, 19.07, - 0.09, 1.09, 2.09, 3.09, 4.09, 5.09, 6.09, 7.09, 8.09, 9.09, 10.09, 11.09, + 0.09, 1.09, 2.09, 3.09, 4.09, 5.09, 6.09, 7.09, 8.09, 9.09, 10.09, 11.09, 12.09, 13.09, 14.09, 15.09, 16.09, 17.09, 18.09, 19.09 ; vals_blob_var2blob200 = - 0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04, + 0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04, 12.04, 13.04, 14.04, 15.04, 16.04, 17.04, 18.04, 19.04, - 0.07, 1.07, 2.07, 3.07, 4.07, 5.07, 6.07, 7.07, 8.07, 9.07, 10.07, 11.07, + 0.07, 1.07, 2.07, 3.07, 4.07, 5.07, 6.07, 7.07, 8.07, 9.07, 10.07, 11.07, 12.07, 13.07, 14.07, 15.07, 16.07, 17.07, 18.07, 19.07, - 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, + 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, 14.1, 15.1, 16.1, 17.1, 18.1, 19.1, - 0.13, 1.13, 2.13, 3.13, 4.13, 5.13, 6.13, 7.13, 8.13, 9.13, 10.13, 11.13, + 0.13, 1.13, 2.13, 3.13, 4.13, 5.13, 6.13, 7.13, 8.13, 9.13, 10.13, 11.13, 12.13, 13.13, 14.13, 15.13, 16.13, 17.13, 18.13, 19.13 ; vals_blob_var3blob200 = - 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, + 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, 12.05, 13.05, 14.05, 15.05, 16.05, 17.05, 18.05, 19.05, - 0.09, 1.09, 2.09, 3.09, 4.09, 5.09, 6.09, 7.09, 8.09, 9.09, 10.09, 11.09, + 0.09, 1.09, 2.09, 3.09, 4.09, 5.09, 6.09, 7.09, 8.09, 9.09, 10.09, 11.09, 12.09, 13.09, 14.09, 15.09, 16.09, 17.09, 18.09, 19.09, - 0.13, 1.13, 2.13, 3.13, 4.13, 5.13, 6.13, 7.13, 8.13, 9.13, 10.13, 11.13, + 0.13, 1.13, 2.13, 3.13, 4.13, 5.13, 6.13, 7.13, 8.13, 9.13, 10.13, 11.13, 12.13, 13.13, 14.13, 15.13, 16.13, 17.13, 18.13, 19.13, - 0.17, 1.17, 2.17, 3.17, 4.17, 5.17, 6.17, 7.17, 8.17, 9.17, 10.17, 11.17, + 0.17, 1.17, 2.17, 3.17, 4.17, 5.17, 6.17, 7.17, 8.17, 9.17, 10.17, 11.17, 12.17, 13.17, 14.17, 15.17, 16.17, 17.17, 18.17, 19.17 ; vals_blob_var1blob300 = - 0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04, + 0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04, 12.04, 13.04, 14.04, - 0.06, 1.06, 2.06, 3.06, 4.06, 5.06, 6.06, 7.06, 8.06, 9.06, 10.06, 11.06, + 0.06, 1.06, 2.06, 3.06, 4.06, 5.06, 6.06, 7.06, 8.06, 9.06, 10.06, 11.06, 12.06, 13.06, 14.06, - 0.08, 1.08, 2.08, 3.08, 4.08, 5.08, 6.08, 7.08, 8.08, 9.08, 10.08, 11.08, + 0.08, 1.08, 2.08, 3.08, 4.08, 5.08, 6.08, 7.08, 8.08, 9.08, 10.08, 11.08, 12.08, 13.08, 14.08, - 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, + 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, 14.1 ; vals_blob_var2blob300 = - 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, + 0.05, 1.05, 2.05, 3.05, 4.05, 5.05, 6.05, 7.05, 8.05, 9.05, 10.05, 11.05, 12.05, 13.05, 14.05, - 0.08, 1.08, 2.08, 3.08, 4.08, 5.08, 6.08, 7.08, 8.08, 9.08, 10.08, 11.08, + 0.08, 1.08, 2.08, 3.08, 4.08, 5.08, 6.08, 7.08, 8.08, 9.08, 10.08, 11.08, 12.08, 13.08, 14.08, - 0.11, 1.11, 2.11, 3.11, 4.11, 5.11, 6.11, 7.11, 8.11, 9.11, 10.11, 11.11, + 0.11, 1.11, 2.11, 3.11, 4.11, 5.11, 6.11, 7.11, 8.11, 9.11, 10.11, 11.11, 12.11, 13.11, 14.11, - 0.14, 1.14, 2.14, 3.14, 4.14, 5.14, 6.14, 7.14, 8.14, 9.14, 10.14, 11.14, + 0.14, 1.14, 2.14, 3.14, 4.14, 5.14, 6.14, 7.14, 8.14, 9.14, 10.14, 11.14, 12.14, 13.14, 14.14 ; vals_blob_var3blob300 = - 0.06, 1.06, 2.06, 3.06, 4.06, 5.06, 6.06, 7.06, 8.06, 9.06, 10.06, 11.06, + 0.06, 1.06, 2.06, 3.06, 4.06, 5.06, 6.06, 7.06, 8.06, 9.06, 10.06, 11.06, 12.06, 13.06, 14.06, - 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, + 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, 14.1, - 0.14, 1.14, 2.14, 3.14, 4.14, 5.14, 6.14, 7.14, 8.14, 9.14, 10.14, 11.14, + 0.14, 1.14, 2.14, 3.14, 4.14, 5.14, 6.14, 7.14, 8.14, 9.14, 10.14, 11.14, 12.14, 13.14, 14.14, - 0.18, 1.18, 2.18, 3.18, 4.18, 5.18, 6.18, 7.18, 8.18, 9.18, 10.18, 11.18, + 0.18, 1.18, 2.18, 3.18, 4.18, 5.18, 6.18, 7.18, 8.18, 9.18, 10.18, 11.18, 12.18, 13.18, 14.18 ; } diff --git a/packages/seacas/libraries/exodus/test/testwt-field-metadata.c b/packages/seacas/libraries/exodus/test/testwt-field-metadata.c index 642aa5ba5fb3..25ef4cd60c5e 100644 --- a/packages/seacas/libraries/exodus/test/testwt-field-metadata.c +++ b/packages/seacas/libraries/exodus/test/testwt-field-metadata.c @@ -82,7 +82,7 @@ int main(int argc, char **argv) /* Write element block names */ for (int i = 0; i < num_elem_blk; i++) { char block_names[32]; - sprintf(block_names, "block_%c", i + 'A'); + snprintf(block_names, 32, "block_%c", i + 'A'); EXCHECK(ex_put_name(exoid, EX_ELEM_BLOCK, blocks[i].id, block_names)); } @@ -131,7 +131,7 @@ int main(int argc, char **argv) int cardinality = field.cardinality[0] != 0 ? field.cardinality[0] : ex_field_cardinality(field.type[0]); for (int i = 0; i < cardinality; i++) { - const char *name = ex_component_field_name(&field, (int[]){i + 1}); + const char *name = ex_component_field_name(&field, (int[]){i + 1, 0}); assert(strcmp(var_names[vname++], name) == 0); } } @@ -152,7 +152,7 @@ int main(int argc, char **argv) int cardinality = field.cardinality[0] != 0 ? field.cardinality[0] : ex_field_cardinality(field.type[0]); for (int i = 0; i < cardinality; i++) { - const char *name = ex_component_field_name(&field, (int[]){i + 1}); + const char *name = ex_component_field_name(&field, (int[]){i + 1, 0}); assert(strcmp(var_names[vname++], name) == 0); } } diff --git a/packages/seacas/libraries/exodus/test/testwt-field-metadata.dmp b/packages/seacas/libraries/exodus/test/testwt-field-metadata.dmp index 37e75ddeb6e9..9f353a79fa87 100644 --- a/packages/seacas/libraries/exodus/test/testwt-field-metadata.dmp +++ b/packages/seacas/libraries/exodus/test/testwt-field-metadata.dmp @@ -13,16 +13,6 @@ :Basis@TESTING_SECOND_BASIS@subc_ordinal = 0, 1, 2 ; :Basis@TESTING_SECOND_BASIS@xi = -1., 1., 1. ; :Basis@TESTING_SECOND_BASIS@zeta = 1., -1., 1. ; - :Quad@1x2x1@cardinality = 2 ; - :Quad@1x2x1@eta = 0.5, -0.5 ; - :Quad@1x2x1@weight = 1., 1. ; - :Quad@1x2x1@xi = -0.5, 0.5 ; - :Quad@1x2x1@zeta = -0.5, 0.5 ; - :Quad@2x2x2@cardinality = 8 ; - :Quad@2x2x2@eta = -0.57735, -0.57735, 0.57735, 0.57735, -0.57735, -0.57735, 0.57735, 0.57735 ; - :Quad@2x2x2@weight = 1., 1., 1., 1., 1., 1., 1., 1. ; - :Quad@2x2x2@xi = -0.57735, 0.57735, -0.57735, 0.57735, -0.57735, 0.57735, -0.57735, 0.57735 ; - :Quad@2x2x2@zeta = -0.57735, -0.57735, -0.57735, -0.57735, 0.57735, 0.57735, 0.57735, 0.57735 ; connect1:Field@Disp@separator = "" ; connect1:Field@Disp@type = 8 ; connect1:Field@Velocity@separator = "%" ; @@ -50,3 +40,13 @@ "Curl@6", "Curl@7", "Curl@8", + :Quad@1x2x1@cardinality = 2 ; + :Quad@1x2x1@eta = 0.5, -0.5 ; + :Quad@1x2x1@weight = 1., 1. ; + :Quad@1x2x1@xi = -0.5, 0.5 ; + :Quad@1x2x1@zeta = -0.5, 0.5 ; + :Quad@2x2x2@cardinality = 8 ; + :Quad@2x2x2@eta = -0.57735, -0.57735, 0.57735, 0.57735, -0.57735, -0.57735, 0.57735, 0.57735 ; + :Quad@2x2x2@weight = 1., 1., 1., 1., 1., 1., 1., 1. ; + :Quad@2x2x2@xi = -0.57735, 0.57735, -0.57735, 0.57735, -0.57735, 0.57735, -0.57735, 0.57735 ; + :Quad@2x2x2@zeta = -0.57735, -0.57735, -0.57735, -0.57735, 0.57735, 0.57735, 0.57735, 0.57735 ; diff --git a/packages/seacas/libraries/exodus/test/update_all_tests b/packages/seacas/libraries/exodus/test/update_all_tests index 5a8019dd8947..dc84ef8ee70a 100644 --- a/packages/seacas/libraries/exodus/test/update_all_tests +++ b/packages/seacas/libraries/exodus/test/update_all_tests @@ -1,7 +1,7 @@ -# Copyright(C) 1999-2020 National Technology & Engineering Solutions +# Copyright(C) 1999-2020, 2024 National Technology & Engineering Solutions # of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with # NTESS, the U.S. Government retains certain rights in this software. -# +# # See packages/seacas/LICENSE for details # script to run all tests and compare them to saved dump files. @@ -24,7 +24,7 @@ ${NCDUMP} -d5,5 test.exo | grep -v version | grep -v int64_status| grep -v _Fill echo "testrd - single precision read test..." echo "begin testrd" >> test.output -${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd.dmp +${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd.dmp echo "end testrd" >> test.output echo "testrdv - single precision read test with varid..." @@ -54,7 +54,7 @@ echo "testcp_nl - normal_model to large_model single precision copy test..." echo "begin testcp_nl" >> test.output ${PREFIX} ${SRCDIR}/testcp_nl >> test.output echo "end testcp_nl" >> test.output -${NCDUMP} -d5,5 testcp_nl.exo | grep -v version | grep -v int64_status| grep -v _FillValue > ${SRCDIR}/testcp_nl.dmp +${NCDUMP} -d5,5 testcp_nl.exo | grep -v version | grep -v int64_status| grep -v _FillValue > ${SRCDIR}/testcp_nl.dmp echo "testwt_clb - single precision write test using concatenated puts..." echo "begin testwt_clb" >> test.output @@ -90,13 +90,13 @@ echo "testwt1 ... [Expect WEDGE6 warning from this test]" echo "begin testwt1" >> test.output ${PREFIX} ${SRCDIR}/testwt1 >> test.output echo "end testwt1" >> test.output -${NCDUMP} -d5,5 test.exo | grep -v version | grep -v int64_status| grep -v _FillValue > ${SRCDIR}/test1.dmp +${NCDUMP} -d5,5 test.exo | grep -v version | grep -v int64_status| grep -v _FillValue > ${SRCDIR}/test1.dmp echo "testrd1 - single precision read test of a file with several side sets..." echo "testrd1 ... [Expect file create failure error, NOCLOBBER]" echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]" echo "begin testrd1" >> test.output -${PREFIX} ${SRCDIR}/testrd1 | grep -v version > ${SRCDIR}/testrd1.dmp +${PREFIX} ${SRCDIR}/testrd1 | grep -v version > ${SRCDIR}/testrd1.dmp echo "end testrd1" >> test.output echo "testwt_ss - write files to test side sets..." @@ -155,7 +155,7 @@ ${NCDUMP} -d5,5 test.exo | grep -v version | grep -v int64_status| grep -v _Fill echo "testrd - read test of file with zero elements..." echo "begin testrd zero elements" >> test.output -${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd_zeroe.dmp +${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd_zeroe.dmp echo "end testrd zero elements" >> test.output echo "testwt-one-attrib - read/write test of element attributes - read one at a time..." @@ -193,7 +193,7 @@ ${NCDUMP} -d5,5 test.exo | grep -v version | grep -v int64_status| grep -v _Fill echo "testrd - read long name file truncating to 32 characters on read..." echo "begin testrd (truncate)" >> test.output -${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd-nm32.dmp +${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd-nm32.dmp echo "end testrd (truncate)" >> test.output echo "testrd-long-name - read long name file..." diff --git a/packages/seacas/libraries/exodus_for/CMakeLists.txt b/packages/seacas/libraries/exodus_for/CMakeLists.txt index 2ff709977506..7578f78ea8be 100644 --- a/packages/seacas/libraries/exodus_for/CMakeLists.txt +++ b/packages/seacas/libraries/exodus_for/CMakeLists.txt @@ -37,11 +37,11 @@ if (SEACASExodus_ENABLE_STATIC) set_target_properties(exodus_for_static PROPERTIES OUTPUT_NAME exodus_for) # This keeps the library out of the `all_libs` targets... set_target_properties(exodus_for_static PROPERTIES TRIBITS_TESTONLY_LIB TRUE) - INSTALL(TARGETS exodus_for_static DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) + INSTALL(TARGETS exodus_for_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) # For backwards compatibility, the Fortran exodus library was called libexoIIv2for.a # Create a symbolic link from libexodus_for.a to libexoIIv2for.a -- do only for static lib - InstallSymLink(libexodus_for.a ${CMAKE_INSTALL_PREFIX}/lib/libexoIIv2for.a) + InstallSymLink(libexodus_for.a ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libexoIIv2for.a) endif() TRIBITS_ADD_TEST_DIRECTORIES(test) diff --git a/packages/seacas/libraries/exodus_for/src/addrwrap.F b/packages/seacas/libraries/exodus_for/src/addrwrap.F index 4ba73d1376ad..d5ae5c7f3487 100644 --- a/packages/seacas/libraries/exodus_for/src/addrwrap.F +++ b/packages/seacas/libraries/exodus_for/src/addrwrap.F @@ -1,4 +1,4 @@ -C Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions +C Copyright(C) 1999-2020, 2022, 2024 National Technology & Engineering Solutions C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with C NTESS, the U.S. Government retains certain rights in this software. C @@ -1204,7 +1204,7 @@ SUBROUTINE EXGSSC (IDEXO, IDESS, INCNT, IERR) IDEXO4 = IDEXO CALL EXGSSC4 (IDEXO4, IDESS, INCNT, IERR4) IERR = IERR4 - + END SUBROUTINE EXGCSSC (IDEXO, INCNT, IERR) diff --git a/packages/seacas/libraries/exodus_for/src/exo_jack.c b/packages/seacas/libraries/exodus_for/src/exo_jack.c index c0fea886a7b4..b08bdb143d62 100644 --- a/packages/seacas/libraries/exodus_for/src/exo_jack.c +++ b/packages/seacas/libraries/exodus_for/src/exo_jack.c @@ -79,6 +79,9 @@ static int *i8i4(int64_t size, const int64_t *i8) { int *i4 = malloc(size * sizeof(int)); + if (i4 == NULL) { + return NULL; + } for (int64_t i = 0; i < size; i++) { i4[i] = i8[i]; } @@ -245,6 +248,10 @@ void F2C(expini, EXPINI)(int *idexo, char *title, void_int *num_dim, void_int *n slen = titlelen; } char *name = malloc((slen + 1) * sizeof(char)); + if (name == NULL) { + *ierr = EX_MEMFAIL; + return; + } (void)ex_fstrncpy(name, title, slen); if (ex_int64_status(*idexo) & EX_BULK_INT64_API) { @@ -866,6 +873,10 @@ void F2C(expecpp, EXPECPP)(int *idexo, int *obj_type, entity_id *elem_blk_id, in return; } int *counts4 = i8i4(block.num_entry, counts); + if (counts4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } *ierr = ex_put_entity_count_per_polyhedra(*idexo, (ex_entity_type)*obj_type, *elem_blk_id, counts4); free(counts4); @@ -2040,7 +2051,11 @@ void F2C(exgvan, EXGVAN)(int *idexo, char *var_type, int *num_vars, char *var_na void F2C(expvtt, EXPVTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = i8i4((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab); - *ierr = ex_put_truth_table(*idexo, EX_ELEM_BLOCK, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_put_truth_table(*idexo, EX_ELEM_BLOCK, *num_entity, *num_var, var_tab4); free(var_tab4); } #else @@ -2058,7 +2073,11 @@ void F2C(expvtt, EXPVTT)(int *idexo, int *num_entity, int *num_var, int *var_tab void F2C(expnstt, EXPNSTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = i8i4((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab); - *ierr = ex_put_truth_table(*idexo, EX_NODE_SET, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_put_truth_table(*idexo, EX_NODE_SET, *num_entity, *num_var, var_tab4); free(var_tab4); } #else @@ -2076,7 +2095,11 @@ void F2C(expnstt, EXPNSTT)(int *idexo, int *num_entity, int *num_var, int *var_t void F2C(expsstt, EXPSSTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = i8i4((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab); - *ierr = ex_put_truth_table(*idexo, EX_SIDE_SET, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_put_truth_table(*idexo, EX_SIDE_SET, *num_entity, *num_var, var_tab4); free(var_tab4); } #else @@ -2094,7 +2117,11 @@ void F2C(expsstt, EXPSSTT)(int *idexo, int *num_entity, int *num_var, int *var_t void F2C(exgvtt, EXGVTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = malloc(*num_entity * *num_var * sizeof(int)); - *ierr = ex_get_truth_table(*idexo, EX_ELEM_BLOCK, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_get_truth_table(*idexo, EX_ELEM_BLOCK, *num_entity, *num_var, var_tab4); i4i8((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab4, var_tab); free(var_tab4); #else @@ -2112,7 +2139,11 @@ void F2C(exgvtt, EXGVTT)(int *idexo, int *num_entity, int *num_var, int *var_tab void F2C(exgnstt, EXGNSTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = malloc(*num_entity * *num_var * sizeof(int)); - *ierr = ex_get_truth_table(*idexo, EX_NODE_SET, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_get_truth_table(*idexo, EX_NODE_SET, *num_entity, *num_var, var_tab4); i4i8((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab4, var_tab); free(var_tab4); } @@ -2131,7 +2162,11 @@ void F2C(exgnstt, EXGNSTT)(int *idexo, int *num_entity, int *num_var, int *var_t void F2C(exgsstt, EXGSSTT)(int *idexo, int *num_entity, int *num_var, int64_t *var_tab, int *ierr) { int *var_tab4 = malloc(*num_entity * *num_var * sizeof(int)); - *ierr = ex_get_truth_table(*idexo, EX_SIDE_SET, *num_entity, *num_var, var_tab4); + if (var_tab4 == NULL) { + *ierr = EX_MEMFAIL; + return; + } + *ierr = ex_get_truth_table(*idexo, EX_SIDE_SET, *num_entity, *num_var, var_tab4); i4i8((int64_t)(*num_entity) * (int64_t)(*num_var), var_tab4, var_tab); free(var_tab4); } @@ -2443,6 +2478,10 @@ void F2C(exgssc, EXGSSC)(int *idexo, entity_id *side_set_id, int64_t *side_set_n int64_t num_df_in_set = 0; ex_get_set_param(*idexo, EX_SIDE_SET, *side_set_id, &num_sides_in_set, &num_df_in_set); int *cnt_list = malloc(num_sides_in_set * sizeof(int)); + if (cnt_list == NULL) { + *ierr = EX_MEMFAIL; + return; + } *ierr = ex_get_side_set_node_count(*idexo, *side_set_id, cnt_list); @@ -2465,6 +2504,10 @@ void F2C(exgcssc, EXGCSSC)(int *idexo, int64_t *side_set_node_cnt_list, int *ier { int count = ex_inquire_int(*idexo, EX_INQ_SS_ELEM_LEN); int *cnt_list = malloc(count * sizeof(int)); + if (cnt_list == NULL) { + *ierr = EX_MEMFAIL; + return; + } *ierr = ex_get_concat_side_set_node_count(*idexo, cnt_list); @@ -2877,6 +2920,10 @@ void F2C(exgii, EXGII)(int *idne, int *nproc, int *nproc_in_f, char *ftype, int } char *file_type = (char *)malloc((slen + 1) * sizeof(char)); + if (file_type == NULL) { + *ierr = EX_MEMFAIL; + return; + } if ((*ierr = ex_get_init_info(*idne, nproc, nproc_in_f, file_type)) != 0) { char errmsg[MAX_ERR_LENGTH]; @@ -2914,6 +2961,10 @@ void F2C(expii, EXPII)(int *idne, int *nproc, int *nproc_in_f, char *ftype, int } char *file_type = (char *)malloc((slen + 1) * sizeof(char)); + if (file_type == NULL) { + *ierr = EX_MEMFAIL; + return; + } ex_fstrncpy(file_type, ftype, slen); @@ -3528,6 +3579,10 @@ void F2C(exgelt, EXGELT)(int *idne, entity_id *elem_blk_id, char *elem_type, int } char *etype = (char *)malloc((slen + 1) * sizeof(char)); + if (etype == NULL) { + *ierr = EX_MEMFAIL; + return; + } if ((*ierr = ex_get_elem_type(*idne, *elem_blk_id, etype)) != 0) { char errmsg[MAX_ERR_LENGTH]; diff --git a/packages/seacas/libraries/exodus_for/test/test-nsided.dmp b/packages/seacas/libraries/exodus_for/test/test-nsided.dmp index 011028907885..d2a7255b5fd0 100644 --- a/packages/seacas/libraries/exodus_for/test/test-nsided.dmp +++ b/packages/seacas/libraries/exodus_for/test/test-nsided.dmp @@ -49,13 +49,13 @@ data: eb_prop1 = 10 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ; eb_names = @@ -68,7 +68,7 @@ data: elem_map = 1, 2, 3, 4, 5, 6, 7 ; - connect1 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + connect1 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 17, 18, 19, 20, 27, 28, 30, 29, 31, 32, 33 ; ebepecnt1 = 4, 4, 8, 4, 6, 8, 3 ; @@ -87,8 +87,8 @@ data: "This is the second information record.", "This is the third information record." ; - frame_coordinates = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1, 1.2, - 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, + frame_coordinates = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1, 1.2, + 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9 ; frame_ids = 1, 11, 111 ; diff --git a/packages/seacas/libraries/exodus_for/test/test.dmp b/packages/seacas/libraries/exodus_for/test/test.dmp index a8fa396617fe..143456acd7dd 100644 --- a/packages/seacas/libraries/exodus_for/test/test.dmp +++ b/packages/seacas/libraries/exodus_for/test/test.dmp @@ -152,13 +152,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0 ; eb_names = @@ -307,55 +307,55 @@ data: "nod_var1" ; vals_nod_var1 = - 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, - 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, + 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, + 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, - 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, + 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52, - 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, - 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, + 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, + 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 1.75, 1.78, - 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, + 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, - 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, + 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, - 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, + 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56, - 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, - 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, + 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, + 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 2.75, 2.82, - 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, + 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, - 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, - 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, + 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, + 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 3.25, 3.34, - 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, + 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ; vals_nod_var2 = - 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, - 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, + 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, + 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, - 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, + 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52, - 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, - 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, + 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, + 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 2.75, 2.78, - 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, + 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, - 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, + 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, - 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, + 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56, - 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, - 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, + 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, + 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 3.75, 3.82, - 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, + 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, - 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, - 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, + 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, + 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 4.25, 4.34, - 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, + 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ; name_elem_var = diff --git a/packages/seacas/libraries/exodus_for/test/test1.dmp b/packages/seacas/libraries/exodus_for/test/test1.dmp index c99fea1a4770..c800bedb274f 100644 --- a/packages/seacas/libraries/exodus_for/test/test1.dmp +++ b/packages/seacas/libraries/exodus_for/test/test1.dmp @@ -186,13 +186,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 100, 50, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 100, 50, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 0, 20, 6, 0, 0, 6, 2, 0 ; eb_names = @@ -225,7 +225,7 @@ data: nmap_names = "" ; - node_map1 = 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, + node_map1 = 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84 ; em_prop1 = 111, 222 ; @@ -399,65 +399,65 @@ data: "nod_var1" ; vals_nod_var1 = - 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, - 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, + 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, + 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, - 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, - 1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, + 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, + 1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52, 1.54, 1.56, - 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, - 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, + 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, + 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 1.75, 1.78, 1.81, 1.84, - 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, - 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, + 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, + 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 2.08, 2.12, - 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, - 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, + 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, + 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, - 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, - 1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, + 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, + 1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56, 2.62, 2.68, - 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, - 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, + 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, + 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 2.75, 2.82, 2.89, 2.96, - 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, - 2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, + 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, + 2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 3.16, 3.24, - 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, - 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, + 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, + 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 3.25, 3.34, 3.43, 3.52, - 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, + 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8 ; vals_nod_var2 = - 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, - 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, + 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, + 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, - 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, - 2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, + 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, + 2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52, 2.54, 2.56, - 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, - 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, + 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, + 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 2.75, 2.78, 2.81, 2.84, - 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, - 2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, + 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, + 2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 3.08, 3.12, - 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, - 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, + 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, + 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, - 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, - 2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, + 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, + 2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56, 3.62, 3.68, - 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, - 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, + 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, + 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 3.75, 3.82, 3.89, 3.96, - 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, - 3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, + 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, + 3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 4.16, 4.24, - 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, - 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, + 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, + 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 4.25, 4.34, 4.43, 4.52, - 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, + 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8 ; name_elem_var = diff --git a/packages/seacas/libraries/exodus_for/test/test2-1.dmp b/packages/seacas/libraries/exodus_for/test/test2-1.dmp index d8bba9eac777..1f8d31729069 100644 --- a/packages/seacas/libraries/exodus_for/test/test2-1.dmp +++ b/packages/seacas/libraries/exodus_for/test/test2-1.dmp @@ -152,13 +152,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0 ; eb_names = @@ -307,55 +307,55 @@ data: "nod_var1" ; vals_nod_var1 = - 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, - 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, + 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, + 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, - 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, + 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52, - 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, - 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, + 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, + 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 1.75, 1.78, - 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, + 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, - 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, + 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, - 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, + 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56, - 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, - 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, + 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, + 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 2.75, 2.82, - 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, + 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, - 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, - 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, + 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, + 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 3.25, 3.34, - 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, + 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ; vals_nod_var2 = - 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, - 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, + 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, + 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, - 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, + 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52, - 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, - 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, + 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, + 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 2.75, 2.78, - 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, + 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, - 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, + 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, - 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, + 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56, - 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, - 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, + 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, + 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 3.75, 3.82, - 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, + 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, - 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, - 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, + 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, + 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 4.25, 4.34, - 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, + 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ; name_elem_var = diff --git a/packages/seacas/libraries/exodus_for/test/test2-2.dmp b/packages/seacas/libraries/exodus_for/test/test2-2.dmp index c039b85015be..38720f6e54d0 100644 --- a/packages/seacas/libraries/exodus_for/test/test2-2.dmp +++ b/packages/seacas/libraries/exodus_for/test/test2-2.dmp @@ -152,13 +152,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0 ; eb_names = @@ -307,55 +307,55 @@ data: "nod_var1" ; vals_nod_var1 = - 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, - 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, + 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, + 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, - 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, + 1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52, - 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, - 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, + 1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, + 1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 1.75, 1.78, - 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, + 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, - 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, + 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, - 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, + 1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56, - 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, - 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, + 1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, + 1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 2.75, 2.82, - 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, + 1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, - 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, - 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, + 1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, + 2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 3.25, 3.34, - 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, + 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ; vals_nod_var2 = - 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, - 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, + 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, + 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, - 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, + 2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52, - 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, - 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, + 2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, + 2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 2.75, 2.78, - 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, + 2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, - 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, + 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, - 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, + 2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56, - 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, - 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, + 2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, + 2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 3.75, 3.82, - 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, + 2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, - 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, - 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, + 2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, + 3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 4.25, 4.34, - 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, + 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ; name_elem_var = diff --git a/packages/seacas/libraries/exodus_for/test/testcp_ss.dmp b/packages/seacas/libraries/exodus_for/test/testcp_ss.dmp index ed45b8d16e30..8f85a59f23fb 100644 --- a/packages/seacas/libraries/exodus_for/test/testcp_ss.dmp +++ b/packages/seacas/libraries/exodus_for/test/testcp_ss.dmp @@ -118,13 +118,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0 ; eb_names = diff --git a/packages/seacas/libraries/exodus_for/test/testcpnl.dmp b/packages/seacas/libraries/exodus_for/test/testcpnl.dmp index 919ba94a2ac4..e650b1f1916c 100644 --- a/packages/seacas/libraries/exodus_for/test/testcpnl.dmp +++ b/packages/seacas/libraries/exodus_for/test/testcpnl.dmp @@ -118,13 +118,13 @@ data: ss_prop1 = 30, 31, 32, 33, 34 ; - coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, + coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 3, 6, 0 ; - coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, + coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 2, 2 ; - coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, + coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 0, 6, 2, 0 ; eb_names = diff --git a/packages/seacas/libraries/exodus_for/test/testpart.f90 b/packages/seacas/libraries/exodus_for/test/testpart.f90 index 3b97d761260f..39b1a937af85 100644 --- a/packages/seacas/libraries/exodus_for/test/testpart.f90 +++ b/packages/seacas/libraries/exodus_for/test/testpart.f90 @@ -40,7 +40,7 @@ Program TestExoRead_Part call exgnv (exoid, time_step, var_index, num_nodes, var_values,ierr) write (*, '("after exgnv, error = ", i3)' ) ierr write(*,*) var_values - + ! call expnv (exoid, time_step, var_index, num_nodes, var_values,ierr) DeAllocate(var_values) diff --git a/packages/seacas/libraries/exodus_for/test/testrd.dmp b/packages/seacas/libraries/exodus_for/test/testrd.dmp index e29fee84a003..53b30aec7026 100644 --- a/packages/seacas/libraries/exodus_for/test/testrd.dmp +++ b/packages/seacas/libraries/exodus_for/test/testrd.dmp @@ -6,7 +6,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 3 num_nodes = 26 num_elem = 5 @@ -15,7 +15,7 @@ num_node_sets = 2 num_side_sets = 5 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -42,7 +42,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -69,7 +69,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -98,8 +98,8 @@ z coords = 0.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -112,40 +112,40 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad -block name = block_a +element type = quad +block name = block_a num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 11 -element type = quad -block name = block_b +element type = quad +block name = block_b num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 12 -element type = hex -block name = block_c +element type = hex +block name = block_c num_elem_in_block = 1 num_nodes_per_elem = 8 num_attr = 1 after exgelb, error = 0 element block id = 13 -element type = tetra -block name = block_d +element type = tetra +block name = block_d num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 14 -element type = wedge -block name = block_e +element type = wedge +block name = block_e num_elem_in_block = 1 num_nodes_per_elem = 6 num_attr = 1 @@ -210,11 +210,11 @@ connect array for elem block 14 26 after exgnams, error = 0 -element block 1 name: block_a -element block 2 name: block_b -element block 3 name: block_c -element block 4 name: block_d -element block 5 name: block_e +element block 1 name: block_a +element block 2 name: block_b +element block 3 name: block_c +element block 4 name: block_d +element block 5 name: block_e after exgeat, error = 0 @@ -250,7 +250,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -272,7 +272,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -289,8 +289,8 @@ dist factors for node set 21 3.10 after exgnams, error = 0 -node set 1 name: nodeset_a1 -node set 2 name: nodeset_b2 +node set 1 name: nodeset_a1 +node set 2 name: nodeset_b2 There are 3 properties for each node set after exgpn, error = 0 @@ -308,16 +308,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -326,7 +326,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -527,11 +527,11 @@ node list for side set 34 no dist factors for side set 34 after exgnams, error = 0 -side set 1 name: surf_first -side set 2 name: surf_second -side set 3 name: surf_third -side set 4 name: surf_fourth -side set 5 name: surf_fifth +side set 1 name: surf_first +side set 2 name: surf_second +side set 3 name: surf_third +side set 4 name: surf_fourth +side set 5 name: surf_fifth There are 2 properties for each side set after exgpn, error = 0 @@ -556,37 +556,37 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 5 -num_df_per_set = +num_df_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 1 3 5 12 16 -df_ind = +df_ind = 1 5 9 9 9 -elem_list = +elem_list = 2 2 1 @@ -607,7 +607,7 @@ elem_list = 5 5 5 -side_list = +side_list = 4 2 2 @@ -628,7 +628,7 @@ side_list = 3 4 5 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -639,41 +639,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwt -07/07/93 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwt +07/07/93 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvan, error = 0 There are 1 global variables; their names are : -glo_vars +glo_vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/exodus_for/test/testrd1.dmp b/packages/seacas/libraries/exodus_for/test/testrd1.dmp index c3b5fcf064f5..d2c826f6c1c4 100644 --- a/packages/seacas/libraries/exodus_for/test/testrd1.dmp +++ b/packages/seacas/libraries/exodus_for/test/testrd1.dmp @@ -4,7 +4,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is testwt1 +title = This is testwt1 num_dim = 3 num_nodes = 28 num_elem = 8 @@ -13,7 +13,7 @@ num_node_sets = 2 num_side_sets = 5 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -42,7 +42,7 @@ x coords = 3.0 6.0 0.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -71,7 +71,7 @@ y coords = 2.0 2.0 2.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -102,8 +102,8 @@ z coords = 0.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmp, error = 0 @@ -185,49 +185,49 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad +element type = quad num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 3 after exgelb, error = 0 element block id = 11 -element type = quad +element type = quad num_elem_in_block = 2 num_nodes_per_elem = 4 num_attr = 3 after exgelb, error = 0 element block id = 12 -element type = hex +element type = hex num_elem_in_block = 1 num_nodes_per_elem = 8 num_attr = 3 after exgelb, error = 0 element block id = 13 -element type = tetra +element type = tetra num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 3 after exgelb, error = 0 element block id = 14 -element type = circle +element type = circle num_elem_in_block = 1 num_nodes_per_elem = 1 num_attr = 3 after exgelb, error = 0 element block id = 15 -element type = sphere +element type = sphere num_elem_in_block = 1 num_nodes_per_elem = 1 num_attr = 3 after exgelb, error = 0 element block id = 16 -element type = wedge +element type = wedge num_elem_in_block = 1 num_nodes_per_elem = 6 num_attr = 3 @@ -365,7 +365,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -387,7 +387,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -419,16 +419,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -437,7 +437,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -638,37 +638,37 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 32 33 34 -num_elem_per_set = +num_elem_per_set = 2 2 7 4 2 -num_df_per_set = +num_df_per_set = 4 4 0 0 0 -elem_ind = +elem_ind = 1 3 5 12 16 -df_ind = +df_ind = 1 5 9 9 9 -elem_list = +elem_list = 3 3 1 @@ -686,7 +686,7 @@ elem_list = 5 6 7 -side_list = +side_list = 4 2 2 @@ -704,7 +704,7 @@ side_list = 4 1 1 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -715,41 +715,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwt1 -03/16/94 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwt1 +03/16/94 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvnm, error = 0 There are 1 global variables; their names are : -glo vars +glo vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/exodus_for/test/testrd_nsid.dmp b/packages/seacas/libraries/exodus_for/test/testrd_nsid.dmp index 9f819d8567dd..fd8f5a59ea4d 100644 --- a/packages/seacas/libraries/exodus_for/test/testrd_nsid.dmp +++ b/packages/seacas/libraries/exodus_for/test/testrd_nsid.dmp @@ -5,7 +5,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 3 num_nodes = 33 num_elem = 7 @@ -14,7 +14,7 @@ num_node_sets = 0 num_side_sets = 0 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -48,7 +48,7 @@ x coords = 0.0 10.0 10.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -82,7 +82,7 @@ y coords = 0.0 0.0 10.0 -z coords = +z coords = 0.0 0.0 0.0 @@ -118,8 +118,8 @@ z coords = 10.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -134,7 +134,7 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = nsided +element type = nsided num_elem_in_block = 7 num_nodes_per_elem = 37 num_attr = 0 diff --git a/packages/seacas/libraries/exodus_for/test/testrdd.dmp b/packages/seacas/libraries/exodus_for/test/testrdd.dmp index 7deca71a03c8..df1826fc8d11 100644 --- a/packages/seacas/libraries/exodus_for/test/testrdd.dmp +++ b/packages/seacas/libraries/exodus_for/test/testrdd.dmp @@ -4,7 +4,7 @@ after exopen, error = 0 after exgini, error = 0 database parameters: -title = This is a test +title = This is a test num_dim = 2 num_nodes = 8 num_elem = 2 @@ -13,7 +13,7 @@ num_node_sets = 2 num_side_sets = 2 after exgcor, error = 0 -x coords = +x coords = 0.0 1.0 1.0 @@ -22,7 +22,7 @@ x coords = 2.0 2.0 1.0 -y coords = +y coords = 0.0 0.0 1.0 @@ -33,8 +33,8 @@ y coords = 1.0 after exgcon, error = 0 -x coord name = xcoor -y coord name = ycoor +x coord name = xcoor +y coord name = ycoor after exgmap, error = 0 elem_map(1) = 1 @@ -44,14 +44,14 @@ after exgebi, error = 0 after exgelb, error = 0 element block id = 10 -element type = quad +element type = quad num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 after exgelb, error = 0 element block id = 11 -element type = quad +element type = quad num_elem_in_block = 1 num_nodes_per_elem = 4 num_attr = 1 @@ -89,7 +89,7 @@ after exgnsi, error = 0 after exgnp, error = 0 -node set 20 parameters: +node set 20 parameters: num_nodes = 5 after exgns, error = 0 @@ -111,7 +111,7 @@ dist factors for node set 20 after exgnp, error = 0 -node set 21 parameters: +node set 21 parameters: num_nodes = 3 after exgns, error = 0 @@ -143,16 +143,16 @@ after EXNSDF = 8 exinq, error = 0 after exgcns, error = 0 concatenated node set info -ids = +ids = 20 21 -num_nodes_per_set = +num_nodes_per_set = 5 3 -node_ind = +node_ind = 1 6 -node_list = +node_list = 100 101 102 @@ -161,7 +161,7 @@ node_list = 200 201 202 -dist_fact = +dist_fact = 1.000 2.000 3.000 @@ -230,32 +230,32 @@ after exinq: EXSSDF = 8, error = 0 after exgcss, error = 0 concatenated side set info -ids = +ids = 30 31 -num_elem_per_set = +num_elem_per_set = 2 2 -num_df_per_set = +num_df_per_set = 4 4 -elem_ind = +elem_ind = 1 3 -df_ind = +df_ind = 1 5 -elem_list = +elem_list = 11 12 13 14 -side_list = +side_list = 1 2 3 4 -dist_fact = +dist_fact = 30.000 30.100 30.200 @@ -266,41 +266,41 @@ dist_fact = 31.300 after exgqa, error = 0 -QA records = -testwtd -07/07/93 -15:41:33 -FASTQ -fastq -07/07/93 -16:41:33 +QA records = +testwtd +07/07/93 +15:41:33 +FASTQ +fastq +07/07/93 +16:41:33 after exginf, error = 0 -info records = - This is the first information record. - This is the second information record. - This is the third information record. +info records = + This is the first information record. + This is the second information record. + This is the third information record. after exgvp, error = 0 after exgvan, error = 0 There are 1 global variables; their names are : -glo_vars +glo_vars after exgvp, error = 0 after exgvan, error = 0 There are 2 nodal variables; their names are : -nod_var0 -nod_var1 +nod_var0 +nod_var1 after exgvp, error = 0 after exgvan, error = 0 There are 3 element variables; their names are : -ele_var0 -ele_var1 -ele_var2 +ele_var0 +ele_var1 +ele_var2 after exgvtt, error = 0 This is the element variable truth table: diff --git a/packages/seacas/libraries/ioss/src/Ioss_BasisVariableType.h b/packages/seacas/libraries/ioss/src/Ioss_BasisVariableType.h index 7a78e1cfa0ad..32b095f61fd1 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_BasisVariableType.h +++ b/packages/seacas/libraries/ioss/src/Ioss_BasisVariableType.h @@ -75,13 +75,13 @@ namespace Ioss { typedef struct ex_basis { /* - * subc_dim: dimension of the subcell associated with the specified DoF ordinal + * subc_dim: dimension of the subcell associated with the specified DoF ordinal * -- 0 node, 1 edge, 2 face, 3 volume [Range: 0..3] * subc_ordinal: ordinal of the subcell relative to its parent cell - * -- 0..n for each ordinal with the same subc dim [Range: <= DoF ordinal] - * subc_dof_ordinal: ordinal of the DoF relative to the subcell - * subc_num_dof: cardinality of the DoF set associated with this subcell. - * xi, eta, mu (Ο, η, ζ): Parametric coordinate location of the DoF + * -- 0..n for each ordinal with the same subc dim [Range: <= DoF ordinal] + * subc_dof_ordinal: ordinal of the DoF relative to the subcell + * subc_num_dof: cardinality of the DoF set associated with this subcell. + * xi, eta, mu (Ο, η, ζ): Parametric coordinate location of the DoF * -- (Only first ndim values are valid) */ char name[EX_MAX_NAME + 1]; diff --git a/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.C b/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.C new file mode 100644 index 000000000000..dc9a295fb49d --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.C @@ -0,0 +1,391 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_ChangeSet.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" + +#include "Ioss_DynamicTopology.h" +#include "Ioss_EntityBlock.h" +#include "Ioss_EntityType.h" +#include "Ioss_Field.h" +#include "Ioss_FileInfo.h" +#include "Ioss_GroupingEntity.h" +#include "Ioss_IOFactory.h" + +#include +#include +#include + +#include +#include + +namespace { + int file_exists(const Ioss::ParallelUtils &util, const std::string &filename, + std::string &message, bool filePerRank) + { + std::string filenameBase = filename; + const int par_size = util.parallel_size(); + const int par_rank = util.parallel_rank(); + + if (par_size > 1 && !filePerRank) { + filenameBase = Ioss::Utils::decode_filename(filenameBase, par_rank, par_size); + } + + Ioss::FileInfo file = Ioss::FileInfo(filenameBase); + return file.parallel_exists(util.communicator(), message); + } + + std::string get_decomposition_property(const Ioss::PropertyManager &properties, + Ioss::DatabaseUsage db_usage) + { + std::string decomp_method; + std::string decomp_property; + if (db_usage == Ioss::READ_MODEL) { + decomp_property = "MODEL_DECOMPOSITION_METHOD"; + } + else if (db_usage == Ioss::READ_RESTART || db_usage == Ioss::QUERY_TIMESTEPS_ONLY) { + decomp_property = "RESTART_DECOMPOSITION_METHOD"; + } + + // Applies to either read_model or read_restart + if (properties.exists("DECOMPOSITION_METHOD")) { + std::string method = properties.get("DECOMPOSITION_METHOD").get_string(); + return Ioss::Utils::uppercase(method); + } + + // Check for property... + if (properties.exists(decomp_property)) { + std::string method = properties.get(decomp_property).get_string(); + return Ioss::Utils::uppercase(method); + } + return decomp_method; + } + + bool internal_decomp_specified(const Ioss::PropertyManager &props, Ioss::DatabaseUsage usage) + { + bool internalDecompSpecified = false; + + std::string method = get_decomposition_property(props, usage); + if (!method.empty() && method != "EXTERNAL") { + internalDecompSpecified = true; + } + + return internalDecompSpecified; + } + +} // namespace + +namespace Ioss { + + ChangeSet::ChangeSet(Ioss::Region *region) + : m_database(region->get_database()), + m_ioDB(region->get_property("base_filename").get_string()), + m_dbType(region->get_property("database_type").get_string()), + m_fileCyclicCount(region->get_file_cyclic_count()) + { + } + + ChangeSet::ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, const std::string &dbType, + unsigned fileCyclicCount) + : m_database(db), m_ioDB(dbName), m_dbType(dbType), m_fileCyclicCount(fileCyclicCount) + { + } + + ChangeSet::~ChangeSet() { clear_change_sets(); } + + DatabaseIO *ChangeSet::get_database() const { return m_database; } + + const ParallelUtils &ChangeSet::util() const { return get_database()->util(); } + + void ChangeSet::get_cyclic_multi_file_change_sets() + { + auto db = get_database(); + + m_databaseFormat = CHANGE_SET_CYCLIC_MULTI_FILES; + + Ioss::FileNameGenerator generator = + Ioss::construct_cyclic_filename_generator(m_fileCyclicCount); + + bool found = true; + int step = 0; + int fileCyclicCount = m_fileCyclicCount; + + while (found && (step < fileCyclicCount)) { + ++step; + + std::string expanded = Ioss::expand_topology_files( + generator, util(), m_ioDB, db->get_property_manager(), db->usage(), step); + if (!expanded.empty()) { + m_changeSetNames.push_back(expanded); + } + else { + found = false; + } + } + + m_changeSetDatabases.resize(m_changeSetNames.size(), nullptr); + } + + void ChangeSet::get_linear_multi_file_change_sets() + { + auto db = get_database(); + + m_databaseFormat = CHANGE_SET_LINEAR_MULTI_FILES; + + Ioss::FileNameGenerator generator = Ioss::construct_linear_filename_generator(); + + bool found = true; + int step = 0; + + while (found) { + ++step; + + std::string expanded = Ioss::expand_topology_files( + generator, util(), m_ioDB, db->get_property_manager(), db->usage(), step); + if (!expanded.empty()) { + m_changeSetNames.push_back(expanded); + } + else { + found = false; + } + } + + m_changeSetDatabases.resize(m_changeSetNames.size(), nullptr); + } + + void ChangeSet::populate_change_sets(bool loadAllFiles) + { + clear_change_sets(); + + if (!loadAllFiles) { + // Load only the current db file + m_databaseFormat = CHANGE_SET_LINEAR_MULTI_FILES; + m_changeSetNames.push_back(get_database()->get_filename()); + m_changeSetDatabases.resize(m_changeSetNames.size(), nullptr); + return; + } + + if (get_file_cyclic_count() > 0) { + get_cyclic_multi_file_change_sets(); + } + else { + get_linear_multi_file_change_sets(); + } + } + + void ChangeSet::verify_change_set_index(unsigned index) const + { + if (index >= m_changeSetNames.size()) { + std::ostringstream errmsg; + fmt::print(errmsg, "Invalid change set index {} with a max value of {}\n", index, + m_changeSetNames.size() - 1); + IOSS_ERROR(errmsg); + } + } + + std::string ChangeSet::get_change_set_name(unsigned index) const + { + verify_change_set_index(index); + + return m_changeSetNames[index]; + } + + void ChangeSet::close_change_set(unsigned index) + { + verify_change_set_index(index); + + auto db = m_changeSetDatabases[index]; + if (nullptr != db) { + db->closeDatabase(); + delete db; + m_changeSetDatabases[index] = nullptr; + } + } + + Ioss::DatabaseIO *ChangeSet::open_change_set(unsigned index, Ioss::DatabaseUsage usage) + { + verify_change_set_index(index); + + Ioss::DatabaseIO *db = nullptr; + + auto csdb = m_changeSetDatabases[index]; + if (nullptr != csdb) { + if (csdb->usage() == usage) { + return csdb; + } + else { + csdb->closeDatabase(); + delete csdb; + m_changeSetDatabases[index] = nullptr; + } + } + + // open db + const std::string &ioDB = m_changeSetNames[index]; + const std::string dbType = m_dbType; + + db = Ioss::IOFactory::create(dbType, ioDB, usage, util().communicator(), + get_database()->get_property_manager()); + std::string error_message; + bool is_valid_file = db != nullptr && db->ok(false, &error_message, nullptr); + if (!is_valid_file) { + delete db; + std::ostringstream errmsg; + errmsg << error_message; + errmsg << __FILE__ << ", " << __FUNCTION__ << ", filename " << ioDB + << " is not a valid file\n"; + IOSS_ERROR(errmsg); + } + + m_changeSetDatabases[index] = db; + + return db; + } + + void ChangeSet::clear_change_sets() + { + m_changeSetNames.clear(); + + for (size_t i = 0; i < m_changeSetDatabases.size(); i++) { + auto db = m_changeSetDatabases[i]; + if (nullptr != db) { + db->closeDatabase(); + delete db; + m_changeSetDatabases[i] = nullptr; + } + } + + m_changeSetDatabases.clear(); + } + + std::string ChangeSet::get_cyclic_database_filename(const std::string &baseFileName, + unsigned int fileCyclicCount, + unsigned int step) + { + Ioss::FileNameGenerator generator = Ioss::construct_cyclic_filename_generator(fileCyclicCount); + return generator(baseFileName, step); + } + + std::string ChangeSet::get_linear_database_filename(const std::string &baseFileName, + unsigned int step) + { + Ioss::FileNameGenerator generator = Ioss::construct_linear_filename_generator(); + return generator(baseFileName, step); + } + + std::string expand_topology_files(FileNameGenerator generator, const Ioss::ParallelUtils &util, + const std::string &basename, + const Ioss::PropertyManager &properties, + Ioss::DatabaseUsage usage, int step) + { + // See if there are multiple topology files + + // If the file exists on all processors, return the filename. + // If the file does not exist on any processors, return ""; + // If the file exists on some, but not all, throw an exception. + + std::string filename = generator(basename, step); + + bool internalDecompSpecified = internal_decomp_specified(properties, usage); + std::string message; + int exists = ::file_exists(util, filename, message, internalDecompSpecified); + + int par_size = util.parallel_size(); + int par_rank = util.parallel_rank(); + + if (exists > 0 && exists < par_size) { + std::ostringstream errmsg; + errmsg << "ERROR: Unable to open input database"; + if (par_rank == 0) { + errmsg << " '" << filename << "'" << "\n\ton processor(s): " << message; + } + else { + errmsg << ". See processor 0 output for more details.\n"; + } + IOSS_ERROR(errmsg); + } + + if (exists == par_size) { + return filename; + } + + // Does not exist on any processors + return std::string(); + } + + std::pair + expand_topology_files(FileNameGenerator generator, const Ioss::ParallelUtils &util, + const std::string &basename, const std::string &db_type, + const Ioss::PropertyManager &properties, Ioss::DatabaseUsage usage, + int step) + { + // See if there are multiple topology files + + // If the file exists on all processors, return the filename. + // If the file does not exist on any processors, return ""; + // If the file exists on some, but not all, throw an exception. + + Ioss::DatabaseIO *db = nullptr; + std::string filename = + expand_topology_files(generator, util, basename, properties, usage, step); + + if (!filename.empty()) { + db = Ioss::IOFactory::create(db_type, filename, usage, util.communicator(), properties); + int bad_count = 0; + std::string error_message; + bool is_valid_file = db != nullptr && db->ok(false, &error_message, &bad_count); + if (is_valid_file) { + return std::make_pair(filename, db); + } + else { + delete db; + std::ostringstream errmsg; + errmsg << error_message; + errmsg << __FILE__ << ", " << __FUNCTION__ << ", filename " << filename + << " is not a valid file\n"; + IOSS_ERROR(errmsg); + } + } + + // Does not exist on any processors + return std::make_pair(filename, db); + } + + Ioss::FileNameGenerator construct_cyclic_filename_generator(unsigned cyclicCount) + { + if (cyclicCount > 26) { + cyclicCount = 26; + } + + Ioss::FileNameGenerator generator = [cyclicCount](const std::string &baseFileName, + unsigned step) { + static std::string suffix = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + std::string filename = baseFileName; + if (step == 0) + step++; + filename += "-" + suffix.substr((step - 1) % cyclicCount, 1); + return filename; + }; + + return generator; + } + + Ioss::FileNameGenerator construct_linear_filename_generator() + { + Ioss::FileNameGenerator generator = [](const std::string &baseFileName, unsigned step) { + std::ostringstream filename; + filename << baseFileName; + if (step > 1) { + filename << "-s" << std::setw(4) << std::setfill('0') << step; + } + return filename.str(); + }; + + return generator; + } +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.h b/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.h new file mode 100644 index 000000000000..23ad17d09f16 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_ChangeSet.h @@ -0,0 +1,104 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" +#include "Ioss_ParallelUtils.h" +#include "Ioss_PropertyManager.h" +#include "Ioss_Region.h" + +#include +#include +#include +#include +#include + +namespace Ioss { + + using FileNameGenerator = + std::function; + + enum ChangeSetFormat { + CHANGE_SET_NONE = (0), + CHANGE_SET_INTERNAL_FILES = (1U << 0), + CHANGE_SET_LINEAR_MULTI_FILES = (1U << 1), + CHANGE_SET_CYCLIC_MULTI_FILES = (1U << 2) + }; + + std::pair + expand_topology_files(FileNameGenerator generator, const Ioss::ParallelUtils &util, + const std::string &basename, const std::string &db_type, + const Ioss::PropertyManager &properties, Ioss::DatabaseUsage usage, + int step); + + std::string expand_topology_files(FileNameGenerator generator, const Ioss::ParallelUtils &util, + const std::string &basename, + const Ioss::PropertyManager &properties, + Ioss::DatabaseUsage usage, int step); + + FileNameGenerator construct_cyclic_filename_generator(unsigned cyclicCount); + FileNameGenerator construct_linear_filename_generator(); + + class IOSS_EXPORT ChangeSet + { + public: + explicit ChangeSet(Ioss::Region *region); + ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, const std::string &dbType, + unsigned fileCyclicCount); + + virtual ~ChangeSet(); + ChangeSet() = delete; + ChangeSet(const ChangeSet &) = delete; + + IOSS_NODISCARD unsigned supported_formats() const { return m_supportedFormats; } + IOSS_NODISCARD unsigned database_format() const { return m_databaseFormat; } + + virtual void populate_change_sets(bool loadAllFiles = true); + + IOSS_NODISCARD virtual DatabaseIO *open_change_set(unsigned index, Ioss::DatabaseUsage usage); + virtual void close_change_set(unsigned index); + + IOSS_NODISCARD size_t size() const { return m_changeSetNames.size(); } + IOSS_NODISCARD const std::vector &names() const { return m_changeSetNames; } + IOSS_NODISCARD std::string get_change_set_name(unsigned index) const; + + IOSS_NODISCARD unsigned get_file_cyclic_count() const { return m_fileCyclicCount; } + + static std::string get_cyclic_database_filename(const std::string &baseFileName, + unsigned int fileCyclicCount, + unsigned int step); + + static std::string get_linear_database_filename(const std::string &baseFileName, + unsigned int step); + + private: + std::vector m_changeSetDatabases; + + protected: + void get_cyclic_multi_file_change_sets(); + void get_linear_multi_file_change_sets(); + + void verify_change_set_index(unsigned index) const; + + virtual void clear_change_sets(); + + DatabaseIO *get_database() const; + IOSS_NODISCARD const ParallelUtils &util() const; + + Ioss::DatabaseIO *m_database{nullptr}; + std::string m_ioDB; + std::string m_dbType; + unsigned m_fileCyclicCount{0}; + + unsigned m_supportedFormats{CHANGE_SET_LINEAR_MULTI_FILES | CHANGE_SET_CYCLIC_MULTI_FILES}; + unsigned m_databaseFormat{CHANGE_SET_NONE}; + + std::vector m_changeSetNames; + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.C b/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.C new file mode 100644 index 000000000000..2bdc3c8273e4 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.C @@ -0,0 +1,153 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_ChangeSet.h" +#include "Ioss_ChangeSetFactory.h" +#include "Ioss_Utils.h" // for IOSS_ERROR +#include "Ioss_Version.h" +#include +#include +#include +#include // for _Rb_tree_iterator, etc +#include // for basic_ostream, etc +#include +#include // for char_traits, string, etc + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" // for DatabaseUsage +#include "Ioss_PropertyManager.h" +#include "Ioss_Region.h" + +namespace { +#if defined(IOSS_THREADSAFE) + std::mutex m_; +#endif + + int describe_nl(Ioss::ChangeSetFactoryMap *registry, Ioss::NameList *names) + { + int count = 0; + Ioss::ChangeSetFactoryMap::const_iterator I; + for (I = registry->begin(); I != registry->end(); ++I) { + names->push_back((*I).first); + ++count; + } + return count; + } +} // namespace + +namespace Ioss { + class ChangeSet; + + using ChangeSetFactoryValuePair = ChangeSetFactoryMap::value_type; +} // namespace Ioss + +const Ioss::ChangeSetFactory *Ioss::ChangeSetFactory::factory() +{ + static Ioss::ChangeSetFactory registerThis("ioss"); + return ®isterThis; +} + +std::shared_ptr Ioss::ChangeSetFactory::create(Ioss::Region *region) +{ + IOSS_FUNC_ENTER(m_); + std::string dbType = region->get_property("database_type").get_string(); + + auto iter = registry()->find(dbType); + if (iter == registry()->end()) { + if (registry()->empty()) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: No change set types have been registered.\n" + " Was Ioss::Init::Initializer() called?\n\n"); + IOSS_ERROR(errmsg); + } + else { + iter = registry()->find("ioss"); + } + } + + Ioss::ChangeSetFactory *factory = (*iter).second; + Ioss::ChangeSet *csPtr = factory->make_ChangeSet(region); + std::shared_ptr cs(csPtr); + return cs; +} + +std::shared_ptr Ioss::ChangeSetFactory::create(Ioss::DatabaseIO *db, + const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount) +{ + IOSS_FUNC_ENTER(m_); + + auto iter = registry()->find(dbType); + if (iter == registry()->end()) { + if (registry()->empty()) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: No change set types have been registered.\n" + " Was Ioss::Init::Initializer() called?\n\n"); + IOSS_ERROR(errmsg); + } + else { + iter = registry()->find("ioss"); + } + } + + Ioss::ChangeSetFactory *factory = (*iter).second; + Ioss::ChangeSet *csPtr = factory->make_ChangeSet(db, dbName, dbType, fileCyclicCount); + std::shared_ptr cs(csPtr); + return cs; +} + +Ioss::ChangeSet *Ioss::ChangeSetFactory::make_ChangeSet(Ioss::Region *region) const +{ + return new ChangeSet(region); +} + +Ioss::ChangeSet *Ioss::ChangeSetFactory::make_ChangeSet(Ioss::DatabaseIO *db, + const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount) const +{ + return new ChangeSet(db, dbName, dbType, fileCyclicCount); +} + +/** \brief Get the names of change set types known to IOSS. + * + * \param[out] names The list of known change set types. + * \returns The number of known change set types. + */ +int Ioss::ChangeSetFactory::describe(NameList *names) +{ + IOSS_FUNC_ENTER(m_); + return ::describe_nl(registry(), names); +} + +/** \brief Get the names of change set types known to IOSS. + * + * \returns The list of known change set types. + */ +Ioss::NameList Ioss::ChangeSetFactory::describe() +{ + Ioss::NameList names; + describe(&names); + return names; +} + +Ioss::ChangeSetFactory::ChangeSetFactory(const std::string &type) +{ + registry()->insert(ChangeSetFactoryValuePair(type, this)); +} + +void Ioss::ChangeSetFactory::alias(const std::string &base, const std::string &syn) +{ + Ioss::ChangeSetFactory *factory = (*registry()->find(base)).second; + registry()->insert(ChangeSetFactoryValuePair(syn, factory)); +} + +Ioss::ChangeSetFactoryMap *Ioss::ChangeSetFactory::registry() +{ + static ChangeSetFactoryMap registry_; + return ®istry_; +} diff --git a/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.h b/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.h new file mode 100644 index 000000000000..49def95e8edb --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_ChangeSetFactory.h @@ -0,0 +1,60 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "ioss_export.h" + +#include "Ioss_CodeTypes.h" +#include +#include +#include +#include + +/** \brief The main namespace for the Ioss library. + */ +namespace Ioss { + + class Region; + class DatabaseIO; + class ChangeSet; + class ChangeSetFactory; + using NameList = Ioss::NameList; + using ChangeSetFactoryMap = std::map>; + + /** \brief The main public user interface for creating Ioss::ChangeSet objects. + */ + class IOSS_EXPORT ChangeSetFactory + { + public: + virtual ~ChangeSetFactory() = default; + IOSS_NODISCARD static std::shared_ptr create(Ioss::Region *region); + IOSS_NODISCARD static std::shared_ptr create(Ioss::DatabaseIO *db, + const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount = 0); + + static int describe(NameList *names); + IOSS_NODISCARD static NameList describe(); + + static const ChangeSetFactory *factory(); + + protected: + explicit ChangeSetFactory(const std::string &type); + + IOSS_NODISCARD virtual ChangeSet *make_ChangeSet(Ioss::Region *region) const; + IOSS_NODISCARD virtual ChangeSet *make_ChangeSet(Ioss::DatabaseIO *db, + const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount) const; + + static void alias(const std::string &base, const std::string &syn); + + private: + IOSS_NODISCARD static ChangeSetFactoryMap *registry(); + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_Compare.C b/packages/seacas/libraries/ioss/src/Ioss_Compare.C index 440622159d29..37cdadba36d5 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Compare.C +++ b/packages/seacas/libraries/ioss/src/Ioss_Compare.C @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,7 @@ #include "Ioss_SideSet.h" #include "Ioss_StructuredBlock.h" #include "Ioss_Utils.h" +#include "tokenize.h" /* These messages indicate a structural difference between the files * being compared. Use Ioss::WarnOut(). @@ -70,6 +72,8 @@ namespace { std::ostringstream &buf); bool compare_qa_info(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2, std::ostringstream &buf); + bool compare_change_sets(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2, + std::ostringstream &buf); bool compare_nodeblock(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2); bool compare_assemblies(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2); bool compare_elementblocks(const Ioss::Region &input_region_1, @@ -113,26 +117,42 @@ namespace { const Ioss::GroupingEntity *ige_2, Ioss::DataPool &in_pool, const std::string &field_name, const Ioss::MeshCopyOptions &options, std::ostringstream &buf); + + bool open_change_set(const std::string &cs_name, Ioss::Region ®ion) + { + bool success = true; + if (!cs_name.empty()) { + success = region.load_internal_change_set_mesh(cs_name); + if (!success) { + fmt::print(stderr, "ERROR: Unable to open change_set '{}' in file '{}'\n", cs_name, + region.get_database()->get_filename()); + } + } + return success; + } + + bool compare_database_internal(Ioss::Region &input_region_1, Ioss::Region &input_region_2, + const Ioss::MeshCopyOptions &options); } // namespace bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region &input_region_2, const Ioss::MeshCopyOptions &options) { - bool overall_result = true; - bool rc; - DataPool data_pool; + bool overall_result = true; rel_tolerance = options.rel_tolerance; abs_tolerance = options.abs_tolerance; tol_floor = options.tol_floor; - // COMPARE all properties of input database... - { + // COMPARE change_sets in the databases... + if (options.selected_change_sets.empty()) { std::ostringstream buf; - fmt::print(buf, "PROPERTIES mismatch ({})\n", input_region_1.name()); - if (!compare_properties(&input_region_1, &input_region_2, buf)) { + fmt::print(buf, "CHANGE SET mismatch."); + if (!compare_change_sets(input_region_1, input_region_2, buf)) { overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + fmt::print(Ioss::WarnOut(), + "{} Only the change sets that are found in both databases will be compared.\n", + buf.str()); } } @@ -145,446 +165,297 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region } } - { - std::ostringstream buf; - fmt::print(buf, "\nNODEBLOCK mismatch\n"); - if (!compare_nodeblock(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } + Ioss::NameList cs1_names; + Ioss::NameList cs2_names; - { - std::ostringstream buf; - fmt::print(buf, "\nEDGEBLOCK mismatch\n"); - if (!compare_edgeblocks(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + if (!options.selected_change_sets.empty() && options.selected_change_sets != "ALL") { + cs1_names = Ioss::tokenize(options.selected_change_sets, ","); + bool success = true; + for (const auto &cs_name : cs1_names) { + success &= Ioss::Utils::check_valid_change_set_name(cs_name, input_region_1); } - } - { - std::ostringstream buf; - fmt::print(buf, "\nFACEBLOCK mismatch\n"); - if (!compare_faceblocks(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - { - std::ostringstream buf; - fmt::print(buf, "\nELEMENTBLOCK mismatch\n"); - if (!compare_elementblocks(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, "\nSTRUCTUREDBLOCK mismatch\n"); - if (!compare_structuredblocks(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, "\nNODESET mismatch\n"); - if (!compare_nodesets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, "\nEDGESET mismatch\n"); - if (!compare_edgesets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, "\nFACESET mismatch\n"); - if (!compare_facesets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, "\nELEMSET mismatch\n"); - if (!compare_elemsets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + if (!success) { + return false; } + cs2_names = cs1_names; } - - { - std::ostringstream buf; - fmt::print(buf, "\nSIDESET mismatch\n"); - if (!compare_sidesets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } + else { + cs1_names = input_region_1.get_database()->internal_change_set_describe(); + cs2_names = input_region_2.get_database()->internal_change_set_describe(); } - { - std::ostringstream buf; - fmt::print(buf, "\nCOMMSET mismatch\n"); - if (!compare_commsets(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + for (const auto &cs1_name : cs1_names) { + auto it = std::find(cs2_names.cbegin(), cs2_names.cend(), cs1_name); + if (it == cs2_names.cend()) { + fmt::print(Ioss::WarnOut(), "Skipping change set {}, not found in input #2.\n", cs1_name); + continue; } - } - { - std::ostringstream buf; - fmt::print(buf, "\nCOORDINATE FRAME mismatch\n"); - if (!compare_coordinate_frames(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + bool success1 = open_change_set(cs1_name, input_region_1); + bool success2 = open_change_set(cs1_name, input_region_2); + if (!success1 || !success2) { + continue; } + overall_result &= compare_database_internal(input_region_1, input_region_2, options); } + return overall_result; +} +namespace { + bool compare_database_internal(Ioss::Region &input_region_1, Ioss::Region &input_region_2, + const Ioss::MeshCopyOptions &options) { - std::ostringstream buf; - fmt::print(buf, "\nASSEMBLY mismatch\n"); - if (!compare_assemblies(input_region_1, input_region_2)) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - bool node_major = input_region_2.node_major(); + bool rc; + bool overall_result = true; + Ioss::DataPool data_pool; - if (!node_major) { + // COMPARE all properties of input database... { std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", node_major); - rc = compare_field_data(input_region_1.get_element_blocks(), - input_region_2.get_element_blocks(), data_pool, Ioss::Field::MESH, - options, buf); - if (!rc) { - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + fmt::print(buf, "PROPERTIES mismatch ({})\n", input_region_1.name()); + if (!compare_properties(&input_region_1, &input_region_2, buf)) { overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } { std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", - node_major); - - rc = compare_field_data(input_region_1.get_element_blocks(), - input_region_2.get_element_blocks(), data_pool, - Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + fmt::print(buf, "\nNODEBLOCK mismatch\n"); + if (!compare_nodeblock(input_region_1, input_region_2)) { overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - } - if (input_region_1.mesh_type() != Ioss::MeshType::STRUCTURED) { - assert(input_region_2.mesh_type() != Ioss::MeshType::STRUCTURED); { std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "node blocks"); - - rc = compare_field_data(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), - data_pool, Ioss::Field::MESH, options, buf); - if (!rc) { + fmt::print(buf, "\nEDGEBLOCK mismatch\n"); + if (!compare_edgeblocks(input_region_1, input_region_2)) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } { std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "node blocks"); - rc = compare_field_data(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), - data_pool, Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { + fmt::print(buf, "\nFACEBLOCK mismatch\n"); + if (!compare_faceblocks(input_region_1, input_region_2)) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - } - if (node_major) { { std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", node_major); - rc = compare_field_data(input_region_1.get_element_blocks(), - input_region_2.get_element_blocks(), data_pool, Ioss::Field::MESH, - options, buf); - if (!rc) { + fmt::print(buf, "\nELEMENTBLOCK mismatch\n"); + if (!compare_elementblocks(input_region_1, input_region_2)) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", - node_major); - rc = compare_field_data(input_region_1.get_element_blocks(), - input_region_2.get_element_blocks(), data_pool, - Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { + fmt::print(buf, "\nSTRUCTUREDBLOCK mismatch\n"); + if (!compare_structuredblocks(input_region_1, input_region_2)) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - } - - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "structured blocks"); - rc = compare_field_data(input_region_1.get_structured_blocks(), - input_region_2.get_structured_blocks(), data_pool, Ioss::Field::MESH, - options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "structured blocks"); - rc = compare_field_data(input_region_1.get_structured_blocks(), - input_region_2.get_structured_blocks(), data_pool, - Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "edge blocks"); - rc = compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), - data_pool, Ioss::Field::MESH, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "edge blocks"); - rc = compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), - data_pool, Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nNODESET mismatch\n"); + if (!compare_nodesets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "face blocks"); - rc = compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), - data_pool, Ioss::Field::MESH, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nEDGESET mismatch\n"); + if (!compare_edgesets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "face blocks"); - rc = compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), - data_pool, Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nFACESET mismatch\n"); + if (!compare_facesets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "element sets"); - rc = compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), - data_pool, Ioss::Field::MESH, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nELEMSET mismatch\n"); + if (!compare_elemsets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "element sets"); - rc = compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), - data_pool, Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nSIDESET mismatch\n"); + if (!compare_sidesets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "comm sets"); - rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), data_pool, - Ioss::Field::MESH, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nCOMMSET mismatch\n"); + if (!compare_commsets(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "comm sets"); - rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), data_pool, - Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nCOORDINATE FRAME mismatch\n"); + if (!compare_coordinate_frames(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - { - std::ostringstream buf; - fmt::print(buf, COMMUNICATION_FIELD_VALUE_MISMATCH, "comm sets"); - rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), data_pool, - Ioss::Field::COMMUNICATION, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + { + std::ostringstream buf; + fmt::print(buf, "\nASSEMBLY mismatch\n"); + if (!compare_assemblies(input_region_1, input_region_2)) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } } - } - // Side Sets - if (input_region_1.mesh_type() == Ioss::MeshType::UNSTRUCTURED) { - // This should have already been checked. - assert(input_region_2.mesh_type() == Ioss::MeshType::UNSTRUCTURED); - - const auto &in_fss_1 = input_region_1.get_sidesets(); - const auto &in_fss_2 = input_region_2.get_sidesets(); - - // This should have already been checked. - assert(in_fss_1.size() == in_fss_2.size()); - for (const auto &ifs : in_fss_1) { - const std::string &name = ifs->name(); + bool node_major = input_region_2.node_major(); - // Find matching output sideset - typename std::vector::const_iterator it; - for (it = in_fss_2.begin(); it != in_fss_2.end(); ++it) { - if (name == (*it)->name()) { - break; + if (!node_major) { + { + std::ostringstream buf; + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", + node_major); + rc = compare_field_data(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), data_pool, Ioss::Field::MESH, + options, buf); + if (!rc) { + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + overall_result = false; } } - if (it == in_fss_2.end()) { - fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); - continue; + { + std::ostringstream buf; + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", + node_major); + + rc = compare_field_data(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), data_pool, + Ioss::Field::ATTRIBUTE, options, buf); + if (!rc) { + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + overall_result = false; + } } + } + if (input_region_1.mesh_type() != Ioss::MeshType::STRUCTURED) { + assert(input_region_2.mesh_type() != Ioss::MeshType::STRUCTURED); { std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "side sets"); - rc = compare_field_data(ifs, (*it), data_pool, Ioss::Field::MESH, options, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "node blocks"); + + rc = compare_field_data(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), + data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - { std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "side sets"); - rc = compare_field_data(ifs, (*it), data_pool, Ioss::Field::ATTRIBUTE, options, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "node blocks"); + rc = compare_field_data(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), + data_pool, Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - const auto &in_sbs_1 = ifs->get_side_blocks(); - const auto &in_sbs_2 = (*it)->get_side_blocks(); - - // This should have already been checked. - assert(in_sbs_1.size() == in_sbs_2.size()); - - for (const auto &isb : in_sbs_1) { - const std::string &sbname = isb->name(); - - // Find matching output sideblock - typename std::vector::const_iterator iter; - for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { - if (sbname == (*iter)->name()) { - break; - } - } - if (iter == in_sbs_2.end()) { - fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDEBLOCK", name); - continue; - } - - { - std::ostringstream buf; - fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "side blocks"); - rc = compare_field_data(isb, (*iter), data_pool, Ioss::Field::MESH, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } - } - - { - std::ostringstream buf; - fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "side blocks"); - rc = compare_field_data(isb, (*iter), data_pool, Ioss::Field::ATTRIBUTE, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } + } + if (node_major) { + { + std::ostringstream buf; + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", + node_major); + rc = compare_field_data(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), data_pool, Ioss::Field::MESH, + options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH " (node_major = {})", "element blocks", + node_major); + rc = compare_field_data(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), data_pool, + Ioss::Field::ATTRIBUTE, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } } - } - // This should have already been checked - assert(input_region_1.property_exists("state_count") == - input_region_2.property_exists("state_count")); - - if (input_region_1.property_exists("state_count") && - input_region_1.get_property("state_count").get_int() > 0) { + { + std::ostringstream buf; + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "structured blocks"); + rc = compare_field_data(input_region_1.get_structured_blocks(), + input_region_2.get_structured_blocks(), data_pool, Ioss::Field::MESH, + options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } - // For each 'TRANSIENT' field in the node blocks and element - // blocks, transfer to the output node and element blocks. { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "region"); - rc = compare_fields(&input_region_1, &input_region_2, Ioss::Field::REDUCTION, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "structured blocks"); + rc = compare_field_data(input_region_1.get_structured_blocks(), + input_region_2.get_structured_blocks(), data_pool, + Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "node blocks"); - rc = compare_fields(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "edge blocks"); + rc = compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), + data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "edge blocks"); - rc = compare_fields(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "edge blocks"); + rc = compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), + data_pool, Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -593,9 +464,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "face blocks"); - rc = compare_fields(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "face blocks"); + rc = compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), + data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -604,9 +475,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "element blocks"); - rc = compare_fields(input_region_1.get_element_blocks(), input_region_2.get_element_blocks(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "face blocks"); + rc = compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), + data_pool, Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -615,9 +486,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "structured blocks"); - rc = compare_fields(input_region_1.get_structured_blocks(), - input_region_2.get_structured_blocks(), Ioss::Field::TRANSIENT, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "element sets"); + rc = compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), + data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -626,9 +497,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "node sets"); - rc = compare_fields(input_region_1.get_nodesets(), input_region_2.get_nodesets(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "element sets"); + rc = compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), + data_pool, Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -637,9 +508,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "edge sets"); - rc = compare_fields(input_region_1.get_edgesets(), input_region_2.get_edgesets(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "comm sets"); + rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), + data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -648,9 +519,9 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "face sets"); - rc = compare_fields(input_region_1.get_facesets(), input_region_2.get_facesets(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "comm sets"); + rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), + data_pool, Ioss::Field::ATTRIBUTE, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); @@ -659,286 +530,493 @@ bool Ioss::Compare::compare_database(Ioss::Region &input_region_1, Ioss::Region { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "element sets"); - rc = compare_fields(input_region_1.get_elementsets(), input_region_2.get_elementsets(), - Ioss::Field::TRANSIENT, buf); + fmt::print(buf, COMMUNICATION_FIELD_VALUE_MISMATCH, "comm sets"); + rc = compare_field_data(input_region_1.get_commsets(), input_region_2.get_commsets(), + data_pool, Ioss::Field::COMMUNICATION, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } // Side Sets - { - const auto &in_sss_1 = input_region_1.get_sidesets(); - const auto &in_sss_2 = input_region_2.get_sidesets(); - for (const auto &iss : in_sss_1) { - const std::string &name = iss->name(); + if (input_region_1.mesh_type() == Ioss::MeshType::UNSTRUCTURED) { + // This should have already been checked. + assert(input_region_2.mesh_type() == Ioss::MeshType::UNSTRUCTURED); + + const auto &in_fss_1 = input_region_1.get_sidesets(); + const auto &in_fss_2 = input_region_2.get_sidesets(); + + // This should have already been checked. + assert(in_fss_1.size() == in_fss_2.size()); + + for (const auto &ifs : in_fss_1) { + const std::string &name = ifs->name(); // Find matching output sideset typename std::vector::const_iterator it; - for (it = in_sss_2.begin(); it != in_sss_2.end(); ++it) { + for (it = in_fss_2.begin(); it != in_fss_2.end(); ++it) { if (name == (*it)->name()) { break; } } - if (it == in_sss_2.end()) { - // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); + + if (it == in_fss_2.end()) { + fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); continue; } { + std::ostringstream buf; + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "side sets"); + rc = compare_field_data(ifs, (*it), data_pool, Ioss::Field::MESH, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + + { + std::ostringstream buf; + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "side sets"); + rc = compare_field_data(ifs, (*it), data_pool, Ioss::Field::ATTRIBUTE, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + const auto &in_sbs_1 = ifs->get_side_blocks(); + const auto &in_sbs_2 = (*it)->get_side_blocks(); + + // This should have already been checked. + assert(in_sbs_1.size() == in_sbs_2.size()); + + for (const auto &isb : in_sbs_1) { + const std::string &sbname = isb->name(); + + // Find matching output sideblock + typename std::vector::const_iterator iter; + for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { + if (sbname == (*iter)->name()) { + break; + } + } + if (iter == in_sbs_2.end()) { + fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDEBLOCK", name); + continue; + } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side sets"); - rc = compare_fields(iss, (*it), Ioss::Field::TRANSIENT, buf); + fmt::print(buf, MESH_FIELD_VALUE_MISMATCH, "side blocks"); + rc = compare_field_data(isb, (*iter), data_pool, Ioss::Field::MESH, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - const auto &in_sbs_1 = iss->get_side_blocks(); - const auto &in_sbs_2 = (*it)->get_side_blocks(); - if (in_sbs_1.size() != in_sbs_2.size()) { - fmt::print(Ioss::WarnOut(), COUNT_MISMATCH, "SIDEBLOCK", in_sbs_1.size(), - in_sbs_2.size()); - continue; - } - - for (const auto &isb : in_sbs_1) { - // Find matching output sideblock - const std::string &sbname = isb->name(); - - typename std::vector::const_iterator iter; - for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { - if (sbname == (*iter)->name()) { - break; - } - } - if (iter == in_sbs_2.end()) { - // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDEBLOCK", sbname); - continue; - } - { - std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side blocks"); - rc = compare_fields(isb, (*iter), Ioss::Field::TRANSIENT, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } + { + std::ostringstream buf; + fmt::print(buf, ATTRIBUTE_FIELD_VALUE_MISMATCH, "side blocks"); + rc = compare_field_data(isb, (*iter), data_pool, Ioss::Field::ATTRIBUTE, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } } } } - int in_step_count_1 = input_region_1.get_property("state_count").get_int(); - int in_step_count_2 = input_region_2.get_property("state_count").get_int(); - - for (int istep = 1; istep <= in_step_count_1; istep++) { - double in_time_1 = input_region_1.get_state_time(istep); + // This should have already been checked + assert(input_region_1.property_exists("state_count") == + input_region_2.property_exists("state_count")); - if (in_time_1 < options.minimum_time) { - continue; - } - if (in_time_1 > options.maximum_time) { - break; - } - - if (istep > in_step_count_2) { - break; - } - - input_region_1.begin_state(istep); - input_region_2.begin_state(istep); + if (input_region_1.property_exists("state_count") && + input_region_1.get_property("state_count").get_int() > 0) { + // For each 'TRANSIENT' field in the node blocks and element + // blocks, transfer to the output node and element blocks. { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "region", istep); - rc = compare_field_data(&input_region_1, &input_region_2, data_pool, Ioss::Field::REDUCTION, - options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "region"); + rc = compare_fields(&input_region_1, &input_region_2, Ioss::Field::REDUCTION, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - // This should have already been checked - assert(input_region_1.mesh_type() == input_region_2.mesh_type()); - - if (input_region_1.mesh_type() != Ioss::MeshType::STRUCTURED) { - { - std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "node blocks", istep); - rc = - compare_field_data(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), - data_pool, Ioss::Field::TRANSIENT, options, buf); - if (!rc) { - overall_result = false; - fmt::print(Ioss::OUTPUT(), "{}", buf.str()); - } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "node blocks"); + rc = compare_fields(input_region_1.get_node_blocks(), input_region_2.get_node_blocks(), + Ioss::Field::TRANSIENT, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "edge blocks", istep); - rc = compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "edge blocks"); + rc = compare_fields(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "face blocks", istep); - rc = compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "face blocks"); + rc = compare_fields(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "element blocks", istep); - rc = compare_field_data(input_region_1.get_element_blocks(), - input_region_2.get_element_blocks(), data_pool, - Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "element blocks"); + rc = compare_fields(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "structured blocks", istep); - rc = compare_field_data(input_region_1.get_structured_blocks(), - input_region_2.get_structured_blocks(), data_pool, - Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "structured blocks"); + rc = compare_fields(input_region_1.get_structured_blocks(), + input_region_2.get_structured_blocks(), Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "node sets", istep); - rc = compare_field_data(input_region_1.get_nodesets(), input_region_2.get_nodesets(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "node sets"); + rc = compare_fields(input_region_1.get_nodesets(), input_region_2.get_nodesets(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "edge sets", istep); - rc = compare_field_data(input_region_1.get_edgesets(), input_region_2.get_edgesets(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "edge sets"); + rc = compare_fields(input_region_1.get_edgesets(), input_region_2.get_edgesets(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "face sets", istep); - rc = compare_field_data(input_region_1.get_facesets(), input_region_2.get_facesets(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "face sets"); + rc = compare_fields(input_region_1.get_facesets(), input_region_2.get_facesets(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "element sets", istep); - rc = compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), - data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "element sets"); + rc = compare_fields(input_region_1.get_elementsets(), input_region_2.get_elementsets(), + Ioss::Field::TRANSIENT, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } // Side Sets - const auto &in_sss_1 = input_region_1.get_sidesets(); - const auto &in_sss_2 = input_region_2.get_sidesets(); + { + const auto &in_sss_1 = input_region_1.get_sidesets(); + const auto &in_sss_2 = input_region_2.get_sidesets(); + for (const auto &iss : in_sss_1) { + const std::string &name = iss->name(); + + // Find matching output sideset + typename std::vector::const_iterator it; + for (it = in_sss_2.begin(); it != in_sss_2.end(); ++it) { + if (name == (*it)->name()) { + break; + } + } + if (it == in_sss_2.end()) { + // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); + continue; + } - // This should have already been checked - assert(in_sss_1.size() == in_sss_2.size()); + { + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side sets"); + rc = compare_fields(iss, (*it), Ioss::Field::TRANSIENT, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + const auto &in_sbs_1 = iss->get_side_blocks(); + const auto &in_sbs_2 = (*it)->get_side_blocks(); + if (in_sbs_1.size() != in_sbs_2.size()) { + fmt::print(Ioss::WarnOut(), COUNT_MISMATCH, "SIDEBLOCK", in_sbs_1.size(), + in_sbs_2.size()); + continue; + } - for (const auto &iss : in_sss_1) { - const std::string &name = iss->name(); + for (const auto &isb : in_sbs_1) { + // Find matching output sideblock + const std::string &sbname = isb->name(); - // Find matching output sideset - typename std::vector::const_iterator it; - for (it = in_sss_2.begin(); it != in_sss_2.end(); ++it) { - if (name == (*it)->name()) { - break; + typename std::vector::const_iterator iter; + for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { + if (sbname == (*iter)->name()) { + break; + } + } + if (iter == in_sbs_2.end()) { + // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDEBLOCK", sbname); + continue; + } + + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side blocks"); + rc = compare_fields(isb, (*iter), Ioss::Field::TRANSIENT, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + } } } + } + + int in_step_count_1 = input_region_1.get_property("state_count").get_int(); + int in_step_count_2 = input_region_2.get_property("state_count").get_int(); - if (it == in_sss_2.end()) { - // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); + for (int istep = 1; istep <= in_step_count_1; istep++) { + double in_time_1 = input_region_1.get_state_time(istep); + + if (in_time_1 < options.minimum_time) { continue; } + if (in_time_1 > options.maximum_time) { + break; + } + + if (istep > in_step_count_2) { + break; + } + + input_region_1.begin_state(istep); + input_region_2.begin_state(istep); { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "region", istep); + rc = compare_field_data(&input_region_1, &input_region_2, data_pool, + Ioss::Field::REDUCTION, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + // This should have already been checked + assert(input_region_1.mesh_type() == input_region_2.mesh_type()); + + if (input_region_1.mesh_type() != Ioss::MeshType::STRUCTURED) { { std::ostringstream buf; - fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side sets"); - rc = compare_field_data(iss, (*it), data_pool, Ioss::Field::TRANSIENT, options, buf); + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "node blocks", istep); + rc = compare_field_data(input_region_1.get_node_blocks(), + input_region_2.get_node_blocks(), data_pool, + Ioss::Field::TRANSIENT, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } - const auto &in_sbs_1 = iss->get_side_blocks(); - const auto &in_sbs_2 = (*it)->get_side_blocks(); - if (in_sbs_1.size() != in_sbs_2.size()) { - fmt::print(Ioss::WarnOut(), COUNT_MISMATCH, "SIDEBLOCK", in_sbs_1.size(), - in_sbs_2.size()); - continue; + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "edge blocks", istep); + rc = + compare_field_data(input_region_1.get_edge_blocks(), input_region_2.get_edge_blocks(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "face blocks", istep); + rc = + compare_field_data(input_region_1.get_face_blocks(), input_region_2.get_face_blocks(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "element blocks", istep); + rc = compare_field_data(input_region_1.get_element_blocks(), + input_region_2.get_element_blocks(), data_pool, + Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "structured blocks", istep); + rc = compare_field_data(input_region_1.get_structured_blocks(), + input_region_2.get_structured_blocks(), data_pool, + Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "node sets", istep); + rc = compare_field_data(input_region_1.get_nodesets(), input_region_2.get_nodesets(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "edge sets", istep); + rc = compare_field_data(input_region_1.get_edgesets(), input_region_2.get_edgesets(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "face sets", istep); + rc = compare_field_data(input_region_1.get_facesets(), input_region_2.get_facesets(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_STEP_VALUE_MISMATCH, "element sets", istep); + rc = + compare_field_data(input_region_1.get_elementsets(), input_region_2.get_elementsets(), + data_pool, Ioss::Field::TRANSIENT, options, buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } + } + // Side Sets + const auto &in_sss_1 = input_region_1.get_sidesets(); + const auto &in_sss_2 = input_region_2.get_sidesets(); - for (const auto &isb : in_sbs_1) { - // Find matching output sideblock - const std::string &sbname = isb->name(); + // This should have already been checked + assert(in_sss_1.size() == in_sss_2.size()); - typename std::vector::const_iterator iter; - for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { - if (sbname == (*iter)->name()) { - break; - } - } - if (iter == in_sbs_2.end()) { - // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); - continue; + for (const auto &iss : in_sss_1) { + const std::string &name = iss->name(); + + // Find matching output sideset + typename std::vector::const_iterator it; + for (it = in_sss_2.begin(); it != in_sss_2.end(); ++it) { + if (name == (*it)->name()) { + break; } + } + + if (it == in_sss_2.end()) { + // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); + continue; + } + { { std::ostringstream buf; fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side sets"); - rc = - compare_field_data(isb, (*iter), data_pool, Ioss::Field::TRANSIENT, options, buf); + rc = compare_field_data(iss, (*it), data_pool, Ioss::Field::TRANSIENT, options, buf); if (!rc) { overall_result = false; fmt::print(Ioss::OUTPUT(), "{}", buf.str()); } } + const auto &in_sbs_1 = iss->get_side_blocks(); + const auto &in_sbs_2 = (*it)->get_side_blocks(); + if (in_sbs_1.size() != in_sbs_2.size()) { + fmt::print(Ioss::WarnOut(), COUNT_MISMATCH, "SIDEBLOCK", in_sbs_1.size(), + in_sbs_2.size()); + continue; + } + + for (const auto &isb : in_sbs_1) { + // Find matching output sideblock + const std::string &sbname = isb->name(); + + typename std::vector::const_iterator iter; + for (iter = in_sbs_2.begin(); iter != in_sbs_2.end(); ++iter) { + if (sbname == (*iter)->name()) { + break; + } + } + if (iter == in_sbs_2.end()) { + // fmt::print(Ioss::WarnOut(), NOTFOUND_2, "SIDESET", name); + continue; + } + + { + std::ostringstream buf; + fmt::print(buf, TRANSIENT_FIELD_VALUE_MISMATCH, "side sets"); + rc = compare_field_data(isb, (*iter), data_pool, Ioss::Field::TRANSIENT, options, + buf); + if (!rc) { + overall_result = false; + fmt::print(Ioss::OUTPUT(), "{}", buf.str()); + } + } + } } } } } - } - Ioss::Utils::clear(data_pool.data); + Ioss::Utils::clear(data_pool.data); - return overall_result; -} + return overall_result; + } -namespace { bool compare_properties(const Ioss::GroupingEntity *ige_1, const Ioss::GroupingEntity *ige_2, std::ostringstream &buf) { @@ -995,6 +1073,40 @@ namespace { return overall_result; } + bool compare_change_sets(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2, + IOSS_MAYBE_UNUSED std::ostringstream &buf) + { + bool overall_result = true; + auto cs1_count = input_region_1.get_database()->num_internal_change_set(); + auto cs2_count = input_region_2.get_database()->num_internal_change_set(); + if (cs1_count != cs2_count) { + fmt::print(Ioss::WarnOut(), COUNT_MISMATCH, "CHANGE SETS", cs1_count, cs2_count); + overall_result = false; + } + + auto cs1_names = input_region_1.get_database()->internal_change_set_describe(); + auto cs2_names = input_region_2.get_database()->internal_change_set_describe(); + + for (const auto &cs1_name : cs1_names) { + auto it = std::find(cs2_names.cbegin(), cs2_names.cend(), cs1_name); + if (it == cs2_names.cend()) { + // CHANGE_SET was not found + fmt::print(Ioss::WarnOut(), NOTFOUND_2, "CHANGE SET", cs1_name); + overall_result = false; + } + } + + for (const auto &cs2_name : cs2_names) { + auto it = std::find(cs1_names.cbegin(), cs1_names.cend(), cs2_name); + if (it == cs1_names.cend()) { + // CHANGE_SET was not found + fmt::print(Ioss::WarnOut(), NOTFOUND_1, "CHANGE SET", cs2_name); + overall_result = false; + } + } + return overall_result; + } + bool compare_qa_info(const Ioss::Region &input_region_1, const Ioss::Region &input_region_2, std::ostringstream &buf) { diff --git a/packages/seacas/libraries/ioss/src/Ioss_CopyDatabase.C b/packages/seacas/libraries/ioss/src/Ioss_CopyDatabase.C index e9f61a7e1268..a198921bdbc8 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_CopyDatabase.C +++ b/packages/seacas/libraries/ioss/src/Ioss_CopyDatabase.C @@ -447,7 +447,9 @@ namespace { // Get all properties of input database... transfer_properties(®ion, &output_region); - transfer_qa_info(region, output_region); + if (!options.ignore_qa_info) { + transfer_qa_info(region, output_region); + } if (rank == 0 && options.output_summary) { fmt::print(std::cout, "\n\n Input Region summary for rank 0:\n"); diff --git a/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.C b/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.C index f16b426753cd..1fb9559f266f 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.C @@ -1596,6 +1596,25 @@ namespace Ioss { return zero_copy_not_enabled(sb, field, this); } + void DatabaseIO::release_memory_nl() + { + nodeMap.release_memory(); + edgeMap.release_memory(); + faceMap.release_memory(); + elemMap.release_memory(); + } + + void DatabaseIO::reset_database_nl() + { + release_memory_nl(); + dbState = STATE_INVALID; + nodeCount = 0; + elementCount = 0; + sideTopology.clear(); + blockAdjacency.clear(); + blockAdjacenciesCalculated = false; + elementBlockBoundingBoxes.clear(); + } } // namespace Ioss namespace { diff --git a/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.h b/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.h index 44db7cfe0778..dbef70da8104 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/Ioss_DatabaseIO.h @@ -246,63 +246,82 @@ namespace Ioss { flush_database_nl(); } - /** \brief If a database type supports groups and if the database - * contains groups, open the specified group. - * - * If the group_name begins with '/', it specifies the absolute path - * name from the root with '/' separating groups. Otherwise, the - * group_name specifies a child group of the currently active group. - * If group_name == "/" then the root group is opened. + void reset_database() + { + IOSS_FUNC_ENTER(m_); + progress(__func__); + reset_database_nl(); + } + + /** \brief If a database type supports internal change sets and if the database + * contains internal change sets, open the specified set. * - * \param[in] group_name The name of the group to open. + * \param[in] set_name The name of the set to open. * \returns True if successful. */ - bool open_group(const std::string &group_name) + bool open_internal_change_set(const std::string &set_name) { IOSS_FUNC_ENTER(m_); - return open_group_nl(group_name); + return open_internal_change_set_nl(set_name); } - /** \brief If a database type supports groups, create the specified - * group as a child of the current group. + /** \brief If a database type supports internal change sets, create the + * specified set. * - * The name of the group must not contain a '/' character. - * If the command is successful, then the group will be the - * active group for all subsequent writes to the database. - * - * \param[in] group_name The name of the subgroup to create. + * \param[in] set_name The name of the set to create. * \returns True if successful. */ - bool create_subgroup(const std::string &group_name) + bool create_internal_change_set(const std::string &set_name) { IOSS_FUNC_ENTER(m_); - return create_subgroup_nl(group_name); + return create_internal_change_set_nl(set_name); } - bool open_root_group() + /** \brief If a database type supports internal change sets, and if the database + * contains internal change sets, return the number of change sets. + */ + int num_internal_change_set() { IOSS_FUNC_ENTER(m_); - return open_root_group_nl(); + return num_internal_change_set_nl(); } - int num_child_group() + /** \brief If a database type supports internal change sets, open the change set + * specified [zero-based] index + * + * \param[in] child_index The [zero-based] index of the internal change set to open. + * \returns True if successful. + */ + bool open_internal_change_set(int set_index) { IOSS_FUNC_ENTER(m_); - return num_child_group_nl(); + return open_internal_change_set_nl(set_index); } - bool open_child_group(int index) + /** \brief If a database type supports internal change sets, return a list of set names + * + * \param[in] return_full_names Flag to control return of relative + * or full set name paths. + * \returns True if successful. + */ + Ioss::NameList internal_change_set_describe(bool return_full_names = false) { IOSS_FUNC_ENTER(m_); - return open_child_group_nl(index); + return internal_change_set_describe_nl(return_full_names); } - Ioss::NameList groups_describe(bool return_full_names = false) + /** \brief Checks if a database type supports internal change sets + * + * \returns True if successful. + */ + bool supports_internal_change_set() { IOSS_FUNC_ENTER(m_); - return groups_describe_nl(return_full_names); + return supports_internal_change_set_nl(); } + IOSS_NODISCARD virtual std::string get_internal_change_set_name() const { return ""; } + /** \brief Set the database to the given State. * * All transitions must begin from the 'STATE_CLOSED' state or be to @@ -356,7 +375,23 @@ namespace Ioss { void get_step_times() { IOSS_FUNC_ENTER(m_); - return get_step_times_nl(); + get_step_times_nl(); + } + + /** \brief Return the list of timesteps in the database contingent on certain + * controlling properties. + * + * This is different from get_step_times() in that it does not set timestep + * data on the region. If the database supports change sets, it will return the + * timestep data for the current change set + * + * \returns timesteps. + * + */ + std::vector get_db_step_times() + { + IOSS_FUNC_ENTER(m_); + return get_db_step_times_nl(); } IOSS_NODISCARD virtual bool internal_edges_available() const { return false; } @@ -762,13 +797,9 @@ namespace Ioss { virtual void closeDatabase_nl() const; virtual void flush_database_nl() const {} - virtual void release_memory_nl() - { - nodeMap.release_memory(); - edgeMap.release_memory(); - faceMap.release_memory(); - elemMap.release_memory(); - } + virtual void release_memory_nl(); + + virtual void reset_database_nl(); private: virtual bool ok_nl(bool /* write_message */, std::string * /* error_message */, @@ -790,12 +821,12 @@ namespace Ioss { return elemMap.global_to_local(global); } - virtual int num_child_group_nl() { return 0; } - virtual bool open_child_group_nl(int /* index */) { return false; } - virtual bool open_root_group_nl() { return false; } - virtual bool open_group_nl(const std::string & /* group_name */) { return false; } - virtual bool create_subgroup_nl(const std::string & /* group_name */) { return false; } - virtual Ioss::NameList groups_describe_nl(bool /* return_full_names */) + virtual bool supports_internal_change_set_nl() { return false; } + virtual bool open_internal_change_set_nl(const std::string & /* set_name */) { return false; } + virtual bool open_internal_change_set_nl(int /* index */) { return false; } + virtual bool create_internal_change_set_nl(const std::string & /* set_name */) { return false; } + virtual int num_internal_change_set_nl() { return 0; } + virtual Ioss::NameList internal_change_set_describe_nl(bool /* return_full_names */) { return Ioss::NameList(); } @@ -803,8 +834,9 @@ namespace Ioss { virtual bool begin_nl(Ioss::State state) = 0; virtual bool end_nl(Ioss::State state) = 0; - virtual void read_meta_data_nl() = 0; - virtual void get_step_times_nl() {} + virtual void read_meta_data_nl() = 0; + virtual void get_step_times_nl() {} + virtual std::vector get_db_step_times_nl() { return std::vector(); } virtual bool begin_state_nl(int state, double time); virtual bool end_state_nl(int state, double time); diff --git a/packages/seacas/libraries/ioss/src/Ioss_Decomposition.h b/packages/seacas/libraries/ioss/src/Ioss_Decomposition.h index 14ca00bd4e3c..57972f90d861 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Decomposition.h +++ b/packages/seacas/libraries/ioss/src/Ioss_Decomposition.h @@ -258,7 +258,7 @@ namespace Ioss { return I->second; } - void show_progress(const std::string &message) const + void show_progress(std::string_view message) const { if (m_showProgress) { Ioss::ParallelUtils pu(m_comm); diff --git a/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.C b/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.C index f3c1e051ca34..f30b18f46067 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.C +++ b/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.C @@ -20,12 +20,10 @@ #include "Ioss_Region.h" #include "Ioss_SmartAssert.h" +#include #include #include #include -#if !defined __NVCC__ -#include -#endif #if !defined(NO_ZOLTAN_SUPPORT) #include // for Zoltan_Initialize @@ -128,10 +126,13 @@ namespace { } return chains; } +} // namespace - void output_histogram(const std::vector &proc_work, size_t avg_work, size_t median) +namespace Ioss { + void DecompUtils::output_histogram(const std::vector &proc_work, double avg_work, + size_t median) { - fmt::print("Work-per-processor Histogram\n"); + fmt::print("Work-per-processor Histogram:\n"); std::array histogram{}; auto wmin = *std::min_element(proc_work.begin(), proc_work.end()); @@ -186,9 +187,7 @@ namespace { } fmt::print("\n"); } -} // namespace -namespace Ioss { template IOSS_EXPORT void DecompUtils::decompose_zoltan(const Ioss::Region ®ion, int ranks, const std::string &method, std::vector &elem_to_proc, const std::vector &weights, @@ -463,27 +462,33 @@ namespace Ioss { DecompUtils::line_decomp_modify(const Ioss::chain_t &element_chains, std::vector &elem_to_proc, int proc_count); - void DecompUtils::output_decomposition_statistics(const std::vector &elem_to_proc, - int proc_count) + std::vector DecompUtils::get_work_per_rank(const std::vector &elem_to_proc, + int proc_count) { - // Output histogram of elements / rank... - std::vector elem_per_rank(proc_count); + std::vector work_per_rank(proc_count); for (int proc : elem_to_proc) { - elem_per_rank[proc]++; + work_per_rank[proc]++; } + return work_per_rank; + } - size_t number_elements = elem_to_proc.size(); - size_t proc_width = Ioss::Utils::number_width(proc_count, false); - size_t work_width = Ioss::Utils::number_width(number_elements, true); - - auto min_work = *std::min_element(elem_per_rank.begin(), elem_per_rank.end()); - auto max_work = *std::max_element(elem_per_rank.begin(), elem_per_rank.end()); + std::pair + DecompUtils::output_decomposition_statistics(const std::vector work_per_rank) + { + size_t total_work = std::accumulate(work_per_rank.begin(), work_per_rank.end(), size_t(0)); + size_t proc_count = work_per_rank.size(); + size_t proc_width = Ioss::Utils::number_width(proc_count, false); + size_t work_width = Ioss::Utils::number_width(total_work, true); + + auto min_work = *std::min_element(work_per_rank.begin(), work_per_rank.end()); + auto max_work = *std::max_element(work_per_rank.begin(), work_per_rank.end()); + double avg_work = 0.0; size_t median = 0; { - auto pw_copy(elem_per_rank); + auto pw_copy(work_per_rank); std::nth_element(pw_copy.begin(), pw_copy.begin() + pw_copy.size() / 2, pw_copy.end()); median = pw_copy[pw_copy.size() / 2]; - fmt::print("\nElements per processor:\n\tMinimum = {}, Maximum = {}, Median = {}, Ratio = " + fmt::print("\nWork per processor:\n\tMinimum = {}, Maximum = {}, Median = {}, Ratio = " "{:.3}\n\n", fmt::group_digits(min_work), fmt::group_digits(max_work), fmt::group_digits(median), (double)(max_work) / min_work); @@ -497,37 +502,40 @@ namespace Ioss { min_star = std::max(1, min_star); int delta = max_star - min_star; - double avg_work = (double)number_elements / (double)proc_count; - for (size_t i = 0; i < elem_per_rank.size(); i++) { + avg_work = (double)total_work / (double)proc_count; + for (size_t i = 0; i < work_per_rank.size(); i++) { int star_cnt = - (double)(elem_per_rank[i] - min_work) / (max_work - min_work) * delta + min_star; - std::string stars(star_cnt, '*'); - const std::string format = "\tProcessor {:{}}, work = {:{}} ({:.2f})\t{}\n"; - if (elem_per_rank[i] == max_work) { - fmt::print( + (double)(work_per_rank[i] - min_work) / (max_work - min_work) * delta + min_star; + std::string stars(star_cnt, '*'); + auto tmp = fmt::format(fmt::runtime("\tProcessor {:{}}, work = {:{}} ({:.2f})\t{}\n"), i, + proc_width, fmt::group_digits(work_per_rank[i]), work_width, + work_per_rank[i] / avg_work, stars); + #if !defined __NVCC__ - fg(fmt::color::red), -#endif - fmt::runtime(format), i, proc_width, fmt::group_digits(elem_per_rank[i]), work_width, - (double)elem_per_rank[i] / avg_work, stars); + if (work_per_rank[i] == max_work) { + fmt::print("{}", fmt::styled(tmp, fmt::fg(fmt::color::red))); } - else if (elem_per_rank[i] == min_work) { - fmt::print( -#if !defined __NVCC__ - fg(fmt::color::green), -#endif - fmt::runtime(format), i, proc_width, fmt::group_digits(elem_per_rank[i]), work_width, - elem_per_rank[i] / avg_work, stars); + else if (work_per_rank[i] == min_work) { + fmt::print("{}", fmt::styled(tmp, fmt::fg(fmt::color::green))); } else { - fmt::print(fmt::runtime(format), i, proc_width, fmt::group_digits(elem_per_rank[i]), - work_width, elem_per_rank[i] / avg_work, stars); + fmt::print("{}", tmp); } +#else + fmt::print("{}", tmp); +#endif } - - // Output Histogram... - output_histogram(elem_per_rank, (size_t)avg_work, median); } + + // Imbalance penalty -- max work / avg work. If perfect balance, then all processors would have + // "avg_work" work to do. With current decomposition, every processor has to wait until + // "max_work" is done. Penalty = max_work / avg_work. + fmt::print("\nImbalance Penalty:\n\tMaximum Work = {}, Average Work = {}, Penalty (max/avg) " + "= {:.2f}\n\n", + fmt::group_digits(max_work), fmt::group_digits((size_t)avg_work), + (double)max_work / avg_work); + + return std::make_pair(avg_work, median); } template diff --git a/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.h b/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.h index 728f40f4ed47..79c907276c16 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.h +++ b/packages/seacas/libraries/ioss/src/Ioss_DecompositionUtils.h @@ -19,12 +19,17 @@ namespace Ioss { class IOSS_EXPORT DecompUtils { public: + static void output_histogram(const std::vector &proc_work, double avg_work, + size_t median); + template static void line_decomp_modify(const Ioss::chain_t &element_chains, std::vector &element_to_proc, int proc_count); - static void output_decomposition_statistics(const std::vector &element_to_proc, - int proc_count); + static std::vector get_work_per_rank(const std::vector &elem_to_proc, + int proc_count); + static std::pair + output_decomposition_statistics(const std::vector work_per_rank); template static std::vector line_decomp_weights(const Ioss::chain_t &element_chains, diff --git a/packages/seacas/libraries/ioss/src/Ioss_Doxygen.h b/packages/seacas/libraries/ioss/src/Ioss_Doxygen.h index 6206f622dd9a..f989a3796677 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Doxygen.h +++ b/packages/seacas/libraries/ioss/src/Ioss_Doxygen.h @@ -38,7 +38,7 @@ adios | Input/Output | Adaptable Input/Output system, (https://adios faodel | Input/Output | (https://github.com/faodel/faodel) exodusii | Input/Output | alias for exodus genesis | Input/Output | alias for exodus -par_cgns | Input/Output | alias for parallel CGNS +par_cgns | Input/Output | alias for parallel CGNS \section properties Properties @@ -137,7 +137,7 @@ PARALLEL_IO_MODE | netcdf4, hdf5, pnetcdf, (mpiio and mpiposix are deprecated) The `overlay` specifies the number of output steps which will be overlaid on top of the currently written step before advancing to the next step on the database. - + For example, if output every 0.1 seconds and the overlay count is specified as 2, then IOSS will write time 0.1 to step 1 of the database. It will then write 0.2 and 0.3 also to step 1. It will @@ -146,7 +146,7 @@ then increment the database step and write 0.4 to step 2 and overlay to completion), the database would have times 0.3, 0.6, 0.9, ... However, if there were a problem during the analysis, the last step on the database would contain an intermediate step. - + The `cycle_count` specifies the number of restart steps which will be written to the restart database before previously written steps are overwritten. For example, if the `cycle` count is 5 and output is @@ -156,16 +156,16 @@ with data from time 0.6, the second with time 0.7. At time 0.8, the database would contain data at times 0.6, 0.7, 0.8, 0.4, 0.5. Note that time will not necessarily be monotonically increasing on a database that specifies the cycle count. - + The cycle count and overlay count can both be used at the same time also. The basic formula is: -``` +``` db_step = (((output_step - 1) / overlay) % cycle) + 1 -``` +``` where `output_step` is the step that this would have been on the database in a normal write (1,2,3,....) and `db_step` is the step number that this will be written to. - + If you only want the last step available on the database, use `set_cycle_count(1)`. @@ -177,7 +177,7 @@ timesteps will be written to each file. If we have `cycle=2` and file. Then, the first file will be reopened and steps 0.7, 0.8, and 0.9 will be written to the first file. - + ## Properties for the heartbeat output Property | Value | Description -----------------------|:------:|----------------------------------------------------------- diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.C deleted file mode 100644 index 16b73da0a4ee..000000000000 --- a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.C +++ /dev/null @@ -1,728 +0,0 @@ -// Copyright(C) 2024 National Technology & Engineering Solutions -// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with -// NTESS, the U.S. Government retains certain rights in this software. -// -// See packages/seacas/LICENSE for details - -#include "Ioss_Assembly.h" -#include "Ioss_Blob.h" -#include "Ioss_CodeTypes.h" -#include "Ioss_CommSet.h" -#include "Ioss_DBUsage.h" -#include "Ioss_DatabaseIO.h" -#include "Ioss_DynamicTopology.h" -#include "Ioss_EdgeBlock.h" -#include "Ioss_EdgeSet.h" -#include "Ioss_ElementBlock.h" -#include "Ioss_ElementSet.h" -#include "Ioss_EntityBlock.h" -#include "Ioss_EntityType.h" -#include "Ioss_FaceBlock.h" -#include "Ioss_FaceSet.h" -#include "Ioss_Field.h" -#include "Ioss_FileInfo.h" -#include "Ioss_GroupingEntity.h" -#include "Ioss_IOFactory.h" -#include "Ioss_NodeBlock.h" -#include "Ioss_NodeSet.h" -#include "Ioss_Region.h" -#include "Ioss_SideBlock.h" -#include "Ioss_SideSet.h" -#include "Ioss_StructuredBlock.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "Ioss_ParallelUtils.h" - -namespace Ioss { - -void DynamicTopologyObserver::check_region() const -{ - if(nullptr == m_region) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: A region has not been registered with the " - "Dynamic Topology Observer.\n\n"); - IOSS_ERROR(errmsg); - } -} - -void DynamicTopologyObserver::register_region(Region *region) -{ - if(nullptr != region && nullptr != m_region && region != m_region) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: Attempt to re-register different region on " - "Dynamic Topology Observer.\n\n"); - IOSS_ERROR(errmsg); - } - - m_region = region; -} - -void DynamicTopologyObserver::register_notifier(DynamicTopologyNotifier *notifier) -{ - if(nullptr != notifier && nullptr != m_notifier && notifier != m_notifier) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: Attempt to re-register different notifier on " - "Dynamic Topology Observer.\n\n"); - IOSS_ERROR(errmsg); - } - - m_notifier = notifier; -} - -void DynamicTopologyObserver::set_cumulative_topology_modification(unsigned int type) -{ m_cumulativeTopologyModification = type; } - -unsigned int DynamicTopologyObserver::get_cumulative_topology_modification() const -{ return m_cumulativeTopologyModification; } - -unsigned int DynamicTopologyObserver::get_topology_modification() const -{ return m_topologyModification; } - -void DynamicTopologyObserver::set_topology_modification_nl(unsigned int type) -{ - m_topologyModification |= type; - m_cumulativeTopologyModification |= type; -} - -void DynamicTopologyObserver::set_topology_modification(unsigned int type) -{ - if(!(m_topologyModification & type)) { - set_topology_modification_nl(type); - - if(nullptr != m_notifier) { - for(auto observer : m_notifier->get_observers()) { - observer->set_topology_modification_nl(type); - } - } - } -} - -void DynamicTopologyObserver::reset_topology_modification() -{ - m_topologyModification = TOPOLOGY_SAME; -} - -void DynamicTopologyObserver::reset_topology_modification_all() -{ - if(m_topologyModification != TOPOLOGY_SAME) { - reset_topology_modification(); - - if(nullptr != m_notifier) { - for(auto observer : m_notifier->get_observers()) { - observer->reset_topology_modification(); - } - } - } -} - -bool DynamicTopologyObserver::is_topology_modified() const -{ return m_topologyModification != TOPOLOGY_SAME; } - -const ParallelUtils &DynamicTopologyObserver::util() const -{ - check_region(); - return m_region->get_database()->util(); -} - -void DynamicTopologyObserver::synchronize_topology_modified_flags() -{ - check_region(); - int num_processors = m_region->get_database()->parallel_size(); - // Synchronize the topology flags between all processors in case - // it has not been set consistently. - if (num_processors > 1) { - static unsigned int buffer[2]; - buffer[0] = m_cumulativeTopologyModification; - buffer[1] = m_topologyModification; - - util().attribute_reduction(2*sizeof(unsigned int), reinterpret_cast(buffer)); - - m_cumulativeTopologyModification = buffer[0]; - m_topologyModification = buffer[1]; - } -} - -int DynamicTopologyObserver::get_cumulative_topology_modification_field() -{ - check_region(); - const std::string variable_name = topology_modification_change_name(); - - int ivalue = 0; - - if (m_region->field_exists(variable_name)) { - Field topo_field = m_region->get_field(variable_name); - if (topo_field.get_type() == Field::INTEGER) { - m_region->get_field_data(variable_name, &ivalue, sizeof(int)); - } else { - double value; - m_region->get_field_data(variable_name, &value, sizeof(double)); - ivalue = (int)value; - } - } - - int num_processors = m_region->get_database()->parallel_size(); - // Synchronize the value between all processors in case - // it has not been set consistently. - if (num_processors > 1) { - unsigned int buffer[1]; - buffer[0] = ivalue; - - util().attribute_reduction(sizeof(unsigned int), reinterpret_cast(buffer)); - - ivalue = (int)buffer[0]; - } - - m_cumulativeTopologyModification = ivalue; - - return ivalue; -} - -void DynamicTopologyObserver::define_model() -{ - -} - -void DynamicTopologyObserver::write_model() -{ - -} - -void DynamicTopologyObserver::define_transient() -{ - -} - - -DynamicTopologyBroker* DynamicTopologyBroker::broker() -{ - static DynamicTopologyBroker broker_; - return &broker_; -} - -void DynamicTopologyBroker::register_model(const std::string& model_name) -{ - auto iter = m_notifiers.find(model_name); - if(iter != m_notifiers.end()) { - return; - } - - m_notifiers[model_name] = std::make_shared(model_name); -} - -std::shared_ptr DynamicTopologyBroker::get_notifier(const std::string& model_name) const -{ - auto iter = m_notifiers.find(model_name); - if(iter != m_notifiers.end()) { - return iter->second; - } - - return {}; -} - -std::vector> DynamicTopologyBroker::get_observers(const std::string& model_name) const -{ - std::vector> observers; - - auto notifier = get_notifier(model_name); - - if(notifier) { - return notifier->get_observers(); - } - - return observers; -} - -void DynamicTopologyBroker::remove_model(const std::string& model_name) -{ - auto iter = m_notifiers.find(model_name); - if(iter != m_notifiers.end()) { - m_notifiers.erase(iter); - } -} - -void DynamicTopologyBroker::clear_models() -{ - m_notifiers.clear(); -} - -void DynamicTopologyBroker::register_observer(const std::string& model_name, - std::shared_ptr observer) -{ - auto notifier = get_notifier(model_name); - - if(!notifier) { - register_model(model_name); - notifier = get_notifier(model_name); - } - - notifier->register_observer(observer); -} - -void DynamicTopologyBroker::register_observer(const std::string& model_name, - std::shared_ptr observer, - Region& region) -{ - region.register_mesh_modification_observer(observer); - register_observer(model_name, observer); -} - -void DynamicTopologyBroker::reset_topology_modification(const std::string& model_name) -{ - auto notifier = get_notifier(model_name); - - if(!notifier) return; - - notifier->reset_topology_modification(); -} - -void DynamicTopologyBroker::set_topology_modification(const std::string& model_name, unsigned int type) -{ - auto notifier = get_notifier(model_name); - - if(!notifier) return; - - notifier->set_topology_modification(type); -} - - -struct DynamicTopologyObserverCompare { - bool operator()(const std::shared_ptr & lhs, - const std::shared_ptr & rhs) const { - assert(lhs && (lhs->get_region() != nullptr)); - assert(rhs && (rhs->get_region() != nullptr)); - return (lhs->get_region() < rhs->get_region()); - } -}; - -void DynamicTopologyNotifier::register_observer(std::shared_ptr observer) -{ - observer->register_notifier(this); - m_observers.push_back(observer); - std::sort(m_observers.begin(), m_observers.end(), DynamicTopologyObserverCompare()); -} - -void DynamicTopologyNotifier::unregister_observer(std::shared_ptr observer) -{ - auto iter = std::find(m_observers.begin(), m_observers.end(), observer); - if (iter != m_observers.end()) { - (*iter)->register_notifier(nullptr); - m_observers.erase(iter); - } -} - -void DynamicTopologyNotifier::reset_topology_modification() -{ - for(std::shared_ptr& observer : m_observers) { - observer->reset_topology_modification(); - } -} - -void DynamicTopologyNotifier::set_topology_modification(unsigned int type) -{ - for(std::shared_ptr& observer : m_observers) { - observer->set_topology_modification(type); - } -} - - -DynamicTopologyFileControl::DynamicTopologyFileControl(Region *region, unsigned int fileCyclicCount, - IfDatabaseExistsBehavior &ifDatabaseExists, - unsigned int &dbChangeCount) - : m_region(region) - , m_fileCyclicCount(fileCyclicCount) - , m_ifDatabaseExists(ifDatabaseExists) - , m_dbChangeCount(dbChangeCount) -{ - if(nullptr == region) { - std::ostringstream errmsg; - fmt::print(errmsg, "ERROR: null region passed in as argument to DynamicTopologyFileControl"); - IOSS_ERROR(errmsg); - } - - m_ioDB = region->get_property("base_filename").get_string(); - m_dbType = region->get_property("database_type").get_string(); -} - -const ParallelUtils &DynamicTopologyFileControl::util() const -{ - return m_region->get_database()->util(); -} - -bool DynamicTopologyFileControl::file_exists(const std::string &filename, - const std::string &db_type, - Ioss::DatabaseUsage db_usage) -{ - bool exists = false; - int par_size = m_region->get_database()->parallel_size(); - int par_rank = m_region->get_database()->parallel_rank(); - bool is_parallel = par_size > 1; - std::string full_filename = filename; - if (is_parallel && db_type == "exodusII" && db_usage != Ioss::WRITE_HISTORY) { - full_filename = Ioss::Utils::decode_filename(filename, par_rank, par_size); - } - - if (!is_parallel || par_rank == 0) { - // Now, see if this file exists... - // Don't want to do a system call on all processors since it can take minutes - // on some of the larger machines, filesystems, and processor counts... - Ioss::FileInfo file = Ioss::FileInfo(full_filename); - exists = file.exists(); - } - - if (is_parallel) { - int iexists = exists ? 1 : 0; - util().broadcast(iexists, 0); - exists = iexists == 1; - } - return exists; -} - -std::string DynamicTopologyFileControl::get_unique_filename(Ioss::DatabaseUsage db_usage) -{ - std::string filename = m_ioDB; - - do { - // Run this loop at least once for all files. If this is an automatic - // restart, then make sure that the generated file does not already exist, - // so keep running the loop until we generate a filename that doesn't exist... - std::ostringstream tmp_filename; - tmp_filename << m_ioDB; - - // Don't append the "-s000X" the first time in case the base filename doesn't - // exist -- we want write to the name specified by the user if at all possible and - // once that exists, then start adding on the suffix... - if (m_dbChangeCount > 1) { - tmp_filename << "-s" << std::setw(4) << std::setfill('0') << m_dbChangeCount; - } - filename = tmp_filename.str(); - ++m_dbChangeCount; - } while(file_exists(filename, m_dbType, db_usage)); - --m_dbChangeCount; - return filename; -} - -std::string DynamicTopologyFileControl::construct_database_filename(int& step, Ioss::DatabaseUsage db_usage) -{ - // Filename will be of the form -- ioDB-sxxxx where xxxx is step - // number. Assume maximum of 9999 steps (will do more, but won't have - // good lineup of step numbers. - // Check database for validity (filename and a type) - if(m_ioDB.empty() || m_dbType.empty()) - { - std::string error_message; - if(m_dbType.empty()) - error_message += "The database TYPE has not been defined\n"; - - if(m_ioDB.empty()) - { - error_message += "The database FILENAME has not been defined\n"; - } - std::ostringstream errmsg; - fmt::print(errmsg, fmt::runtime(error_message)); - IOSS_ERROR(errmsg); - } - assert(!m_ioDB.empty()); - assert(!m_dbType.empty()); - std::string filename = m_ioDB; - if(m_fileCyclicCount > 0) - { - // In this mode, we close the old file and open a new file - // every time this is called. The file suffix cycles through - // the first fileCyclicCount'th entries in A,B,C,D,E,F,... - if(step == 0) - step++; - - static std::string suffix = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - std::string tmp = "-" + suffix.substr((step - 1) % m_fileCyclicCount, 1); - filename += tmp; - m_properties.add(Ioss::Property("APPEND_OUTPUT", Ioss::DB_OVERWRITE)); - } - else - { - if(m_region->model_is_written()) - { - // After the initial open, we want to add suffix if the topology changes - // during the run - m_ifDatabaseExists = Ioss::DB_ADD_SUFFIX_OVERWRITE; - } - - // Handle complications of DB_APPEND mode... - // If in DB_APPEND mode, then we don't output metadata - // information, so some knowledge is needed at this level if - // we are appending. If user specified APPEND, but the file - // doesn't yet exist OR it does exist and we are not - // restarting, change the mode to OVERWRITE. - // 0. Must be restarting; either manual or automatic. - std::shared_ptr observer = m_region->get_mesh_modification_observer(); - - if(m_ifDatabaseExists == Ioss::DB_APPEND) - { - if(!observer->is_restart_requested()) - { - // Not restarting - m_ifDatabaseExists = Ioss::DB_OVERWRITE; - } - else if(!file_exists(m_ioDB, m_dbType, db_usage)) - { - m_ifDatabaseExists = Ioss::DB_OVERWRITE; - } - } - if(step > 1 || (m_dbChangeCount > 1)) - { - // Use the !is_input_event test since restart input files already have the - // -s000x extension... - if(m_ifDatabaseExists == Ioss::DB_APPEND) - { - std::ostringstream tmp_filename; - tmp_filename << m_ioDB; - filename = m_ioDB; - if(m_dbChangeCount > 1) - { - tmp_filename << "-s" << std::setw(4) << std::setfill('0') << m_dbChangeCount; - } - size_t inc = 0; - while(file_exists(tmp_filename.str(), m_dbType, db_usage)) - { - filename = tmp_filename.str(); - tmp_filename.clear(); - tmp_filename.str(""); - tmp_filename << m_ioDB << "-s" << std::setw(4) << std::setfill('0') << m_dbChangeCount + (++inc); - } - if(inc > 0) - { - m_dbChangeCount += (inc - 1); - } - else - { - m_ifDatabaseExists = Ioss::DB_OVERWRITE; - } - } - else if(m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX) - { - filename = get_unique_filename(db_usage); - } - else if(m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX_OVERWRITE) - { - if(m_dbChangeCount > 0) - { - std::ostringstream tmp_filename; - tmp_filename << m_ioDB << "-s" << std::setw(4) << std::setfill('0') << ++m_dbChangeCount; - filename = tmp_filename.str(); - } - else - { - filename = m_ioDB; - } - } - else - { - filename = m_ioDB; - } - } - else if(m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX) - { - filename = get_unique_filename(db_usage); - } - else - { - filename = m_ioDB; - } - - m_properties.add(Ioss::Property("APPEND_OUTPUT", m_ifDatabaseExists)); - // A little complicated on deciding whether we are actually - // overwriting the database. The 'validate' routine for Results and - // History will call create_database once the parser block is - // ended. This routine will then create the database and the - // ioRegion_. However, the database will not really be opened or - // written to at this time. If the code is auto-restarting, then it will - // detect that the database exists and create a database with the - // -s000x extension. - // At this point, we need to skip the 'abort_if_exists' test if we - // are in this routine from the 'validate' and we are restarting - // since we won't really write to the file. So, the cases where we - // *don't* check are: - // -- is_input_event(db_usage) - // -- ifExists_ == DB_OVERWRITE || DB_ADD_SUFFIX_OVERWRITE || DB_APPEND - // -- is_automatic_restart() && step == 0 (coming from validate) - if(m_ifDatabaseExists != DB_OVERWRITE && - m_ifDatabaseExists != DB_APPEND && - m_ifDatabaseExists != DB_ADD_SUFFIX_OVERWRITE && - !(step == 0 && observer->is_automatic_restart())) - { - abort_if_exists(filename, m_dbType, db_usage); - } - } - return filename; -} - -bool DynamicTopologyFileControl::abort_if_exists(const std::string &filename, - const std::string &db_type, - Ioss::DatabaseUsage db_usage) -{ - // Check whether file with same name as database already exists. If so, - // print error message and stop... - // At the current time, only check on processor 0 and assume if it doesn't exist - // there, then it doesn't exist on other processors. Or, if it doesn't exist on - // processor 0, then it doesn't matter if it doesn't exist on other processors - // since we don't have all pieces... - - bool exists = file_exists(filename, db_type, db_usage); - if (exists) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: The database file named '{} exists" - "and would be overwritten if the code continued.\n\n" - "Input options specified that this file *not* be overwritten,\n" - "\tso you must rename or remove this file and restart the code.\n", - filename); - IOSS_ERROR(errmsg); - } - return exists; -} - -Ioss::DatabaseIO * DynamicTopologyFileControl::clone_output_database(int steps) -{ - auto current_db = m_region->get_database(); - - if (current_db->is_input()) - return nullptr; - - const Ioss::PropertyManager& current_properties = current_db->get_property_manager(); - Ioss::NameList names; - current_properties.describe(&names); - - // Iterate through properties and transfer to new output database... - Ioss::NameList::const_iterator I; - for (I = names.begin(); I != names.end(); ++I) { - if (!current_properties.exists(*I)) - m_properties.add(current_properties.get(*I)); - } - - auto db_usage = current_db->usage(); - - std::string filename = construct_database_filename(steps, db_usage); - - Ioss::DatabaseIO *db = Ioss::IOFactory::create(m_dbType, filename, db_usage, - current_db->util().communicator(), - m_properties); - - if (nullptr == db) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: unable to create output database named '{}'" - " of type '{}'", filename, m_dbType); - IOSS_ERROR(errmsg); - } - - assert(db != nullptr); - if(!db->ok(true)) { - std::ostringstream errmsg; - fmt::print(errmsg, - "ERROR: unable to validate output database named '{}'" - " of type '{}'", filename, m_dbType); - IOSS_ERROR(errmsg); - } - - db->set_field_separator(current_db->get_field_separator()); - db->set_surface_split_type(current_db->get_surface_split_type()); - db->set_maximum_symbol_length(current_db->maximum_symbol_length()); - db->set_int_byte_size_api(current_db->int_byte_size_data_size()); - - return db; -} - -template -void update_database_for_grouping_entities(const T& container, Ioss::DatabaseIO *db) -{ - for(auto * entity : container) { - Ioss::GroupingEntity* ge = dynamic_cast(entity); - assert(ge != nullptr); - - if(ge->type() == Ioss::SIDESET) { - Ioss::SideSet *sset = dynamic_cast(ge); - assert(sset != nullptr); - - sset->reset_database(db); - const auto &sblocks = sset->get_side_blocks(); - for (const auto &sblock : sblocks) { - sblock->reset_database(db); - } - } else { - ge->reset_database(db); - } - } -} - -bool DynamicTopologyFileControl::replace_output_database(Ioss::DatabaseIO *db) -{ - auto current_db = m_region->get_database(); - - if (current_db->is_input()) - return false; - - current_db->finalize_database(); - current_db->closeDatabase(); - delete current_db; - - m_region->reset_database(db); - db->set_region(m_region); - - update_database_for_grouping_entities(m_region->get_node_blocks(), db); - update_database_for_grouping_entities(m_region->get_edge_blocks(), db); - update_database_for_grouping_entities(m_region->get_face_blocks(), db); - update_database_for_grouping_entities(m_region->get_element_blocks(), db); - update_database_for_grouping_entities(m_region->get_sidesets(), db); - update_database_for_grouping_entities(m_region->get_nodesets(), db); - update_database_for_grouping_entities(m_region->get_edgesets(), db); - update_database_for_grouping_entities(m_region->get_facesets(), db); - update_database_for_grouping_entities(m_region->get_elementsets(), db); - update_database_for_grouping_entities(m_region->get_commsets(), db); - update_database_for_grouping_entities(m_region->get_structured_blocks(), db); - update_database_for_grouping_entities(m_region->get_assemblies(), db); - update_database_for_grouping_entities(m_region->get_blobs(), db); - - return true; -} - -void DynamicTopologyFileControl::clone_and_replace_output_database(int steps) -{ - auto db = clone_output_database(steps); - - if(nullptr != db) - replace_output_database(db); -} - -void DynamicTopologyFileControl::add_output_database_group(int steps) -{ - auto current_db = m_region->get_database(); - - std::ostringstream oss; - oss << group_prefix(); - oss << m_dbChangeCount; - - current_db->release_memory(); - current_db->open_root_group(); - current_db->create_subgroup(oss.str()); - - m_dbChangeCount++; -} - -} - - - - diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.h index 76de048fd491..3e4ab7f55acf 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.h +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.h @@ -6,26 +6,7 @@ #pragma once -#include "Ioss_DBUsage.h" -#include "Ioss_DatabaseIO.h" // for DatabaseIO -#include "Ioss_ParallelUtils.h" // for ParallelUtils -#include "Ioss_PropertyManager.h" // for PropertyManager -#include -#include // for size_t, nullptr -#include // for int64_t - -#include "Ioss_CodeTypes.h" -#include "Ioss_Utils.h" -#include "ioss_export.h" - -#include // for ostream -#include -#include // for string, operator< -#include - namespace Ioss { - class Region; - class DynamicTopologyNotifier; /*! The TopologyModified enumeration is used as an argument to the * topology_modified() functions in io to @@ -44,195 +25,24 @@ namespace Ioss { * - TOPOLOGY_UNKNOWN: Something else, catchall option. */ enum TopologyModified { - TOPOLOGY_SAME = ( 0), //!< No change, also used for initialization - TOPOLOGY_REORDER = (1U << 0), //!< Data structures reordered on processor, no change between procs. - TOPOLOGY_SHUFFLE = (1U << 1), //!< Globally the same, data moved among processors. - TOPOLOGY_HADAPT = (1U << 2), //!< Elements split/combined; not moved cross-proc - TOPOLOGY_GEOMETRY = (1U << 3), //!< Geometry (mesh coordinates) modified. Restart needs to know this. - TOPOLOGY_CREATEFACE = (1U << 4), //!< Face/Edge are created/deleted. - TOPOLOGY_CREATEELEM = (1U << 5), //!< Elements are created/deleted. - TOPOLOGY_CREATENODE = (1U << 6), //!< Nodes are created/deleted. - TOPOLOGY_CREATEASSEMBLY = (1U << 7), //!< Assemblies are created/deleted. - TOPOLOGY_UNKNOWN = (1U << 8), //!< Unknown change, recreate from scratch. - }; - - enum class FileControlOption { CONTROL_NONE, CONTROL_AUTO_MULTI_FILE, CONTROL_AUTO_GROUP_FILE }; - - class IOSS_EXPORT DynamicTopologyObserver - { - public: - DynamicTopologyObserver(Region *region) - : m_region(region) {} - - virtual ~DynamicTopologyObserver() {} - - virtual void reset_topology_modification_all(); - virtual void reset_topology_modification(); - virtual void set_topology_modification(unsigned int type); - virtual unsigned int get_topology_modification() const; - - virtual unsigned int get_cumulative_topology_modification() const; - virtual void set_cumulative_topology_modification(unsigned int type); - - int get_cumulative_topology_modification_field(); - - virtual bool is_topology_modified() const; - virtual bool is_automatic_restart() const { return false; } - virtual bool is_restart_requested() const { return false; } - - static const std::string topology_modification_change_name() - { - return std::string("CUMULATIVE_TOPOLOGY_MODIFICATION"); - } - - void register_region(Region *region); - Region *get_region() const { return m_region; } - - void register_notifier(DynamicTopologyNotifier *notifier); - DynamicTopologyNotifier* get_notifier() const { return m_notifier; } - - virtual void define_model(); - virtual void write_model(); - virtual void define_transient(); - - virtual FileControlOption get_control_option() const { return FileControlOption::CONTROL_NONE; } - - protected: - Region *m_region{nullptr}; - unsigned int m_topologyModification{TOPOLOGY_SAME}; - unsigned int m_cumulativeTopologyModification{TOPOLOGY_SAME}; - - bool m_automaticRestart{false}; - bool m_restartRequested{false}; - - DynamicTopologyNotifier *m_notifier{nullptr}; - - void check_region() const; - IOSS_NODISCARD const ParallelUtils &util() const; - void synchronize_topology_modified_flags(); - - void set_topology_modification_nl(unsigned int type); - - private: - DynamicTopologyObserver(); - }; - - - class IOSS_EXPORT DynamicTopologyNotifier - { - public: - DynamicTopologyNotifier(const std::string& model_name) - : m_modelName(model_name) {} - - virtual ~DynamicTopologyNotifier() = default; - - std::string name() const { return m_modelName; } - - std::vector> get_observers() const { return m_observers; } + TOPOLOGY_SAME = (0), //!< No change, also used for initialization + TOPOLOGY_REORDER = + (1U << 0), //!< Data structures reordered on processor, no change between procs. + TOPOLOGY_SHUFFLE = (1U << 1), //!< Globally the same, data moved among processors. + TOPOLOGY_HADAPT = (1U << 2), //!< Elements split/combined; not moved cross-proc + TOPOLOGY_GHOST = (1U << 3), //!< Ghost entities created/destroyed + TOPOLOGY_GEOMETRY = + (1U << 4), //!< Geometry (mesh coordinates) modified. Restart needs to know this. + TOPOLOGY_CREATEFACE = (1U << 5), //!< Face/Edge are created/deleted. + TOPOLOGY_CREATEELEM = (1U << 6), //!< Elements are created/deleted. + TOPOLOGY_CREATENODE = (1U << 7), //!< Nodes are created/deleted. + TOPOLOGY_CREATEASSEMBLY = (1U << 8), //!< Assemblies are created/deleted. + TOPOLOGY_UNKNOWN = (1U << 9), //!< Unknown change, recreate from scratch. + TOPOLOGY_AUXILIARY = (1U << 10), //!< An AUXILIARY relation was created/modified. + TOPOLOGY_CONSTRAINT = (1U << 11) //!< Contact constraints - void register_observer(std::shared_ptr observer); - - void unregister_observer(std::shared_ptr observer); - - void reset_topology_modification(); - - void set_topology_modification(unsigned int type); - - template - bool has_observer_type() const - { - bool found = false; - - for(const std::shared_ptr& observer : m_observers) { - if (dynamic_cast(observer.get()) != nullptr) { - found = true; - break; - } - } - return found; - } - - template - std::vector> get_observer_type() const - { - std::vector> typed_observers; - - for(const std::shared_ptr &observer : m_observers) { - ObserverType* typed_observer = dynamic_cast(observer.get()); - if (typed_observer != nullptr) { - typed_observers.push_back(std::dynamic_pointer_cast(observer)); - } - } - - return typed_observers; - } - - private: - const std::string m_modelName; - std::vector> m_observers; }; - - class IOSS_EXPORT DynamicTopologyBroker - { - public: - static DynamicTopologyBroker *broker(); - - void register_model(const std::string& model_name); - void remove_model(const std::string& model_name); - void clear_models(); - - std::shared_ptr get_notifier(const std::string& model_name) const; - std::vector> get_observers(const std::string& model_name) const; - - void register_observer(const std::string& model_name, std::shared_ptr observer); - void register_observer(const std::string& model_name, std::shared_ptr observer, Region& region); - - void reset_topology_modification(const std::string& model_name); - void set_topology_modification(const std::string& model_name, unsigned int type); - - private: - DynamicTopologyBroker() {}; - DynamicTopologyBroker(DynamicTopologyBroker&); - - std::map> m_notifiers; - }; - - - class IOSS_EXPORT DynamicTopologyFileControl - { - public: - DynamicTopologyFileControl(Region *region, unsigned int fileCyclicCount, - IfDatabaseExistsBehavior &ifDatabaseExists, - unsigned int &dbChangeCount); - - void clone_and_replace_output_database(int steps = 0); - void add_output_database_group(int steps = 0); - - static std::string group_prefix() { return "IOSS_FILE_GROUP-"; } - - private: - Region *m_region{nullptr}; - std::string m_ioDB; - std::string m_dbType; - - PropertyManager m_properties; - - unsigned int m_fileCyclicCount; - IfDatabaseExistsBehavior &m_ifDatabaseExists; - unsigned int &m_dbChangeCount; - - IOSS_NODISCARD const ParallelUtils &util() const; - - std::string get_unique_filename(DatabaseUsage db_usage); - std::string construct_database_filename(int &step, DatabaseUsage db_usage); - bool file_exists(const std::string &filename, const std::string &db_type, - DatabaseUsage db_usage); - bool abort_if_exists(const std::string &filename, const std::string &db_type, - DatabaseUsage db_usage); - - DatabaseIO *clone_output_database(int steps); - bool replace_output_database(DatabaseIO *db); - }; + enum class FileControlOption { CONTROL_NONE, CONTROL_AUTO_MULTI_FILE, CONTROL_AUTO_GROUP_FILE }; } // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.C new file mode 100644 index 000000000000..a6652d4e6bf0 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.C @@ -0,0 +1,111 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_DynamicTopologyBroker.h" +#include "Ioss_Region.h" + +#include +#include +#include +#include +#include + +namespace Ioss { + + DynamicTopologyBroker *DynamicTopologyBroker::broker() + { + static DynamicTopologyBroker broker_; + return &broker_; + } + + void DynamicTopologyBroker::register_model(const std::string &model_name) + { + auto iter = m_notifiers.find(model_name); + if (iter != m_notifiers.end()) { + return; + } + + m_notifiers[model_name] = std::make_shared(model_name); + } + + std::shared_ptr + DynamicTopologyBroker::get_notifier(const std::string &model_name) const + { + auto iter = m_notifiers.find(model_name); + if (iter != m_notifiers.end()) { + return iter->second; + } + + return {}; + } + + std::vector> + DynamicTopologyBroker::get_observers(const std::string &model_name) const + { + std::vector> observers; + + auto notifier = get_notifier(model_name); + + if (notifier) { + return notifier->get_observers(); + } + + return observers; + } + + void DynamicTopologyBroker::remove_model(const std::string &model_name) + { + auto iter = m_notifiers.find(model_name); + if (iter != m_notifiers.end()) { + m_notifiers.erase(iter); + } + } + + void DynamicTopologyBroker::clear_models() { m_notifiers.clear(); } + + void DynamicTopologyBroker::register_observer(const std::string &model_name, + std::shared_ptr observer) + { + auto notifier = get_notifier(model_name); + + if (!notifier) { + register_model(model_name); + notifier = get_notifier(model_name); + } + + notifier->register_observer(observer); + } + + void DynamicTopologyBroker::register_observer(const std::string &model_name, + std::shared_ptr observer, + Region ®ion) + { + region.register_mesh_modification_observer(observer); + register_observer(model_name, observer); + } + + void DynamicTopologyBroker::reset_topology_modification(const std::string &model_name) + { + auto notifier = get_notifier(model_name); + + if (!notifier) + return; + + notifier->reset_topology_modification(); + } + + void DynamicTopologyBroker::set_topology_modification(const std::string &model_name, + unsigned int type) + { + auto notifier = get_notifier(model_name); + + if (!notifier) + return; + + notifier->set_topology_modification(type); + } + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.h new file mode 100644 index 000000000000..662454632a1a --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyBroker.h @@ -0,0 +1,58 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DynamicTopology.h" +#include "Ioss_DynamicTopologyNotifier.h" +#include "Ioss_DynamicTopologyObserver.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" // for DatabaseIO +#include "Ioss_ParallelUtils.h" // for ParallelUtils +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Utils.h" +#include "ioss_export.h" + +#include // for size_t, nullptr +#include // for int64_t +#include +#include +#include // for string, operator< + +namespace Ioss { + class Region; + + class IOSS_EXPORT DynamicTopologyBroker + { + public: + static DynamicTopologyBroker *broker(); + + void register_model(const std::string &model_name); + void remove_model(const std::string &model_name); + void clear_models(); + + std::shared_ptr get_notifier(const std::string &model_name) const; + std::vector> + get_observers(const std::string &model_name) const; + + void register_observer(const std::string &model_name, + std::shared_ptr observer); + void register_observer(const std::string &model_name, + std::shared_ptr observer, Region ®ion); + + void reset_topology_modification(const std::string &model_name); + void set_topology_modification(const std::string &model_name, unsigned int type); + + private: + DynamicTopologyBroker() = default; + DynamicTopologyBroker(DynamicTopologyBroker &) = delete; + + std::map> m_notifiers; + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.C new file mode 100644 index 000000000000..c9d2bf08e78e --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.C @@ -0,0 +1,433 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_Assembly.h" +#include "Ioss_Blob.h" +#include "Ioss_ChangeSet.h" +#include "Ioss_ChangeSetFactory.h" +#include "Ioss_CodeTypes.h" +#include "Ioss_CommSet.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" +#include "Ioss_DynamicTopology.h" +#include "Ioss_DynamicTopologyFileControl.h" +#include "Ioss_EdgeBlock.h" +#include "Ioss_EdgeSet.h" +#include "Ioss_ElementBlock.h" +#include "Ioss_ElementSet.h" +#include "Ioss_EntityBlock.h" +#include "Ioss_EntityType.h" +#include "Ioss_FaceBlock.h" +#include "Ioss_FaceSet.h" +#include "Ioss_Field.h" +#include "Ioss_FileInfo.h" +#include "Ioss_GroupingEntity.h" +#include "Ioss_IOFactory.h" +#include "Ioss_NodeBlock.h" +#include "Ioss_NodeSet.h" +#include "Ioss_ParallelUtils.h" +#include "Ioss_Region.h" +#include "Ioss_SideBlock.h" +#include "Ioss_SideSet.h" +#include "Ioss_StructuredBlock.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace { + + bool file_exists(const Ioss::ParallelUtils &util, const std::string &filename, + const std::string &db_type, Ioss::DatabaseUsage db_usage) + { + int par_size = util.parallel_size(); + int par_rank = util.parallel_rank(); + bool is_parallel = par_size > 1; + std::string full_filename = filename; + if (is_parallel && (db_type == "exodusII" || db_type == "cgns") && + (db_usage != Ioss::WRITE_HISTORY)) { + full_filename = Ioss::Utils::decode_filename(filename, par_rank, par_size); + } + + std::string message; + Ioss::FileInfo file = Ioss::FileInfo(full_filename); + return file.parallel_exists(util.communicator(), message); + } + + template + void update_database_for_grouping_entities(const T &container, Ioss::DatabaseIO *db) + { + for (auto *entity : container) { + Ioss::GroupingEntity *ge = dynamic_cast(entity); + assert(ge != nullptr); + + if (ge->type() == Ioss::SIDESET) { + Ioss::SideSet *sset = dynamic_cast(ge); + assert(sset != nullptr); + + sset->reset_database(db); + const auto &sblocks = sset->get_side_blocks(); + for (const auto &sblock : sblocks) { + sblock->reset_database(db); + } + } + else { + ge->reset_database(db); + } + } + } + +} // namespace + +namespace Ioss { + + DynamicTopologyFileControl::DynamicTopologyFileControl(Region *region) + : m_region(region), m_fileCyclicCount(region->get_file_cyclic_count()), + m_ifDatabaseExists(region->get_if_database_exists_behavior()), + m_dbChangeCount(region->get_topology_change_count()) + { + if (nullptr == region) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: null region passed in as argument to DynamicTopologyFileControl"); + IOSS_ERROR(errmsg); + } + + m_ioDB = region->get_property("base_filename").get_string(); + m_dbType = region->get_property("database_type").get_string(); + } + + const ParallelUtils &DynamicTopologyFileControl::util() const + { + return m_region->get_database()->util(); + } + + bool DynamicTopologyFileControl::file_exists(const std::string &filename, + const std::string &db_type, + Ioss::DatabaseUsage db_usage) + { + return ::file_exists(util(), filename, db_type, db_usage); + } + + std::string DynamicTopologyFileControl::get_unique_linear_filename(Ioss::DatabaseUsage db_usage) + { + std::string filename = m_ioDB; + + do { + // Run this loop at least once for all files. If this is an automatic + // restart, then make sure that the generated file does not already exist, + // so keep running the loop until we generate a filename that doesn't exist... + std::ostringstream tmp_filename; + tmp_filename << m_ioDB; + + // Don't append the "-s000X" the first time in case the base filename doesn't + // exist -- we want write to the name specified by the user if at all possible and + // once that exists, then start adding on the suffix... + if (m_dbChangeCount > 1) { + tmp_filename << "-s" << std::setw(4) << std::setfill('0') << m_dbChangeCount; + } + filename = tmp_filename.str(); + ++m_dbChangeCount; + } while (file_exists(filename, m_dbType, db_usage)); + --m_dbChangeCount; + return filename; + } + + std::string DynamicTopologyFileControl::get_internal_file_change_set_name(unsigned int step) + { + std::ostringstream change_setname; + change_setname << change_set_prefix(); + change_setname << step; + return change_setname.str(); + } + + std::string DynamicTopologyFileControl::get_cyclic_database_filename( + const std::string &baseFileName, unsigned int fileCyclicCount, unsigned int step) + { + return ChangeSet::get_cyclic_database_filename(baseFileName, fileCyclicCount, step); + } + + std::string + DynamicTopologyFileControl::get_linear_database_filename(const std::string &baseFileName, + unsigned int step) + { + return ChangeSet::get_linear_database_filename(baseFileName, step); + } + + std::string DynamicTopologyFileControl::construct_database_filename(int &step, + Ioss::DatabaseUsage db_usage) + { + // Filename will be of the form -- ioDB-sxxxx where xxxx is step + // number. Assume maximum of 9999 steps (will do more, but won't have + // good lineup of step numbers. + // Check database for validity (filename and a type) + if (m_ioDB.empty() || m_dbType.empty()) { + std::string error_message; + if (m_dbType.empty()) + error_message += "The database TYPE has not been defined\n"; + + if (m_ioDB.empty()) { + error_message += "The database FILENAME has not been defined\n"; + } + std::ostringstream errmsg; + errmsg << error_message; + IOSS_ERROR(errmsg); + } + assert(!m_ioDB.empty()); + assert(!m_dbType.empty()); + std::string filename = m_ioDB; + if (m_fileCyclicCount > 0) { + // In this mode, we close the old file and open a new file + // every time this is called. The file suffix cycles through + // the first fileCyclicCount'th entries in A,B,C,D,E,F,... + + // filename = get_cyclic_database_filename(m_ioDB, m_fileCyclicCount, step); + if (step == 0) + step++; + + static std::string suffix = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + std::string tmp = "-" + suffix.substr((step - 1) % m_fileCyclicCount, 1); + filename += tmp; + m_properties.add(Ioss::Property("APPEND_OUTPUT", Ioss::DB_OVERWRITE)); + } + else { + if (m_region->model_is_written()) { + // After the initial open, we want to add suffix if the topology changes + // during the run + m_ifDatabaseExists = Ioss::DB_ADD_SUFFIX_OVERWRITE; + } + + // Handle complications of DB_APPEND mode... + // If in DB_APPEND mode, then we don't output metadata + // information, so some knowledge is needed at this level if + // we are appending. If user specified APPEND, but the file + // doesn't yet exist OR it does exist and we are not + // restarting, change the mode to OVERWRITE. + // 0. Must be restarting; either manual or automatic. + std::shared_ptr observer = + m_region->get_mesh_modification_observer(); + + if (m_ifDatabaseExists == Ioss::DB_APPEND) { + if (!observer->is_restart_requested()) { + // Not restarting + m_ifDatabaseExists = Ioss::DB_OVERWRITE; + } + else if (!file_exists(m_ioDB, m_dbType, db_usage)) { + m_ifDatabaseExists = Ioss::DB_OVERWRITE; + } + } + if (step > 1 || (m_dbChangeCount > 1)) { + // Use the !is_input_event test since restart input files already have the + // -s000x extension... + if (m_ifDatabaseExists == Ioss::DB_APPEND) { + std::ostringstream tmp_filename; + tmp_filename << m_ioDB; + filename = m_ioDB; + if (m_dbChangeCount > 1) { + tmp_filename << "-s" << std::setw(4) << std::setfill('0') << m_dbChangeCount; + } + size_t inc = 0; + while (file_exists(tmp_filename.str(), m_dbType, db_usage)) { + filename = tmp_filename.str(); + tmp_filename.clear(); + tmp_filename.str(""); + tmp_filename << m_ioDB << "-s" << std::setw(4) << std::setfill('0') + << m_dbChangeCount + (++inc); + } + if (inc > 0) { + m_dbChangeCount += (inc - 1); + } + else { + m_ifDatabaseExists = Ioss::DB_OVERWRITE; + } + } + else if (m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX) { + filename = get_unique_linear_filename(db_usage); + } + else if (m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX_OVERWRITE) { + if (m_dbChangeCount > 0) { + std::ostringstream tmp_filename; + tmp_filename << m_ioDB << "-s" << std::setw(4) << std::setfill('0') + << ++m_dbChangeCount; + filename = tmp_filename.str(); + } + else { + filename = m_ioDB; + } + } + else { + filename = m_ioDB; + } + } + else if (m_ifDatabaseExists == Ioss::DB_ADD_SUFFIX) { + filename = get_unique_linear_filename(db_usage); + } + else { + filename = m_ioDB; + } + + m_properties.add(Ioss::Property("APPEND_OUTPUT", m_ifDatabaseExists)); + // A little complicated on deciding whether we are actually + // overwriting the database. The 'validate' routine for Results and + // History will call create_database once the parser block is + // ended. This routine will then create the database and the + // ioRegion_. However, the database will not really be opened or + // written to at this time. If the code is auto-restarting, then it will + // detect that the database exists and create a database with the + // -s000x extension. + // At this point, we need to skip the 'abort_if_exists' test if we + // are in this routine from the 'validate' and we are restarting + // since we won't really write to the file. So, the cases where we + // *don't* check are: + // -- is_input_event(db_usage) + // -- ifExists_ == DB_OVERWRITE || DB_ADD_SUFFIX_OVERWRITE || DB_APPEND + // -- is_automatic_restart() && step == 0 (coming from validate) + if (m_ifDatabaseExists != DB_OVERWRITE && m_ifDatabaseExists != DB_APPEND && + m_ifDatabaseExists != DB_ADD_SUFFIX_OVERWRITE && + !(step == 0 && observer->is_automatic_restart())) { + abort_if_exists(filename, m_dbType, db_usage); + } + } + return filename; + } + + bool DynamicTopologyFileControl::abort_if_exists(const std::string &filename, + const std::string &db_type, + Ioss::DatabaseUsage db_usage) + { + // Check whether file with same name as database already exists. If so, + // print error message and stop... + // At the current time, only check on processor 0 and assume if it doesn't exist + // there, then it doesn't exist on other processors. Or, if it doesn't exist on + // processor 0, then it doesn't matter if it doesn't exist on other processors + // since we don't have all pieces... + + bool exists = file_exists(filename, db_type, db_usage); + if (exists) { + std::ostringstream errmsg; + fmt::print(errmsg, + "ERROR: The database file named '{} exists" + "and would be overwritten if the code continued.\n\n" + "Input options specified that this file *not* be overwritten,\n" + "\tso you must rename or remove this file and restart the code.\n", + filename); + IOSS_ERROR(errmsg); + } + return exists; + } + + Ioss::DatabaseIO *DynamicTopologyFileControl::clone_output_database(int steps) + { + auto current_db = m_region->get_database(); + + if (current_db->is_input()) + return nullptr; + + const Ioss::PropertyManager ¤t_properties = current_db->get_property_manager(); + Ioss::NameList names = current_properties.describe(); + + // Iterate through properties and transfer to new output database... + for (const auto &name : names) { + if (!m_properties.exists(name)) + m_properties.add(current_properties.get(name)); + } + + auto db_usage = current_db->usage(); + + std::string filename = construct_database_filename(steps, db_usage); + + Ioss::DatabaseIO *db = Ioss::IOFactory::create(m_dbType, filename, db_usage, + current_db->util().communicator(), m_properties); + + if (nullptr == db) { + std::ostringstream errmsg; + fmt::print(errmsg, + "ERROR: unable to create output database named '{}'" + " of type '{}'", + filename, m_dbType); + IOSS_ERROR(errmsg); + } + + assert(db != nullptr); + if (!db->ok(true)) { + std::ostringstream errmsg; + fmt::print(errmsg, + "ERROR: unable to validate output database named '{}'" + " of type '{}'", + filename, m_dbType); + IOSS_ERROR(errmsg); + } + + db->set_field_separator(current_db->get_field_separator()); + db->set_surface_split_type(current_db->get_surface_split_type()); + db->set_maximum_symbol_length(current_db->maximum_symbol_length()); + db->set_int_byte_size_api(current_db->int_byte_size_data_size()); + + return db; + } + + bool DynamicTopologyFileControl::replace_output_database(Ioss::DatabaseIO *db) + { + auto current_db = m_region->get_database(); + + if (current_db->is_input()) + return false; + + current_db->finalize_database(); + current_db->closeDatabase(); + delete current_db; + + m_region->reset_database(db); + db->set_region(m_region); + + update_database_for_grouping_entities(m_region->get_node_blocks(), db); + update_database_for_grouping_entities(m_region->get_edge_blocks(), db); + update_database_for_grouping_entities(m_region->get_face_blocks(), db); + update_database_for_grouping_entities(m_region->get_element_blocks(), db); + update_database_for_grouping_entities(m_region->get_sidesets(), db); + update_database_for_grouping_entities(m_region->get_nodesets(), db); + update_database_for_grouping_entities(m_region->get_edgesets(), db); + update_database_for_grouping_entities(m_region->get_facesets(), db); + update_database_for_grouping_entities(m_region->get_elementsets(), db); + update_database_for_grouping_entities(m_region->get_commsets(), db); + update_database_for_grouping_entities(m_region->get_structured_blocks(), db); + update_database_for_grouping_entities(m_region->get_assemblies(), db); + update_database_for_grouping_entities(m_region->get_blobs(), db); + + return true; + } + + void DynamicTopologyFileControl::clone_and_replace_output_database(int steps) + { + auto db = clone_output_database(steps); + + if (nullptr != db) + replace_output_database(db); + } + + void DynamicTopologyFileControl::add_output_database_change_set(IOSS_MAYBE_UNUSED int steps) + { + auto current_db = get_database(); + + std::ostringstream oss; + oss << change_set_prefix(); + oss << m_dbChangeCount; + + current_db->release_memory(); + current_db->create_internal_change_set(oss.str()); + + m_dbChangeCount++; + } + + DatabaseIO *DynamicTopologyFileControl::get_database() const { return m_region->get_database(); } + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.h new file mode 100644 index 000000000000..044c1036df1a --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyFileControl.h @@ -0,0 +1,77 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DynamicTopology.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" // for DatabaseIO +#include "Ioss_ParallelUtils.h" // for ParallelUtils +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Utils.h" +#include "ioss_export.h" + +#include // for size_t, nullptr +#include // for int64_t +#include +#include +#include // for string, operator< + +namespace Ioss { + class Region; + + class IOSS_EXPORT DynamicTopologyFileControl + { + public: + explicit DynamicTopologyFileControl(Region *region); + + void clone_and_replace_output_database(int steps = 0); + void add_output_database_change_set(int steps = 0); + + static std::string change_set_prefix() { return "IOSS_FILE_GROUP-"; } + + DatabaseIO *get_database() const; + + static std::string get_cyclic_database_filename(const std::string &baseFileName, + unsigned int fileCyclicCount, + unsigned int step); + + static std::string get_linear_database_filename(const std::string &baseFileName, + unsigned int step); + + static std::string get_internal_file_change_set_name(unsigned int step); + + unsigned int get_topology_change_count() const { return m_dbChangeCount; } + unsigned int get_file_cyclic_count() const { return m_fileCyclicCount; } + IfDatabaseExistsBehavior get_if_database_exists_behavior() const { return m_ifDatabaseExists; } + + private: + Region *m_region{nullptr}; + std::string m_ioDB; + std::string m_dbType; + + PropertyManager m_properties; + + unsigned int m_fileCyclicCount; + IfDatabaseExistsBehavior m_ifDatabaseExists; + unsigned int m_dbChangeCount; + + IOSS_NODISCARD const ParallelUtils &util() const; + + std::string get_unique_linear_filename(DatabaseUsage db_usage); + std::string construct_database_filename(int &step, DatabaseUsage db_usage); + bool file_exists(const std::string &filename, const std::string &db_type, + DatabaseUsage db_usage); + bool abort_if_exists(const std::string &filename, const std::string &db_type, + DatabaseUsage db_usage); + + DatabaseIO *clone_output_database(int steps); + bool replace_output_database(DatabaseIO *db); + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.C new file mode 100644 index 000000000000..294d04cde11a --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.C @@ -0,0 +1,59 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_DynamicTopologyNotifier.h" + +#include +#include +#include +#include +#include + +namespace Ioss { + + struct DynamicTopologyObserverCompare + { + bool operator()(const std::shared_ptr &lhs, + const std::shared_ptr &rhs) const + { + assert(lhs && (lhs->get_region() != nullptr)); + assert(rhs && (rhs->get_region() != nullptr)); + return (lhs->get_region() < rhs->get_region()); + } + }; + + void DynamicTopologyNotifier::register_observer(std::shared_ptr observer) + { + observer->register_notifier(this); + m_observers.push_back(observer); + std::sort(m_observers.begin(), m_observers.end(), DynamicTopologyObserverCompare()); + } + + void + DynamicTopologyNotifier::unregister_observer(std::shared_ptr observer) + { + auto iter = std::find(m_observers.begin(), m_observers.end(), observer); + if (iter != m_observers.end()) { + (*iter)->register_notifier(nullptr); + m_observers.erase(iter); + } + } + + void DynamicTopologyNotifier::reset_topology_modification() + { + for (std::shared_ptr &observer : m_observers) { + observer->reset_topology_modification(); + } + } + + void DynamicTopologyNotifier::set_topology_modification(unsigned int type) + { + for (std::shared_ptr &observer : m_observers) { + observer->set_topology_modification(type); + } + } + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.h new file mode 100644 index 000000000000..a90d36a37bc3 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyNotifier.h @@ -0,0 +1,85 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DynamicTopology.h" +#include "Ioss_DynamicTopologyObserver.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" // for DatabaseIO +#include "Ioss_ParallelUtils.h" // for ParallelUtils +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Utils.h" +#include "ioss_export.h" + +#include // for size_t, nullptr +#include // for int64_t +#include +#include +#include // for string, operator< + +namespace Ioss { + + class IOSS_EXPORT DynamicTopologyNotifier + { + public: + explicit DynamicTopologyNotifier(const std::string &model_name) : m_modelName(model_name) {} + + virtual ~DynamicTopologyNotifier() = default; + + std::string name() const { return m_modelName; } + + const std::vector> &get_observers() const + { + return m_observers; + } + + std::vector> &get_observers() { return m_observers; } + + void register_observer(std::shared_ptr observer); + + void unregister_observer(std::shared_ptr observer); + + void reset_topology_modification(); + + void set_topology_modification(unsigned int type); + + template bool has_observer_type() const + { + bool found = false; + + for (const std::shared_ptr &observer : m_observers) { + if (dynamic_cast(observer.get()) != nullptr) { + found = true; + break; + } + } + return found; + } + + template + std::vector> get_observer_type() const + { + std::vector> typed_observers; + + for (const std::shared_ptr &observer : m_observers) { + ObserverType *typed_observer = dynamic_cast(observer.get()); + if (typed_observer != nullptr) { + typed_observers.push_back(std::dynamic_pointer_cast(observer)); + } + } + + return typed_observers; + } + + private: + const std::string m_modelName; + std::vector> m_observers; + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.C new file mode 100644 index 000000000000..9e3bf5393631 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.C @@ -0,0 +1,222 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_ChangeSetFactory.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" +#include "Ioss_DynamicTopology.h" +#include "Ioss_DynamicTopologyNotifier.h" +#include "Ioss_DynamicTopologyObserver.h" +#include "Ioss_FileInfo.h" +#include "Ioss_IOFactory.h" +#include "Ioss_ParallelUtils.h" +#include "Ioss_Region.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace Ioss { + + bool DynamicTopologyObserver::needs_new_output_file() const + { + // See what type of topology modification has occurred. If a + // simple REORDER, then we don't need a new file, just have to + // inform database of new order; otherwise, need a new file (for + // ExodusII). Baseline implementation + + if ((get_topology_modification() & Ioss::TOPOLOGY_HADAPT) || + (get_topology_modification() & Ioss::TOPOLOGY_CREATEFACE) || + (get_topology_modification() & Ioss::TOPOLOGY_CREATEELEM) || + (get_topology_modification() & Ioss::TOPOLOGY_CREATENODE) || + (get_topology_modification() & Ioss::TOPOLOGY_UNKNOWN) || + (get_topology_modification() & Ioss::TOPOLOGY_SHUFFLE)) { + // See if database has been written to since being opened... + if (get_cumulative_topology_modification() != 0) { + return true; + } + } + return false; + } + + void DynamicTopologyObserver::verify_region_is_registered() const + { + if (nullptr == m_region) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: A region has not been registered with the " + "Dynamic Topology Observer.\n\n"); + IOSS_ERROR(errmsg); + } + } + + void DynamicTopologyObserver::register_region(Region *region) + { + if (nullptr != region && nullptr != m_region && region != m_region) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Attempt to re-register different region on " + "Dynamic Topology Observer.\n\n"); + IOSS_ERROR(errmsg); + } + + m_region = region; + } + + void DynamicTopologyObserver::register_notifier(DynamicTopologyNotifier *notifier) + { + if (nullptr != notifier && nullptr != m_notifier && notifier != m_notifier) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Attempt to re-register different notifier on " + "Dynamic Topology Observer.\n\n"); + IOSS_ERROR(errmsg); + } + + m_notifier = notifier; + } + + void DynamicTopologyObserver::set_cumulative_topology_modification(unsigned int type) + { + m_cumulativeTopologyModification = type; + } + + unsigned int DynamicTopologyObserver::get_cumulative_topology_modification() const + { + return m_cumulativeTopologyModification; + } + + unsigned int DynamicTopologyObserver::get_topology_modification() const + { + return m_topologyModification; + } + + void DynamicTopologyObserver::set_topology_modification_nl(unsigned int type) + { + m_topologyModification |= type; + m_cumulativeTopologyModification |= type; + } + + void DynamicTopologyObserver::sync_topology_modification(unsigned int modFlag, + unsigned int cumulativeModFlag) + { + m_topologyModification = modFlag; + m_cumulativeTopologyModification = cumulativeModFlag; + } + + void DynamicTopologyObserver::set_topology_modification(unsigned int type) + { + if (!(m_topologyModification & type)) { + set_topology_modification_nl(type); + + if (nullptr != m_notifier) { + for (auto &observer : m_notifier->get_observers()) { + observer->set_topology_modification_nl(type); + } + } + } + } + + void DynamicTopologyObserver::reset_topology_modification() + { + m_topologyModification = TOPOLOGY_SAME; + } + + void DynamicTopologyObserver::reset_topology_modification_all() + { + if (m_topologyModification != TOPOLOGY_SAME) { + reset_topology_modification(); + + if (nullptr != m_notifier) { + for (auto &observer : m_notifier->get_observers()) { + observer->reset_topology_modification(); + } + } + } + } + + bool DynamicTopologyObserver::is_topology_modified() const + { + return m_topologyModification != TOPOLOGY_SAME; + } + + const ParallelUtils &DynamicTopologyObserver::util() const + { + verify_region_is_registered(); + return m_region->get_database()->util(); + } + + void DynamicTopologyObserver::synchronize_topology_modified_flags() + { + verify_region_is_registered(); + int num_processors = m_region->get_database()->parallel_size(); + // Synchronize the topology flags between all processors in case + // it has not been set consistently. + if (num_processors > 1) { + static unsigned int buffer[2]; + buffer[0] = m_cumulativeTopologyModification; + buffer[1] = m_topologyModification; + + util().attribute_reduction(2 * sizeof(unsigned int), reinterpret_cast(buffer)); + + m_cumulativeTopologyModification = buffer[0]; + m_topologyModification = buffer[1]; + } + } + + int DynamicTopologyObserver::get_cumulative_topology_modification_field() + { + verify_region_is_registered(); + const std::string variable_name = topology_modification_change_name(); + + int ivalue = 0; + + if (m_region->field_exists(variable_name)) { + Field topo_field = m_region->get_field(variable_name); + if (topo_field.get_type() == Field::INTEGER) { + m_region->get_field_data(variable_name, &ivalue, sizeof(int)); + } + else { + double value; + m_region->get_field_data(variable_name, &value, sizeof(double)); + ivalue = (int)value; + } + } + + int num_processors = m_region->get_database()->parallel_size(); + // Synchronize the value between all processors in case + // it has not been set consistently. + if (num_processors > 1) { + unsigned int buffer[1]; + buffer[0] = ivalue; + + util().attribute_reduction(sizeof(unsigned int), reinterpret_cast(buffer)); + + ivalue = (int)buffer[0]; + } + + m_cumulativeTopologyModification = ivalue; + + return ivalue; + } + + void DynamicTopologyObserver::define_model() {} + + void DynamicTopologyObserver::write_model() {} + + void DynamicTopologyObserver::define_transient() {} + + void DynamicTopologyObserver::initialize_region() + { + if (nullptr != m_region) { + m_region->reset_region(); + } + } + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.h new file mode 100644 index 000000000000..90e4f12d936c --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyObserver.h @@ -0,0 +1,95 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DynamicTopology.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" // for DatabaseIO +#include "Ioss_ParallelUtils.h" // for ParallelUtils +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Utils.h" +#include "ioss_export.h" + +#include // for size_t, nullptr +#include // for int64_t +#include +#include +#include // for string, operator< + +namespace Ioss { + class Region; + class DynamicTopologyNotifier; + + class IOSS_EXPORT DynamicTopologyObserver + { + public: + explicit DynamicTopologyObserver(Region *region) : m_region(region) {} + + virtual ~DynamicTopologyObserver() = default; + + virtual void reset_topology_modification_all(); + virtual void reset_topology_modification(); + virtual void set_topology_modification(unsigned int type); + virtual void sync_topology_modification(unsigned int modFlag, unsigned int cumulativeModFlag); + virtual unsigned int get_topology_modification() const; + + virtual unsigned int get_cumulative_topology_modification() const; + virtual void set_cumulative_topology_modification(unsigned int type); + + int get_cumulative_topology_modification_field(); + + virtual bool is_topology_modified() const; + virtual bool is_automatic_restart() const { return m_automaticRestart; } + virtual bool is_restart_requested() const { return m_restartRequested; } + + void set_automatic_restart(bool flag) { m_automaticRestart = flag; } + void set_restart_requested(bool flag) { m_restartRequested = flag; } + + static std::string topology_modification_change_name() + { + return std::string("CUMULATIVE_TOPOLOGY_MODIFICATION"); + } + + void register_region(Region *region); + Region *get_region() const { return m_region; } + + void register_notifier(DynamicTopologyNotifier *notifier); + DynamicTopologyNotifier *get_notifier() const { return m_notifier; } + + virtual void define_model(); + virtual void write_model(); + virtual void define_transient(); + + virtual FileControlOption get_control_option() const { return FileControlOption::CONTROL_NONE; } + + virtual bool needs_new_output_file() const; + + virtual void initialize_region(); + + protected: + Region *m_region{nullptr}; + unsigned int m_topologyModification{TOPOLOGY_SAME}; + unsigned int m_cumulativeTopologyModification{TOPOLOGY_SAME}; + + bool m_automaticRestart{false}; + bool m_restartRequested{false}; + + DynamicTopologyNotifier *m_notifier{nullptr}; + + void verify_region_is_registered() const; + IOSS_NODISCARD const ParallelUtils &util() const; + void synchronize_topology_modified_flags(); + + void set_topology_modification_nl(unsigned int type); + + private: + DynamicTopologyObserver(); + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.C b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.C new file mode 100644 index 000000000000..e4c54bcea4fa --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.C @@ -0,0 +1,177 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioss_DynamicTopologyStateLocator.h" + +#include "Ioss_ChangeSet.h" +#include "Ioss_ChangeSetFactory.h" +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" +#include "Ioss_ParallelUtils.h" +#include "Ioss_Region.h" + +#include +#include +#include +#include +#include + +namespace Ioss { + + DynamicTopologyStateLocator::DynamicTopologyStateLocator(Region *region, bool loadAllFiles) + : m_database(region->get_database()), + m_ioDB(region->get_property("base_filename").get_string()), + m_dbType(region->get_property("database_type").get_string()), + m_fileCyclicCount(region->get_file_cyclic_count()), m_loadAllFiles(loadAllFiles) + { + } + + DynamicTopologyStateLocator::DynamicTopologyStateLocator(Ioss::DatabaseIO *db, + const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount, + bool loadAllFiles) + : m_database(db), m_ioDB(dbName), m_dbType(dbType), m_fileCyclicCount(fileCyclicCount), + m_loadAllFiles(loadAllFiles) + { + } + + DynamicTopologyStateLocator::DynamicTopologyStateLocator(Ioss::DatabaseIO *db, + unsigned fileCyclicCount, + bool loadAllFiles) + : m_database(db), + m_ioDB(db->get_property_manager().get_optional("base_filename", db->get_filename())), + m_dbType(db->get_property_manager().get_optional("database_type", "")), + m_fileCyclicCount(fileCyclicCount), m_loadAllFiles(loadAllFiles) + { + } + + DynamicTopologyStateLocator::~DynamicTopologyStateLocator() {} + + const ParallelUtils &DynamicTopologyStateLocator::util() const { return get_database()->util(); } + + DatabaseIO *DynamicTopologyStateLocator::get_database() const { return m_database; } + + std::tuple + DynamicTopologyStateLocator::locate_db_state(double targetTime) const + { + auto db = get_database(); + DatabaseState loc(db); + + locate_db_state_impl(targetTime, loc); + + return std::make_tuple(loc.changeSet, loc.state, loc.time); + } + + std::tuple DynamicTopologyStateLocator::get_db_max_time() const + { + auto db = get_database(); + DatabaseState loc(db); + + double init_time = -std::numeric_limits::max(); + StateLocatorCompare compare = [](double a, double b) { return (a > b); }; + + get_db_time_impl(init_time, compare, loc); + + return std::make_tuple(loc.changeSet, loc.state, loc.time); + } + + std::tuple DynamicTopologyStateLocator::get_db_min_time() const + { + auto db = get_database(); + DatabaseState loc(db); + + double init_time = std::numeric_limits::max(); + StateLocatorCompare compare = [](double a, double b) { return (a < b); }; + + get_db_time_impl(init_time, compare, loc); + + return std::make_tuple(loc.changeSet, loc.state, loc.time); + } + + void DynamicTopologyStateLocator::locate_state_impl(Ioss::DatabaseIO *db, double targetTime, + StateLocatorCompare comparator, + DatabaseState &loc) const + { + std::vector timesteps = db->get_db_step_times(); + size_t stepCount = timesteps.size(); + + double minTimeDiff = + loc.state < 0 ? std::numeric_limits::max() : std::fabs(loc.time - targetTime); + + for (size_t istep = 1; istep <= stepCount; istep++) { + double stateTime = timesteps[istep - 1]; + double stepTimeDiff = std::fabs(stateTime - targetTime); + if (comparator(stepTimeDiff, minTimeDiff)) { + minTimeDiff = stepTimeDiff; + loc.time = stateTime; + loc.state = static_cast(istep); + loc.changeSet = db->supports_internal_change_set() ? db->get_internal_change_set_name() + : db->get_filename(); + } + } + } + + void DynamicTopologyStateLocator::locate_state(Ioss::DatabaseIO *db, double targetTime, + DatabaseState &loc) const + { + if (targetTime < 0.0) { + // Round towards 0 + StateLocatorCompare compare = [](double a, double b) { return (a <= b); }; + locate_state_impl(db, targetTime, compare, loc); + } + else { + // Round towards 0 + StateLocatorCompare compare = [](double a, double b) { return (a < b); }; + locate_state_impl(db, targetTime, compare, loc); + } + } + + void DynamicTopologyStateLocator::locate_db_state_impl(double targetTime, + DatabaseState &loc) const + { + auto changeSet = + Ioss::ChangeSetFactory::create(m_database, m_ioDB, m_dbType, m_fileCyclicCount); + changeSet->populate_change_sets(m_loadAllFiles); + + for (size_t csIndex = 0; csIndex < changeSet->size(); csIndex++) { + auto csdb = changeSet->open_change_set(csIndex, Ioss::QUERY_TIMESTEPS_ONLY); + locate_state(csdb, targetTime, loc); + changeSet->close_change_set(csIndex); + } + } + + void DynamicTopologyStateLocator::get_db_time_impl(double init_time, + StateLocatorCompare comparator, + DatabaseState &loc) const + { + auto changeSet = + Ioss::ChangeSetFactory::create(m_database, m_ioDB, m_dbType, m_fileCyclicCount); + changeSet->populate_change_sets(m_loadAllFiles); + + double best_time = init_time; + + for (size_t csIndex = 0; csIndex < changeSet->size(); csIndex++) { + auto csdb = changeSet->open_change_set(csIndex, Ioss::QUERY_TIMESTEPS_ONLY); + + std::vector timesteps = csdb->get_db_step_times(); + int stepCount = static_cast(timesteps.size()); + + for (int i = 1; i <= stepCount; i++) { + if (comparator(timesteps[i - 1], best_time)) { + loc.time = timesteps[i - 1]; + loc.state = i; + loc.changeSet = changeSet->get_change_set_name(csIndex); + best_time = timesteps[i - 1]; + } + } + + changeSet->close_change_set(csIndex); + } + } + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.h b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.h new file mode 100644 index 000000000000..f62f79cddce5 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_DynamicTopologyStateLocator.h @@ -0,0 +1,84 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_DynamicTopology.h" + +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" +#include "Ioss_DatabaseIO.h" // for DatabaseIO +#include "Ioss_ParallelUtils.h" // for ParallelUtils +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Utils.h" +#include "ioss_export.h" + +#include // for size_t, nullptr +#include // for int64_t +#include +#include +#include // for string, operator< + +namespace Ioss { + class Region; + + class IOSS_EXPORT DynamicTopologyStateLocator + { + public: + DynamicTopologyStateLocator(Region *region, bool loadAllFiles = true); + DynamicTopologyStateLocator(Ioss::DatabaseIO *db, const std::string &dbName, + const std::string &dbType, unsigned fileCyclicCount = 0, + bool loadAllFiles = true); + DynamicTopologyStateLocator(Ioss::DatabaseIO *db, unsigned fileCyclicCount = 0, + bool loadAllFiles = true); + + virtual ~DynamicTopologyStateLocator(); + DynamicTopologyStateLocator() = delete; + DynamicTopologyStateLocator(const DynamicTopologyStateLocator &) = delete; + + DatabaseIO *get_database() const; + + std::tuple locate_db_state(double targetTime) const; + std::tuple get_db_min_time() const; + std::tuple get_db_max_time() const; + + private: + struct DatabaseState + { + explicit DatabaseState(Ioss::DatabaseIO *db) + { + if (!db->supports_internal_change_set()) { + changeSet = db->get_filename(); + } + } + + std::string changeSet{"/"}; + int state{-1}; + double time{-std::numeric_limits::max()}; + }; + + using StateLocatorCompare = std::function; + + void locate_state_impl(Ioss::DatabaseIO *db, double targetTime, StateLocatorCompare comparator, + DatabaseState &loc) const; + + void locate_state(Ioss::DatabaseIO *db, double targetTime, DatabaseState &loc) const; + + void locate_db_state_impl(double targetTime, DatabaseState &loc) const; + + void get_db_time_impl(double init_time, StateLocatorCompare comparator, + DatabaseState &loc) const; + + IOSS_NODISCARD const ParallelUtils &util() const; + + Ioss::DatabaseIO *m_database{nullptr}; + std::string m_ioDB; + std::string m_dbType; + unsigned m_fileCyclicCount{0}; + bool m_loadAllFiles{true}; + }; + +} // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_Field.C b/packages/seacas/libraries/ioss/src/Ioss_Field.C index 0e0b33a8bee4..2eb5b797c29d 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Field.C +++ b/packages/seacas/libraries/ioss/src/Ioss_Field.C @@ -10,6 +10,7 @@ #include "Ioss_VariableType.h" #include #include +#include #include #include #include diff --git a/packages/seacas/libraries/ioss/src/Ioss_GroupingEntity.h b/packages/seacas/libraries/ioss/src/Ioss_GroupingEntity.h index e6123be18c85..d8fa459f6af2 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_GroupingEntity.h +++ b/packages/seacas/libraries/ioss/src/Ioss_GroupingEntity.h @@ -161,20 +161,19 @@ namespace Ioss { // ======================================================================== // Property-related information.... // Just forward it through to the property manager... - inline void property_add(const Property &new_prop); - inline void property_erase(const std::string &property_name); - IOSS_NODISCARD inline bool property_exists(const std::string &property_name) const; - IOSS_NODISCARD inline Property get_property(const std::string &property_name) const; - IOSS_NODISCARD inline int64_t get_optional_property(const std::string &property, - int64_t optional_value) const; - IOSS_NODISCARD inline std::string - get_optional_property(const std::string &property_name, - const std::string &optional_value) const; - IOSS_NODISCARD inline NameList property_describe() const; - inline int property_describe(NameList *names) const; - IOSS_NODISCARD inline NameList property_describe(Ioss::Property::Origin origin) const; - inline int property_describe(Ioss::Property::Origin origin, NameList *names) const; - IOSS_NODISCARD inline size_t property_count() const; + void property_add(const Property &new_prop); + void property_erase(const std::string &property_name); + IOSS_NODISCARD bool property_exists(const std::string &property_name) const; + IOSS_NODISCARD Property get_property(const std::string &property_name) const; + IOSS_NODISCARD int64_t get_optional_property(const std::string &property, + int64_t optional_value) const; + IOSS_NODISCARD std::string get_optional_property(const std::string &property_name, + const std::string &optional_value) const; + IOSS_NODISCARD NameList property_describe() const; + int property_describe(NameList *names) const; + IOSS_NODISCARD NameList property_describe(Ioss::Property::Origin origin) const; + int property_describe(Ioss::Property::Origin origin, NameList *names) const; + IOSS_NODISCARD size_t property_count() const; /** Add a property, or change its value if it already exists with a different value */ void property_update(const std::string &property, int64_t value) const; @@ -184,18 +183,18 @@ namespace Ioss { // FIELDS // ======================================================================== // Just forward these through to the field manager... - void field_add(Field new_field); - inline void field_erase(const std::string &field_name); - inline void field_erase(Field::RoleType role); - IOSS_NODISCARD inline bool field_exists(const std::string &field_name) const; - IOSS_NODISCARD inline Field get_field(const std::string &field_name) const; - IOSS_NODISCARD inline const Field &get_fieldref(const std::string &field_name) const; - inline int field_describe(NameList *names) const; - IOSS_NODISCARD inline NameList field_describe() const; - inline int field_describe(Field::RoleType role, NameList *names) const; - IOSS_NODISCARD inline NameList field_describe(Field::RoleType role) const; - IOSS_NODISCARD inline size_t field_count() const; - IOSS_NODISCARD size_t field_count(Field::RoleType role) const; + void field_add(Field new_field); + void field_erase(const std::string &field_name); + void field_erase(Field::RoleType role); + IOSS_NODISCARD bool field_exists(const std::string &field_name) const; + IOSS_NODISCARD Field get_field(const std::string &field_name) const; + IOSS_NODISCARD const Field &get_fieldref(const std::string &field_name) const; + int field_describe(NameList *names) const; + IOSS_NODISCARD NameList field_describe() const; + int field_describe(Field::RoleType role, NameList *names) const; + IOSS_NODISCARD NameList field_describe(Field::RoleType role) const; + IOSS_NODISCARD size_t field_count() const; + IOSS_NODISCARD size_t field_count(Field::RoleType role) const; IOSS_NODISCARD bool check_for_duplicate(const Ioss::Field &new_field) const; diff --git a/packages/seacas/libraries/ioss/src/Ioss_MeshCopyOptions.h b/packages/seacas/libraries/ioss/src/Ioss_MeshCopyOptions.h index 8130a4aedb05..25681acc321f 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_MeshCopyOptions.h +++ b/packages/seacas/libraries/ioss/src/Ioss_MeshCopyOptions.h @@ -15,6 +15,7 @@ namespace Ioss { { std::vector selected_times{}; std::vector omitted_sets{}; + std::string selected_change_sets{}; double minimum_time{0.0}; double maximum_time{0.0}; double delay{0.0}; diff --git a/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.C b/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.C index 47938091e241..02fe4dd06a42 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.C +++ b/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.C @@ -598,7 +598,7 @@ void Ioss::ParallelUtils::all_gather(std::vector &my_values, std::vector & #endif } -void Ioss::ParallelUtils::progress(const std::string &output) const +void Ioss::ParallelUtils::progress(std::string_view output) const { static double begin = Utils::timer(); diff --git a/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.h b/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.h index 24cc545535bd..916e4214d0ae 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.h +++ b/packages/seacas/libraries/ioss/src/Ioss_ParallelUtils.h @@ -143,7 +143,7 @@ namespace Ioss { template void broadcast(T &my_value, int root = 0) const; template void broadcast(std::vector &my_value, int root = 0) const; - void progress(const std::string &output) const; + void progress(std::string_view output) const; private: Ioss_MPI_Comm communicator_{comm_world()}; diff --git a/packages/seacas/libraries/ioss/src/Ioss_Region.C b/packages/seacas/libraries/ioss/src/Ioss_Region.C index 9c9c60607f9a..ef185f566bd0 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Region.C +++ b/packages/seacas/libraries/ioss/src/Ioss_Region.C @@ -11,6 +11,8 @@ #include "Ioss_CoordinateFrame.h" #include "Ioss_DBUsage.h" #include "Ioss_DatabaseIO.h" +#include "Ioss_DynamicTopologyFileControl.h" +#include "Ioss_DynamicTopologyStateLocator.h" #include "Ioss_EdgeBlock.h" #include "Ioss_EdgeSet.h" #include "Ioss_ElementBlock.h" @@ -308,6 +310,7 @@ namespace { entity->field_erase(role); } } + } // namespace namespace Ioss { @@ -366,7 +369,8 @@ namespace Ioss { properties.add(Property(this, "current_state", Property::INTEGER)); properties.add(Property(this, "database_name", Property::STRING)); - property_add(Property("base_filename", iodatabase->get_filename())); + property_add(Property("base_filename", iodatabase->get_property_manager().get_optional( + "base_filename", iodatabase->get_filename()))); property_add(Property("database_type", iodatabase->get_property_manager().get_optional("database_type", ""))); } @@ -383,13 +387,13 @@ namespace Ioss { // Region owns the database pointer even though other entities use it. GroupingEntity::really_delete_database(); + + if (topologyObserver) { + topologyObserver->register_region(nullptr); + } } catch (...) { } - - if(topologyObserver) { - topologyObserver->register_region(nullptr); - } } void Region::reset_region() @@ -469,6 +473,8 @@ namespace Ioss { // Ioex:DatabaseIO::read_communication_metadata() adds comm fields that need to be cleared erase_fields(Field::COMMUNICATION); + + aliases_.clear(); } void Region::delete_database() { GroupingEntity::really_delete_database(); } @@ -588,11 +594,20 @@ namespace Ioss { int num_width = Ioss::Utils::number_width(max_entity, true) + 2; int sb_width = Ioss::Utils::number_width(max_sb, true) + 2; + int change_set_count = get_database()->num_internal_change_set(); + auto change_set_name = get_internal_change_set_name(); + if (!change_set_name.empty() && change_set_name != "/") { + change_set_name = ",\t[CS: " + change_set_name + "]"; + } + else { + change_set_name.clear(); + } + // clang-format off fmt::print( strm, - "\n Database: {0}\n" - " Mesh Type = {1}, {39}\n" + "\n Database: {0}{56}\n" + " Mesh Type = {1}, {39}. Change Sets = {57}\n" " {38:{24}s}\t {38:{23}s}\t Variables : Transient / Reduction\n" " Spatial dimensions = {2:{24}}\t {38:{23}s}\t Global = {26:{25}}\t{44:{25}}\n" " Node blocks = {7:{24}}\t Nodes = {3:{23}}\t Nodal = {27:{25}}\t{45:{25}}\n" @@ -608,7 +623,7 @@ namespace Ioss { " Assemblies = {40:{24}}\t {38:{23}s}\t Assembly = {41:{25}}\t{54:{25}}\n" " Blobs = {42:{24}}\t {38:{23}s}\t Blob = {43:{25}}\t{55:{25}}\n\n" " Time steps = {32:{24}}\n", - get_database()->get_filename(), mesh_type_string(), + get_database()->get_filename(), mesh_type_string(), /* 0, 1 */ fmt::group_digits(get_property("spatial_dimension").get_int()), fmt::group_digits(get_property("node_count").get_int()), fmt::group_digits(get_property("edge_count").get_int()), @@ -617,7 +632,7 @@ namespace Ioss { fmt::group_digits(get_property("node_block_count").get_int()), fmt::group_digits(get_property("edge_block_count").get_int()), fmt::group_digits(get_property("face_block_count").get_int()), - fmt::group_digits(get_property("element_block_count").get_int()), + fmt::group_digits(get_property("element_block_count").get_int()), /* 10 */ fmt::group_digits(get_property("structured_block_count").get_int()), fmt::group_digits(get_property("node_set_count").get_int()), fmt::group_digits(get_property("edge_set_count").get_int()), @@ -627,7 +642,7 @@ namespace Ioss { fmt::group_digits(total_cells), fmt::group_digits(total_ns_nodes), fmt::group_digits(total_es_edges), - fmt::group_digits(total_fs_faces), + fmt::group_digits(total_fs_faces), /* 20 */ fmt::group_digits(total_es_elements), fmt::group_digits(total_sides), num_width, @@ -637,7 +652,7 @@ namespace Ioss { fmt::group_digits(num_nod_vars), fmt::group_digits(num_ele_vars), fmt::group_digits(num_str_vars), - fmt::group_digits(num_ns_vars), + fmt::group_digits(num_ns_vars), /* 30 */ fmt::group_digits(num_ss_vars), fmt::group_digits(num_ts), fmt::group_digits(num_edg_vars), @@ -647,8 +662,8 @@ namespace Ioss { fmt::group_digits(num_els_vars), " ", get_database()->get_format(), - fmt::group_digits(get_property("assembly_count").get_int()), - fmt::group_digits(num_asm_vars) , + fmt::group_digits(get_property("assembly_count").get_int()), /* 40 */ + fmt::group_digits(num_asm_vars), fmt::group_digits(get_property("blob_count").get_int()), fmt::group_digits(num_blob_vars), fmt::group_digits(num_glo_red_vars), @@ -657,12 +672,13 @@ namespace Ioss { fmt::group_digits(num_fac_red_vars), fmt::group_digits(num_ele_red_vars), fmt::group_digits(num_str_red_vars), - fmt::group_digits(num_ns_red_vars), + fmt::group_digits(num_ns_red_vars), /* 50 */ fmt::group_digits(num_es_red_vars), fmt::group_digits(num_fs_red_vars), fmt::group_digits(num_els_red_vars), fmt::group_digits(num_asm_red_vars), - fmt::group_digits(num_blob_red_vars)); + fmt::group_digits(num_blob_red_vars), + change_set_name, change_set_count); // clang-format on } @@ -709,12 +725,12 @@ namespace Ioss { bool has_output_observer = topologyObserver && !get_database()->is_input(); if (new_state == STATE_DEFINE_MODEL) { - if (has_output_observer && - (topologyObserver->get_control_option() == FileControlOption::CONTROL_AUTO_GROUP_FILE)) { + if (has_output_observer && (topologyObserver->get_control_option() == + FileControlOption::CONTROL_AUTO_GROUP_FILE)) { if (!fileGroupsStarted) { int steps = get_property("state_count").get_int(); bool force_addition = true; - add_output_database_group(steps, force_addition); + add_output_database_change_set(steps, force_addition); fileGroupsStarted = true; } @@ -893,6 +909,11 @@ namespace Ioss { } } + if (get_state() == STATE_TRANSIENT) { + // Makes sure we return proper stateCount in case of dynamic topology changes + update_dynamic_topology(); + } + if (get_database()->is_input() || get_database()->usage() == WRITE_RESULTS || get_database()->usage() == WRITE_RESTART) { stateTimes.push_back(time); @@ -2072,7 +2093,6 @@ namespace Ioss { */ NodeBlock *Region::get_node_block(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, NODEBLOCK); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2093,7 +2113,6 @@ namespace Ioss { */ EdgeBlock *Region::get_edge_block(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, EDGEBLOCK); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2114,7 +2133,6 @@ namespace Ioss { */ FaceBlock *Region::get_face_block(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, FACEBLOCK); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2135,7 +2153,6 @@ namespace Ioss { */ ElementBlock *Region::get_element_block(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, ELEMENTBLOCK); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2156,7 +2173,6 @@ namespace Ioss { */ StructuredBlock *Region::get_structured_block(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, STRUCTUREDBLOCK); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2177,7 +2193,6 @@ namespace Ioss { */ SideSet *Region::get_sideset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, SIDESET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2198,7 +2213,6 @@ namespace Ioss { */ SideBlock *Region::get_sideblock(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); SideBlock *ge = nullptr; for (const auto &ss : sideSets) { ge = ss->get_side_block(my_name); @@ -2216,7 +2230,6 @@ namespace Ioss { */ NodeSet *Region::get_nodeset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, NODESET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2237,7 +2250,6 @@ namespace Ioss { */ EdgeSet *Region::get_edgeset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, EDGESET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2258,7 +2270,6 @@ namespace Ioss { */ FaceSet *Region::get_faceset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, FACESET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2279,7 +2290,6 @@ namespace Ioss { */ ElementSet *Region::get_elementset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, ELEMENTSET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2300,7 +2310,6 @@ namespace Ioss { */ CommSet *Region::get_commset(const std::string &my_name) const { - IOSS_FUNC_ENTER(m_); const std::string db_name = get_alias_nl(my_name, COMMSET); unsigned int db_hash = Ioss::Utils::hash(db_name); @@ -2321,7 +2330,6 @@ namespace Ioss { */ const CoordinateFrame &Region::get_coordinate_frame(int64_t id) const { - IOSS_FUNC_ENTER(m_); for (const auto &coor_frame : coordinateFrames) { if (coor_frame.id() == id) { return coor_frame; @@ -2852,13 +2860,13 @@ namespace Ioss { case FileControlOption::CONTROL_AUTO_MULTI_FILE: clone_and_replace_output_database(steps); break; - case FileControlOption::CONTROL_AUTO_GROUP_FILE: add_output_database_group(steps); break; + case FileControlOption::CONTROL_AUTO_GROUP_FILE: add_output_database_change_set(steps); break; case FileControlOption::CONTROL_NONE: default: return; break; } } - void Region::add_output_database_group(int steps, bool force_addition) + void Region::add_output_database_change_set(int steps, bool force_addition) { if (get_database()->is_input()) return; @@ -2894,10 +2902,14 @@ namespace Ioss { state++; // For the state we are going to write. - reset_region(); - DynamicTopologyFileControl fileControl(this, fileCyclicCount, ifDatabaseExists, - dbChangeCount); - fileControl.add_output_database_group(state); + topologyObserver->initialize_region(); + + DynamicTopologyFileControl fileControl(this); + fileControl.add_output_database_change_set(state); + + // Reset based on fileControl values + dbChangeCount = fileControl.get_topology_change_count(); + ifDatabaseExists = fileControl.get_if_database_exists_behavior(); } } @@ -2933,59 +2945,57 @@ namespace Ioss { state++; // For the state we are going to write. - reset_region(); - DynamicTopologyFileControl fileControl(this, fileCyclicCount, ifDatabaseExists, - dbChangeCount); + topologyObserver->initialize_region(); + + DynamicTopologyFileControl fileControl(this); fileControl.clone_and_replace_output_database(state); + + // Reset based on fileControl values + dbChangeCount = fileControl.get_topology_change_count(); + ifDatabaseExists = fileControl.get_if_database_exists_behavior(); } } void Region::reset_topology_modification() { - if(topologyObserver) { + if (topologyObserver) { topologyObserver->reset_topology_modification(); } } void Region::set_topology_modification(unsigned int type) { - if(topologyObserver) { + if (topologyObserver) { topologyObserver->set_topology_modification(type); } } unsigned int Region::get_topology_modification() const { - if(topologyObserver) { + if (topologyObserver) { return topologyObserver->get_topology_modification(); } return TOPOLOGY_SAME; } - bool Region::load_group_mesh(const std::string &child_group_name) + bool Region::load_internal_change_set_mesh(const std::string &set_name) { - // Check name for '/' which is not allowed since it is the - // separator character in a full group path - if (child_group_name.find('/') != std::string::npos) { - std::ostringstream errmsg; - fmt::print(errmsg, "ERROR: Invalid group name '{}' contains a '/' which is not allowed.\n", - child_group_name); - IOSS_ERROR(errmsg); - } - DatabaseIO *iodatabase = get_database(); if (!iodatabase->is_input()) return false; - if (!iodatabase->open_root_group()) + if (!iodatabase->open_internal_change_set(set_name)) return false; - if (!iodatabase->open_group(child_group_name)) - return false; + if (topologyObserver) { + topologyObserver->initialize_region(); + } + else { + reset_region(); + } - reset_region(); iodatabase->release_memory(); Region::set_state(STATE_CLOSED); @@ -3005,20 +3015,23 @@ namespace Ioss { return true; } - bool Region::load_group_mesh(const int child_group_index) + bool Region::load_internal_change_set_mesh(const int child_group_index) { DatabaseIO *iodatabase = get_database(); if (!iodatabase->is_input()) return false; - if (!iodatabase->open_root_group()) + if (!iodatabase->open_internal_change_set(child_group_index)) return false; - if (!iodatabase->open_child_group(child_group_index)) - return false; + if (topologyObserver) { + topologyObserver->initialize_region(); + } + else { + reset_region(); + } - reset_region(); iodatabase->release_memory(); Region::set_state(STATE_CLOSED); @@ -3040,19 +3053,59 @@ namespace Ioss { void Region::update_dynamic_topology() { - auto topology_observer = get_mesh_modification_observer(); - - bool has_output_observer = topology_observer && !get_database()->is_input(); - if (has_output_observer && topology_observer->is_topology_modified()) { - if(topology_observer->get_control_option() != FileControlOption::CONTROL_NONE) { + bool has_output_observer = topologyObserver && !get_database()->is_input(); + if (has_output_observer && topologyObserver->needs_new_output_file()) { + if (topologyObserver->get_control_option() != FileControlOption::CONTROL_NONE) { int steps = get_property("state_count").get_int(); start_new_output_database_entry(steps); - topology_observer->define_model(); - topology_observer->write_model(); - topology_observer->define_transient(); + topologyObserver->define_model(); + topologyObserver->write_model(); + topologyObserver->define_transient(); } topologyObserver->reset_topology_modification(); } } + + std::string Region::get_internal_change_set_name() const + { + return get_database()->get_internal_change_set_name(); + } + + std::tuple Region::locate_db_state(double targetTime) const + { + auto *cregion = const_cast(this); + DynamicTopologyStateLocator locator(cregion); + + return locator.locate_db_state(targetTime); + } + + std::tuple Region::get_db_max_time() const + { + IOSS_FUNC_ENTER(m_); + auto db = get_database(); + if (!db->is_input() && db->usage() != WRITE_RESULTS && db->usage() != WRITE_RESTART) { + return std::make_tuple(get_internal_change_set_name(), currentState, stateTimes[0]); + } + + auto *cregion = const_cast(this); + DynamicTopologyStateLocator locator(cregion); + + return locator.get_db_max_time(); + } + + std::tuple Region::get_db_min_time() const + { + IOSS_FUNC_ENTER(m_); + auto db = get_database(); + if (!db->is_input() && db->usage() != WRITE_RESULTS && db->usage() != WRITE_RESTART) { + return std::make_tuple(get_internal_change_set_name(), currentState, stateTimes[0]); + } + + auto *cregion = const_cast(this); + DynamicTopologyStateLocator locator(cregion); + + return locator.get_db_min_time(); + } + } // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_Region.h b/packages/seacas/libraries/ioss/src/Ioss_Region.h index be488194309d..c924ec1f9373 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Region.h +++ b/packages/seacas/libraries/ioss/src/Ioss_Region.h @@ -10,6 +10,7 @@ #include "Ioss_DBUsage.h" #include "Ioss_DatabaseIO.h" // for DatabaseIO #include "Ioss_DynamicTopology.h" +#include "Ioss_DynamicTopologyObserver.h" #include "Ioss_EntityType.h" // for EntityType, etc #include "Ioss_Field.h" #include "Ioss_GroupingEntity.h" // for GroupingEntity @@ -29,7 +30,8 @@ #include // for map, map<>::value_compare #include #include -#include // for string, operator< +#include // for string, operator< +#include #include // for pair #include // for vector @@ -152,12 +154,22 @@ namespace Ioss { // on the database if cycle and overlay are being used. IOSS_NODISCARD std::pair get_max_time() const; + // Return a tuple consisting of the step (1-based) corresponding to + // the maximum time across all change sets on the database, the corresponding + // maximum time value and the corresponding set. + IOSS_NODISCARD std::tuple get_db_max_time() const; + // Return a pair consisting of the step (1-based) corresponding to // the minimum time on the database and the corresponding minimum // time value. Note that this may not necessarily be the first step // on the database if cycle and overlay are being used. IOSS_NODISCARD std::pair get_min_time() const; + // Return a tuple consisting of the step (1-based) corresponding to + // the minimum time across all change sets on the database, the corresponding + // minimum time value and the corresponding set. + IOSS_NODISCARD std::tuple get_db_min_time() const; + // Functions for an output region... bool add(NodeBlock *node_block); bool add(EdgeBlock *edge_block); @@ -282,38 +294,48 @@ namespace Ioss { std::vector &field_data) const; void register_mesh_modification_observer(std::shared_ptr observer); - std::shared_ptr get_mesh_modification_observer() const + IOSS_NODISCARD std::shared_ptr get_mesh_modification_observer() const { return topologyObserver; } - void reset_topology_modification(); - void set_topology_modification(unsigned int type); - unsigned int get_topology_modification() const; + void reset_topology_modification(); + void set_topology_modification(unsigned int type); + IOSS_NODISCARD unsigned int get_topology_modification() const; void start_new_output_database_entry(int steps = 0); - void set_topology_change_count(unsigned int new_count) { dbChangeCount = new_count; } - unsigned int get_topology_change_count() { return dbChangeCount; } + void set_topology_change_count(unsigned int new_count) { dbChangeCount = new_count; } + IOSS_NODISCARD unsigned int get_topology_change_count() const { return dbChangeCount; } - void set_file_cyclic_count(unsigned int new_count) { fileCyclicCount = new_count; } - unsigned int get_file_cyclic_count() { return fileCyclicCount; } + void set_file_cyclic_count(unsigned int new_count) { fileCyclicCount = new_count; } + IOSS_NODISCARD unsigned int get_file_cyclic_count() const { return fileCyclicCount; } void set_if_database_exists_behavior(IfDatabaseExistsBehavior if_exists) { ifDatabaseExists = if_exists; } + IOSS_NODISCARD IfDatabaseExistsBehavior get_if_database_exists_behavior() const + { + return ifDatabaseExists; + } + + IOSS_NODISCARD bool model_is_written() const { return modelWritten; } + IOSS_NODISCARD bool transient_is_written() const { return transientWritten; } - bool model_is_written() const { return modelWritten; } - bool transient_is_written() const { return transientWritten; } + IOSS_NODISCARD bool load_internal_change_set_mesh(const std::string &set_name); + IOSS_NODISCARD bool load_internal_change_set_mesh(const int set_index); - bool load_group_mesh(const std::string &child_group_name); - bool load_group_mesh(const int child_group_index); + IOSS_NODISCARD std::tuple locate_db_state(double targetTime) const; + + // Reinitialize region data structures + void reset_region(); protected: - void update_dynamic_topology(); - void clone_and_replace_output_database(int steps = 0); - void add_output_database_group(int steps = 0, bool force_addition = false); + std::string get_internal_change_set_name() const; + void update_dynamic_topology(); + void clone_and_replace_output_database(int steps = 0); + void add_output_database_change_set(int steps = 0, bool force_addition = false); int64_t internal_get_field_data(const Field &field, void *data, size_t data_size = 0) const override; @@ -340,7 +362,6 @@ namespace Ioss { bool end_mode_nl(State current_state); void delete_database() override; - void reset_region(); mutable std::map aliases_; ///< Stores alias mappings @@ -378,7 +399,6 @@ namespace Ioss { bool modelWritten{false}; bool transientWritten{false}; bool fileGroupsStarted{false}; - }; } // namespace Ioss @@ -481,10 +501,12 @@ namespace Ioss { if (found && field.get_role() != role) { std::ostringstream errmsg; + // Would be nice to use fmt:: here, but we need to avoid using fmt includes in public + // headers... errmsg << "ERROR: Field " << field.get_name() << " with role " << field.role_string() << " on entity " << entity->name() << " does not match previously found role " - << Ioss::Field::role_string(role) << ".\n", - IOSS_ERROR(errmsg); + << Ioss::Field::role_string(role) << ".\n"; + IOSS_ERROR(errmsg); } found = true; diff --git a/packages/seacas/libraries/ioss/src/Ioss_StructuredBlock.C b/packages/seacas/libraries/ioss/src/Ioss_StructuredBlock.C index 7c8891124a27..de43f983ca8f 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_StructuredBlock.C +++ b/packages/seacas/libraries/ioss/src/Ioss_StructuredBlock.C @@ -540,14 +540,18 @@ namespace Ioss { { auto lhzc = this->m_zoneConnectivity; auto rhzc = rhs.m_zoneConnectivity; - Ioss::sort(lhzc.begin(), lhzc.end(), [](const ZoneConnectivity &l, const ZoneConnectivity &r) { - return l.m_connectionName < r.m_connectionName;}); - Ioss::sort(rhzc.begin(), rhzc.end(), [](const ZoneConnectivity &l, const ZoneConnectivity &r) { - return l.m_connectionName < r.m_connectionName;}); + Ioss::sort(lhzc.begin(), lhzc.end(), + [](const ZoneConnectivity &l, const ZoneConnectivity &r) { + return l.m_connectionName < r.m_connectionName; + }); + Ioss::sort(rhzc.begin(), rhzc.end(), + [](const ZoneConnectivity &l, const ZoneConnectivity &r) { + return l.m_connectionName < r.m_connectionName; + }); if (!vec_equal(lhzc, rhzc)) { - fmt::print(Ioss::OUTPUT(), "StructuredBlock: Zone Connectivity mismatch (size {} vs {})\n", - this->m_zoneConnectivity.size(), rhs.m_zoneConnectivity.size()); - same = false; + fmt::print(Ioss::OUTPUT(), "StructuredBlock: Zone Connectivity mismatch (size {} vs {})\n", + this->m_zoneConnectivity.size(), rhs.m_zoneConnectivity.size()); + same = false; } } @@ -558,13 +562,17 @@ namespace Ioss { { auto lhbc = this->m_boundaryConditions; auto rhbc = rhs.m_boundaryConditions; - Ioss::sort(lhbc.begin(), lhbc.end(), [](const BoundaryCondition &l, const BoundaryCondition &r) { - return l.m_bcName < r.m_bcName;}); - Ioss::sort(rhbc.begin(), rhbc.end(), [](const BoundaryCondition &l, const BoundaryCondition &r) { - return l.m_bcName < r.m_bcName;}); + Ioss::sort(lhbc.begin(), lhbc.end(), + [](const BoundaryCondition &l, const BoundaryCondition &r) { + return l.m_bcName < r.m_bcName; + }); + Ioss::sort(rhbc.begin(), rhbc.end(), + [](const BoundaryCondition &l, const BoundaryCondition &r) { + return l.m_bcName < r.m_bcName; + }); if (!vec_equal(lhbc, rhbc)) { - fmt::print(Ioss::OUTPUT(), "StructuredBlock: Boundary Conditions mismatch\n"); - same = false; + fmt::print(Ioss::OUTPUT(), "StructuredBlock: Boundary Conditions mismatch\n"); + same = false; } } diff --git a/packages/seacas/libraries/ioss/src/Ioss_Utils.C b/packages/seacas/libraries/ioss/src/Ioss_Utils.C index 6c3dc62d5623..54c7e3f92c16 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Utils.C +++ b/packages/seacas/libraries/ioss/src/Ioss_Utils.C @@ -49,6 +49,7 @@ #include "Ioss_State.h" #include "Ioss_Utils.h" #include "Ioss_VariableType.h" +#include "Ioss_use_fmt.h" #if defined(__IOSS_WINDOWS__) #include @@ -172,6 +173,23 @@ void Ioss::Utils::time_and_date(char *time_string, char *date_string, size_t len copy_string(date_string, date, length + 1); } +bool Ioss::Utils::check_valid_change_set_name(const std::string &cs_name, + const Ioss::Region ®ion, int rank) +{ + auto cs_names = region.get_database()->internal_change_set_describe(); + auto it = std::find(cs_names.cbegin(), cs_names.cend(), cs_name); + if (it == cs_names.cend()) { + if (rank == 0) { + fmt::print(stderr, + "ERROR: Change set {}, not found in database {}. Valid change sets are:\n" + " {}\n", + cs_name, region.get_database()->get_filename(), fmt::join(cs_names, ", ")); + } + return false; + } + return true; +} + void Ioss::Utils::check_non_null(void *ptr, const char *type, const std::string &name, const std::string &func) { @@ -366,7 +384,7 @@ std::string Ioss::Utils::local_filename(const std::string &relative_filename, } int Ioss::Utils::field_warning(const Ioss::GroupingEntity *ge, const Ioss::Field &field, - const std::string &inout) + std::string_view inout) { if (field.get_name() != "ids") { fmt::print(Ioss::WarnOut(), "{} '{}'. Unknown {} field '{}'\n", ge->type_string(), ge->name(), @@ -939,12 +957,10 @@ void Ioss::Utils::calculate_sideblock_membership(IntVector &face_is_ } } -int64_t Ioss::Utils::get_side_offset(const Ioss::SideBlock *sb) +int64_t Ioss::Utils::get_side_offset(const Ioss::ElementTopology *parent_topo, + const Ioss::ElementTopology *side_topo) { - - const Ioss::ElementTopology *side_topo = sb->topology(); - const Ioss::ElementTopology *parent_topo = sb->parent_element_topology(); - int64_t side_offset = 0; + int64_t side_offset = 0; if ((side_topo != nullptr) && (parent_topo != nullptr)) { int side_topo_dim = side_topo->parametric_dimension(); int elem_topo_dim = parent_topo->parametric_dimension(); @@ -957,6 +973,13 @@ int64_t Ioss::Utils::get_side_offset(const Ioss::SideBlock *sb) return side_offset; } +int64_t Ioss::Utils::get_side_offset(const Ioss::SideBlock *sb) +{ + const Ioss::ElementTopology *side_topo = sb->topology(); + const Ioss::ElementTopology *parent_topo = sb->parent_element_topology(); + return get_side_offset(parent_topo, side_topo); +} + std::string Ioss::Utils::shape_to_string(const Ioss::ElementShape &shape) { switch (shape) { @@ -1358,7 +1381,7 @@ void Ioss::Utils::info_fields(const Ioss::GroupingEntity *ige, Ioss::Field::Role // Iterate through results fields. Get max width of a name... size_t max_width = 0; for (const auto &field_name : fields) { - max_width = max_width > field_name.length() ? max_width : field_name.length(); + max_width = std::max(max_width, field_name.length()); } size_t width = Ioss::Utils::term_width(); @@ -1366,10 +1389,15 @@ void Ioss::Utils::info_fields(const Ioss::GroupingEntity *ige, Ioss::Field::Role if (!header.empty()) { cur_out = header.size() + suffix.size() + 16; // Assume 2 tabs... } + for (const auto &field_name : fields) { if (detail) { const auto &field_ref = ige->get_fieldref(field_name); +#if defined(__NVCC__) std::cout << field_ref << suffix; +#else + fmt::print("{}{}", field_ref, suffix); +#endif } else { const Ioss::VariableType *var_type = ige->get_field(field_name).raw_storage(); diff --git a/packages/seacas/libraries/ioss/src/Ioss_Utils.h b/packages/seacas/libraries/ioss/src/Ioss_Utils.h index cb623ce1c16c..e13b43dc2566 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Utils.h +++ b/packages/seacas/libraries/ioss/src/Ioss_Utils.h @@ -135,6 +135,10 @@ namespace Ioss { static void copyright(std::ostream &out, const std::string &year_range); + IOSS_NODISCARD static bool check_valid_change_set_name(const std::string &cs_name, + const Ioss::Region ®ion, + int rank = 0); + static void check_dynamic_cast(const void *ptr) { if (ptr == nullptr) { @@ -478,7 +482,7 @@ namespace Ioss { std::vector &fields); static int field_warning(const Ioss::GroupingEntity *ge, const Ioss::Field &field, - const std::string &inout); + std::string_view inout); static void calculate_sideblock_membership(IntVector &face_is_member, const SideBlock *sb, size_t int_byte_size, const void *element, @@ -500,6 +504,9 @@ namespace Ioss { * \param[in] sb Compute the offset for element sides in this SideBlock * \returns The offset. */ + IOSS_NODISCARD static int64_t get_side_offset(const Ioss::ElementTopology *parent_topo, + const Ioss::ElementTopology *side_topo); + IOSS_NODISCARD static int64_t get_side_offset(const Ioss::SideBlock *sb); IOSS_NODISCARD static unsigned int hash(const std::string &name); diff --git a/packages/seacas/libraries/ioss/src/Ioss_VariableType.h b/packages/seacas/libraries/ioss/src/Ioss_VariableType.h index 4c19e0aff989..40d0ab5495e0 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_VariableType.h +++ b/packages/seacas/libraries/ioss/src/Ioss_VariableType.h @@ -143,8 +143,8 @@ namespace Ioss { VariableType(const std::string &type, int comp_count, bool delete_me = false); private: - const std::string name_; - int componentCount; + const std::string name_{}; + int componentCount{}; static bool build_variable_type(const std::string &raw_type); }; diff --git a/packages/seacas/libraries/ioss/src/Ioss_Version.h b/packages/seacas/libraries/ioss/src/Ioss_Version.h index 5139be467445..d6c11b110e7b 100644 --- a/packages/seacas/libraries/ioss/src/Ioss_Version.h +++ b/packages/seacas/libraries/ioss/src/Ioss_Version.h @@ -6,5 +6,5 @@ #pragma once namespace Ioss { - inline const char *Version() { return "2024-03-19"; } + inline const char *Version() { return "2024-10-09"; } } // namespace Ioss diff --git a/packages/seacas/libraries/ioss/src/Ioss_use_fmt.h b/packages/seacas/libraries/ioss/src/Ioss_use_fmt.h new file mode 100644 index 000000000000..a8bf8c610896 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/Ioss_use_fmt.h @@ -0,0 +1,33 @@ +// Copyright(C) 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +// This class should be included if you want to use the lib::fmt +// output for any of the classes shown below: +// * ZoneConnectivity +// * Field +// * BoundaryCondition +#pragma once +#include + +#if FMT_VERSION >= 90000 +#include "Ioss_Field.h" +#include "Ioss_StructuredBlock.h" +#include "Ioss_ZoneConnectivity.h" + +namespace fmt { + template <> struct formatter : ostream_formatter + { + }; + + template <> struct formatter : ostream_formatter + { + }; + + template <> struct formatter : ostream_formatter + { + }; +} // namespace fmt +#endif diff --git a/packages/seacas/libraries/ioss/src/adios/AdiosWrapper.C b/packages/seacas/libraries/ioss/src/adios/AdiosWrapper.C index 6efb3353dfd2..aace3d30a646 100644 --- a/packages/seacas/libraries/ioss/src/adios/AdiosWrapper.C +++ b/packages/seacas/libraries/ioss/src/adios/AdiosWrapper.C @@ -13,13 +13,12 @@ namespace Ioad { AdiosWrapper::AdiosWrapper(Ioss_MPI_Comm comm, const std::string &filename, bool is_input, unsigned long rank, const Ioss::PropertyManager &properties) #if ADIOS2_USE_MPI - : adios2::ADIOS(comm), + : adios2::ADIOS(comm), #else - : adios2::ADIOS(), + : adios2::ADIOS(), #endif - adios2::IO(IOInit(properties, is_input)), - adios2::Engine(EngineInit(filename, is_input)), m_Rank(rank), m_Communicator(comm), - m_OpenStep(false) + adios2::IO(IOInit(properties, is_input)), adios2::Engine(EngineInit(filename, is_input)), + m_Rank(rank), m_Communicator(comm), m_OpenStep(false) { } diff --git a/packages/seacas/libraries/ioss/src/adios/Ioad_DatabaseIO.h b/packages/seacas/libraries/ioss/src/adios/Ioad_DatabaseIO.h index 54b0caef8b36..b21c65d3b32b 100644 --- a/packages/seacas/libraries/ioss/src/adios/Ioad_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/adios/Ioad_DatabaseIO.h @@ -60,18 +60,19 @@ namespace Ioad { size_t data_size) const override; int64_t get_field_internal(const Ioss::ElementBlock *eb, const Ioss::Field &field, void *data, size_t data_size) const override; - int64_t get_field_internal(const Ioss::StructuredBlock */* sb */, const Ioss::Field &/*field*/, - void */*data*/, size_t /*data_size*/) const override + int64_t get_field_internal(const Ioss::StructuredBlock * /* sb */, + const Ioss::Field & /*field*/, void * /*data*/, + size_t /*data_size*/) const override { return -1; } - int64_t get_field_internal(const Ioss::Assembly */*sb*/, const Ioss::Field &/*field*/, void */*data*/, - size_t /*data_size*/) const override + int64_t get_field_internal(const Ioss::Assembly * /*sb*/, const Ioss::Field & /*field*/, + void * /*data*/, size_t /*data_size*/) const override { return -1; } - int64_t get_field_internal(const Ioss::Blob */*sb*/, const Ioss::Field &/*field*/, void */*data*/, - size_t /*data_size*/) const override + int64_t get_field_internal(const Ioss::Blob * /*sb*/, const Ioss::Field & /*field*/, + void * /*data*/, size_t /*data_size*/) const override { return -1; } @@ -120,18 +121,18 @@ namespace Ioad { size_t data_size) const override; int64_t put_field_internal(const Ioss::CommSet *cs, const Ioss::Field &field, void *data, size_t data_size) const override; - int64_t put_field_internal(const Ioss::StructuredBlock */*sb*/, const Ioss::Field &/*field*/, - void */*data*/, size_t /*data_size*/) const override + int64_t put_field_internal(const Ioss::StructuredBlock * /*sb*/, const Ioss::Field & /*field*/, + void * /*data*/, size_t /*data_size*/) const override { return -1; } - int64_t put_field_internal(const Ioss::Assembly */*sb*/, const Ioss::Field &/*field*/, void */*data*/, - size_t /*data_size*/) const override + int64_t put_field_internal(const Ioss::Assembly * /*sb*/, const Ioss::Field & /*field*/, + void * /*data*/, size_t /*data_size*/) const override { return -1; } - int64_t put_field_internal(const Ioss::Blob */*sb*/, const Ioss::Field &/*field*/, void */*data*/, - size_t /*data_size*/) const override + int64_t put_field_internal(const Ioss::Blob * /*sb*/, const Ioss::Field & /*field*/, + void * /*data*/, size_t /*data_size*/) const override { return -1; } diff --git a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_CatalystLogging.C b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_CatalystLogging.C index a426ffe4c8d3..f2dd02216f7a 100644 --- a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_CatalystLogging.C +++ b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_CatalystLogging.C @@ -5,10 +5,10 @@ // See packages/seacas/LICENSE for details #include +#include #include #include #include -#include namespace Iocatalyst { diff --git a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.C b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.C index 379fc673a5bf..3df77fe13960 100644 --- a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.C @@ -357,6 +357,16 @@ namespace Iocatalyst { return true; } + std::vector getTime() + { + std::vector times; + auto &node = this->DBNode; + if (node.has_path(getTimePath())) { + times.push_back(node[getTimePath()].as_float64()); + } + return times; + } + int64_t putField(const std::string &containerName, const Ioss::GroupingEntity *entityGroup, const Ioss::Field &field, void *data, size_t data_size, bool deep_copy) { @@ -1426,6 +1436,12 @@ namespace Iocatalyst { impl.readTime(region); } + std::vector DatabaseIO::get_db_step_times_nl() + { + auto &impl = (*this->Impl.get()); + return impl.getTime(); + } + void *DatabaseIO::get_catalyst_conduit_node() { auto &impl = (*this->Impl.get()); diff --git a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.h b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.h index 743cebe6fa3d..5954d596f071 100644 --- a/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/catalyst/Iocatalyst_DatabaseIO.h @@ -14,8 +14,8 @@ #include "Ioss_Region.h" // for Region, SideSetContainer, etc #include "Ioss_SideSet.h" // for SideBlockContainer, SideSet -#include "Ioss_Field.h" // for Field, etc #include "Iocatalyst_CatalystManager.h" +#include "Ioss_Field.h" // for Field, etc #include // for std::unique_ptr @@ -89,14 +89,12 @@ namespace Iocatalyst { IOSS_NODISCARD bool split_type_changed() const { return split_type_c; } private: - bool open_group_nl(const std::string & /* group_name */) override { return false; } - bool create_subgroup_nl(const std::string & /* group_name */) override { return false; } - bool begin_nl(Ioss::State state) override; bool end_nl(Ioss::State state) override; - void read_meta_data_nl() override; - void get_step_times_nl() override; + void read_meta_data_nl() override; + void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; bool begin_state_nl(int state, double time) override; bool end_state_nl(int state, double time) override; @@ -135,8 +133,8 @@ namespace Iocatalyst { size_t data_size) const override; int64_t get_field_internal(const Ioss::Assembly *as, const Ioss::Field &field, void *data, size_t data_size) const override; - int64_t get_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, - void *data, size_t data_size) const override; + int64_t get_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, void *data, + size_t data_size) const override; int64_t get_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field, void *data, size_t data_size) const override; @@ -144,30 +142,30 @@ namespace Iocatalyst { size_t *data_size) const override; int64_t get_zc_field_internal(const Ioss::NodeBlock *nb, const Ioss::Field &field, void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::EdgeBlock *eb, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::FaceBlock *fb, const Ioss::Field &field, - void **data, size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::EdgeBlock *eb, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::FaceBlock *fb, const Ioss::Field &field, void **data, + size_t *data_size) const override; int64_t get_zc_field_internal(const Ioss::ElementBlock *eb, const Ioss::Field &field, void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::SideBlock *sb, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::NodeSet *ns, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::EdgeSet *es, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::FaceSet *fs, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::ElementSet *es, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::SideSet *ss, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::CommSet *cs, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::Assembly *as, const Ioss::Field &field, - void **data, size_t *data_size) const override; - int64_t get_zc_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, - void **data, size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::SideBlock *sb, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::NodeSet *ns, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::EdgeSet *es, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::FaceSet *fs, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::ElementSet *es, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::SideSet *ss, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::CommSet *cs, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::Assembly *as, const Ioss::Field &field, void **data, + size_t *data_size) const override; + int64_t get_zc_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, void **data, + size_t *data_size) const override; int64_t get_zc_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field, void **data, size_t *data_size) const override; @@ -197,8 +195,8 @@ namespace Iocatalyst { size_t data_size) const override; int64_t put_field_internal(const Ioss::Assembly *as, const Ioss::Field &field, void *data, size_t data_size) const override; - int64_t put_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, - void *data, size_t data_size) const override; + int64_t put_field_internal(const Ioss::Blob *bl, const Ioss::Field &field, void *data, + size_t data_size) const override; int64_t put_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field, void *data, size_t data_size) const override; diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.C index b5c5ab8bbbe5..b705a791ea29 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.C @@ -291,24 +291,24 @@ namespace Iocatalyst { return (extents.i + offset) * (extents.j + offset) * (extents.k + offset); } - std::map* BlockMesh::getTransientCellFieldMap() + std::map *BlockMesh::getTransientCellFieldMap() { return &(this->transientCellFields); } - std::map* BlockMesh::getTransientPointFieldMap() + std::map *BlockMesh::getTransientPointFieldMap() { return &(this->transientPointFields); } void BlockMesh::addTransientCellField(std::string f_name, double f_value) { - this->transientCellFields.insert({ f_name, f_value }); + this->transientCellFields.insert({f_name, f_value}); } void BlockMesh::addTransientPointField(std::string f_name, double f_value) { - this->transientPointFields.insert({ f_name, f_value }); + this->transientPointFields.insert({f_name, f_value}); } } // namespace Iocatalyst diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.h b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.h index ba5c4caa21ab..f2ff3ce0f1a8 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.h +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMesh.h @@ -82,11 +82,11 @@ namespace Iocatalyst { static Extent getCoordsForID(ID id, Extent bounds); static ID getIDfromCoords(Extent coords, Extent bounds); - void addTransientCellField(std::string f_name, double f_value); - void addTransientPointField(std::string f_name, double f_value); + void addTransientCellField(std::string f_name, double f_value); + void addTransientPointField(std::string f_name, double f_value); - std::map* getTransientCellFieldMap(); - std::map* getTransientPointFieldMap(); + std::map *getTransientCellFieldMap(); + std::map *getTransientPointFieldMap(); private: Partition partition; diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.C index 9a7d87085199..11073606381e 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.C @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include #include @@ -41,12 +41,12 @@ namespace Iocatalyst { CatalystManager::getInstance().reset(); iop.isCatalyst = true; - //Cat Writes + // Cat Writes writeIOSSFile(iop); Ioss::PropertyManager cdbProps = Ioss::PropertyManager(iop.dbProps); cdbProps.add(Ioss::Property("CATALYST_CONDUIT_NODE", iop.getCatalystConduitNode())); - //Cat Reads here + // Cat Reads here Ioss::DatabaseIO *cdbi = Ioss::IOFactory::create(CATALYST_DATABASE_TYPE, CATALYST_DUMMY_DATABASE, Ioss::READ_RESTART, Ioss::ParallelUtils::comm_world(), cdbProps); @@ -70,20 +70,20 @@ namespace Iocatalyst { Ioss::copy_database(cir, cor, options); } - Ioss::DatabaseIO* BlockMeshSet::getCatalystDatabase(IOSSparams &iop) + Ioss::DatabaseIO *BlockMeshSet::getCatalystDatabase(IOSSparams &iop) { CatalystManager::getInstance().reset(); iop.isCatalyst = true; - - //Write to Cat database + + // Write to Cat database writeIOSSFile(iop); Ioss::PropertyManager cdbProps = Ioss::PropertyManager(iop.dbProps); - //Get Conduit + // Get Conduit cdbProps.add(Ioss::Property("CATALYST_CONDUIT_NODE", iop.getCatalystConduitNode())); - //Read to Cat Database + // Read to Cat Database Ioss::DatabaseIO *cdbi = Ioss::IOFactory::create(CATALYST_DATABASE_TYPE, CATALYST_DUMMY_DATABASE, Ioss::READ_RESTART, Ioss::ParallelUtils::comm_world(), cdbProps); @@ -107,7 +107,7 @@ namespace Iocatalyst { void BlockMeshSet::openIOSSDatabase(IOSSparams &iop) { Ioss::PropertyManager properties = Ioss::PropertyManager(iop.dbProps); - std::string dbType = iop.dbType; + std::string dbType = iop.dbType; if (iop.isCatalyst) { dbType = CATALYST_DATABASE_TYPE; } @@ -258,7 +258,8 @@ namespace Iocatalyst { void BlockMeshSet::writeStructuredTransientFieldDefinitions(IOSSparams &iop) { for (auto bm : bms) { - //Modify this to access field dict in "bm" and populate ioss block with those fields (as well). + // Modify this to access field dict in "bm" and populate ioss block with those fields (as + // well). auto iossBlock = iop.region->get_structured_block(getStructuredBlockName(bm.getID())); iossBlock->field_add(Ioss::Field(IOSS_CELL_FIELD, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, Ioss::Field::TRANSIENT)); @@ -359,7 +360,7 @@ namespace Iocatalyst { auto nodeBlock = iop.region->get_node_block("nodeblock"); nodeBlock->field_add(Ioss::Field(IOSS_POINT_FIELD, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, Ioss::Field::TRANSIENT)); - + writeUnstructuredAddedTransientFields(bm, iop); } } @@ -373,23 +374,21 @@ namespace Iocatalyst { void BlockMeshSet::writeUnstructuredAddedCellTransientFields(BlockMesh bm, IOSSparams &iop) { auto cell_fields = bm.getTransientCellFieldMap(); - auto elemBlock = iop.region->get_element_block(getUnstructuredBlockName(bm.getID())); - for (auto itr = cell_fields->begin(); itr != cell_fields->end(); ++itr) - { - elemBlock->field_add(Ioss::Field(itr->first, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, - Ioss::Field::TRANSIENT)); - } + auto elemBlock = iop.region->get_element_block(getUnstructuredBlockName(bm.getID())); + for (auto itr = cell_fields->begin(); itr != cell_fields->end(); ++itr) { + elemBlock->field_add( + Ioss::Field(itr->first, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, Ioss::Field::TRANSIENT)); + } } void BlockMeshSet::writeUnstructuredAddedPointTransientFields(BlockMesh bm, IOSSparams &iop) { auto point_fields = bm.getTransientPointFieldMap(); - auto nodeBlock = iop.region->get_node_block("nodeblock"); - for (auto itr = point_fields->begin(); itr != point_fields->end(); ++itr) - { - nodeBlock->field_add(Ioss::Field(itr->first, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, - Ioss::Field::TRANSIENT)); - } + auto nodeBlock = iop.region->get_node_block("nodeblock"); + for (auto itr = point_fields->begin(); itr != point_fields->end(); ++itr) { + nodeBlock->field_add( + Ioss::Field(itr->first, Ioss::Field::REAL, IOSS_SCALAR_STORAGE, Ioss::Field::TRANSIENT)); + } } void BlockMeshSet::writeUnstructuredTransientBulkData(IOSSparams &iop) @@ -422,36 +421,36 @@ namespace Iocatalyst { writeUnstructuredAddedPointTransientFieldsBulkData(bm, iop); } - void BlockMeshSet::writeUnstructuredAddedCellTransientFieldsBulkData(BlockMesh bm, IOSSparams &iop) + void BlockMeshSet::writeUnstructuredAddedCellTransientFieldsBulkData(BlockMesh bm, + IOSSparams &iop) { auto cell_fields = bm.getTransientCellFieldMap(); - auto elemBlock = iop.region->get_element_block(getUnstructuredBlockName(bm.getID())); + auto elemBlock = iop.region->get_element_block(getUnstructuredBlockName(bm.getID())); std::vector values; - for (auto itr = cell_fields->begin(); itr != cell_fields->end(); ++itr) - { + for (auto itr = cell_fields->begin(); itr != cell_fields->end(); ++itr) { int num_elements = elemBlock->get_field(itr->first).raw_count(); for (int j = 0; j < num_elements; j++) { - values.push_back(itr->second + j*0.1); + values.push_back(itr->second + j * 0.1); } elemBlock->put_field_data(itr->first, values); values.clear(); - } + } } - void BlockMeshSet::writeUnstructuredAddedPointTransientFieldsBulkData(BlockMesh bm, IOSSparams &iop) + void BlockMeshSet::writeUnstructuredAddedPointTransientFieldsBulkData(BlockMesh bm, + IOSSparams &iop) { - auto point_fields = bm.getTransientPointFieldMap(); - auto nodeBlock = iop.region->get_node_block("nodeblock"); + auto point_fields = bm.getTransientPointFieldMap(); + auto nodeBlock = iop.region->get_node_block("nodeblock"); std::vector values; - for (auto itr = point_fields->begin(); itr != point_fields->end(); ++itr) - { + for (auto itr = point_fields->begin(); itr != point_fields->end(); ++itr) { int num_nodes = nodeBlock->get_field(itr->first).raw_count(); for (int j = 0; j < num_nodes; j++) { - values.push_back(itr->second + j*0.1); + values.push_back(itr->second + j * 0.1); } nodeBlock->put_field_data(itr->first, values); values.clear(); - } + } } std::string BlockMeshSet::getStructuredBlockName(int index) diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.h b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.h index bc98721fe390..6e84a0fe5531 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.h +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSet.h @@ -26,8 +26,10 @@ namespace Iocatalyst { class IOSSparams { public: - IOSSparams(const std::string &fileName, const std::string &dbType, Ioss::PropertyManager dbProps = {}) - : fileName(fileName), dbType(dbType), databaseIO(nullptr), isCatalyst(false), dbProps(dbProps) + IOSSparams(const std::string &fileName, const std::string &dbType, + Ioss::PropertyManager dbProps = {}) + : fileName(fileName), dbType(dbType), databaseIO(nullptr), isCatalyst(false), + dbProps(dbProps) { } bool isStructured() { return dbType == CGNS_DATABASE_TYPE; } @@ -45,12 +47,12 @@ namespace Iocatalyst { IOSSparams(); }; - void addBlockMesh(const BlockMesh &blockMesh); - void writeIOSSFile(IOSSparams &iop); - void writeCatalystIOSSFile(IOSSparams &iop); - Ioss::DatabaseIO* getCatalystDatabase(IOSSparams &iop); - - int getNumLocalPointsInMeshSet(); + void addBlockMesh(const BlockMesh &blockMesh); + void writeIOSSFile(IOSSparams &iop); + void writeCatalystIOSSFile(IOSSparams &iop); + Ioss::DatabaseIO *getCatalystDatabase(IOSSparams &iop); + + int getNumLocalPointsInMeshSet(); std::string getStructuredBlockName(int index); std::string getStructuredNodeBlockName(int index); diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSetTest.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSetTest.C index 98b155b03842..89accb1eb414 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSetTest.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_BlockMeshSetTest.C @@ -43,8 +43,8 @@ TEST_F(Iocatalyst_DatabaseIOTest, AddTransientFieldToBlockMesh) addBlockMesh(bmOne); - std::string exodusFileName = - "AddTransientFieldToBlockMesh" + CATALYST_TEST_FILE_NP + std::to_string(part.size) + EXODUS_FILE_EXTENSION; + std::string exodusFileName = "AddTransientFieldToBlockMesh" + CATALYST_TEST_FILE_NP + + std::to_string(part.size) + EXODUS_FILE_EXTENSION; Iocatalyst::BlockMeshSet::IOSSparams iop(exodusFileName, EXODUS_DATABASE_TYPE); bmSet.writeIOSSFile(iop); } \ No newline at end of file diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ConduitReadTest.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ConduitReadTest.C index 48bc67470448..bd730d7a65ef 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ConduitReadTest.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ConduitReadTest.C @@ -122,7 +122,6 @@ TEST_F(Iocatalyst_DatabaseIOTest, CellIdsAndCellNodeIds) EXPECT_EQ(cidBuff[0], 1); EXPECT_EQ(cidBuff[cids.raw_count() - 1], 256); - auto cnids = sb->get_fieldref("cell_node_ids"); EXPECT_TRUE(cnids.get_type() == Ioss::Field::INTEGER); std::vector cnidsBuff(cnids.raw_count()); @@ -131,4 +130,4 @@ TEST_F(Iocatalyst_DatabaseIOTest, CellIdsAndCellNodeIds) cnids.raw_count()); EXPECT_EQ(cnidsBuff[0], 1); EXPECT_EQ(cnidsBuff[cnids.raw_count() - 1], 594); -} \ No newline at end of file +} diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_DatabaseIOTest.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_DatabaseIOTest.C index ac2bafb855aa..d1efac0b9f49 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_DatabaseIOTest.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_DatabaseIOTest.C @@ -196,11 +196,11 @@ Iocatalyst_DatabaseIOTest::getCatalystDatabaseFromConduit(conduit_cpp::Node & Ioss::DatabaseIO *Iocatalyst_DatabaseIOTest::getDatabaseOnReadFromFileName( const std::string &fileName, const std::string &iossDatabaseType, Ioss::PropertyManager dbProps) { - Ioss::PropertyManager dbaseProps = Ioss::PropertyManager(dbProps); - auto inputFileName = fileName; - Ioss::ParallelUtils pu; - int numRanks = pu.parallel_size(); - int rank = pu.parallel_rank(); + Ioss::PropertyManager dbaseProps = Ioss::PropertyManager(dbProps); + auto inputFileName = fileName; + Ioss::ParallelUtils pu; + int numRanks = pu.parallel_size(); + int rank = pu.parallel_rank(); if (iossDatabaseType == EXODUS_DATABASE_TYPE && numRanks > 1) { inputFileName += "." + std::to_string(numRanks) + "." + std::to_string(rank); } diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ElementBlockTest.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ElementBlockTest.C index 9c8fec4c2d88..e4f6fd8ebea3 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ElementBlockTest.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_ElementBlockTest.C @@ -12,11 +12,9 @@ #include #include #include +#include #include #include -#include - - TEST_F(Iocatalyst_DatabaseIOTest, WriteThreeElementBlocksWith24Cells) { @@ -81,22 +79,24 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_ENABLE_FIELD_RECOGNITION_ON) bm.addTransientCellField("foo_y", 3); bm.addTransientCellField("foo_z", 4); - addBlockMesh(bm); Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("ENABLE_FIELD_RECOGNITION", "ON")); - Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_enable_field_recog", iossProp); + Ioss::DatabaseIO *exo_d = + writeAndGetExodusDatabaseOnRead("test_eb_1_enable_field_recog", iossProp); Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -106,28 +106,28 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_ENABLE_FIELD_RECOGNITION_ON) bool cat_foo_exists = cat_elemBlock->field_exists("foo"); EXPECT_TRUE(exo_foo_exists); EXPECT_TRUE(cat_foo_exists); - if(exo_foo_exists && cat_foo_exists) + if (exo_foo_exists && cat_foo_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo") == cat_elemBlock->get_field("foo")); - - //Check field data for equality - auto cat_field = cat_elemBlock->get_fieldref("foo"); + + // Check field data for equality + auto cat_field = cat_elemBlock->get_fieldref("foo"); std::vector dcBuffer(cat_field.get_size()); cat_elemBlock->get_field_data("foo", Data(dcBuffer), dcBuffer.size()); exo_reg.begin_state(1); - auto exo_field = exo_elemBlock->get_fieldref("foo"); + auto exo_field = exo_elemBlock->get_fieldref("foo"); std::vector deBuffer(exo_field.get_size()); exo_elemBlock->get_field_data("foo", Data(deBuffer), deBuffer.size()); EXPECT_EQ(dcBuffer, deBuffer); - //Check foo_x doesn't exist + // Check foo_x doesn't exist bool exo_foo_x_exists = exo_elemBlock->field_exists("foo_x"); bool cat_foo_x_exists = cat_elemBlock->field_exists("foo_x"); EXPECT_FALSE(exo_foo_x_exists); EXPECT_FALSE(cat_foo_x_exists); } -//Sanity Test +// Sanity Test TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_ENABLE_FIELD_RECOGNITION_OFF) { Iocatalyst::BlockMesh bm; @@ -137,22 +137,24 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_ENABLE_FIELD_RECOGNITION_OFF) bm.addTransientCellField("foo_y", 3); bm.addTransientCellField("foo_z", 4); - addBlockMesh(bm); Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("ENABLE_FIELD_RECOGNITION", "OFF")); - Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_enable_field_recog", iossProp); - + Ioss::DatabaseIO *exo_d = + writeAndGetExodusDatabaseOnRead("test_eb_1_enable_field_recog", iossProp); + Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -162,12 +164,10 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_ENABLE_FIELD_RECOGNITION_OFF) bool cat_foo_x_exists = cat_elemBlock->field_exists("foo_x"); EXPECT_TRUE(exo_foo_x_exists); EXPECT_TRUE(cat_foo_x_exists); - if(exo_foo_x_exists && cat_foo_x_exists) + if (exo_foo_x_exists && cat_foo_x_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo_x") == cat_elemBlock->get_field("foo_x")); - } - TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_ON) { Iocatalyst::BlockMesh bm; @@ -177,22 +177,24 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_ON) bm.addTransientCellField("foo_2", 3); bm.addTransientCellField("foo_3", 4); - addBlockMesh(bm); Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("IGNORE_REALN_FIELDS", "ON")); - Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_ignore_realn_fields", iossProp); + Ioss::DatabaseIO *exo_d = + writeAndGetExodusDatabaseOnRead("test_eb_1_ignore_realn_fields", iossProp); Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -202,9 +204,8 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_ON) bool cat_foo_1_exists = cat_elemBlock->field_exists("foo_1"); EXPECT_TRUE(exo_foo_1_exists); EXPECT_TRUE(cat_foo_1_exists); - if(exo_foo_1_exists && cat_foo_1_exists) + if (exo_foo_1_exists && cat_foo_1_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo_1") == cat_elemBlock->get_field("foo_1")); - } TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_OFF) @@ -216,22 +217,24 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_OFF) bm.addTransientCellField("foo_2", 2); bm.addTransientCellField("foo_3", 4); - addBlockMesh(bm); Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("IGNORE_REALN_FIELDS", "OFF")); - Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_ignore_realn_fields_off", iossProp); + Ioss::DatabaseIO *exo_d = + writeAndGetExodusDatabaseOnRead("test_eb_1_ignore_realn_fields_off", iossProp); Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -241,20 +244,19 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_IGNORE_REALN_FIELDS_OFF) bool cat_foo_exists = cat_elemBlock->field_exists("foo"); EXPECT_TRUE(exo_foo_exists); EXPECT_TRUE(cat_foo_exists); - if(exo_foo_exists && cat_foo_exists) + if (exo_foo_exists && cat_foo_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo") == cat_elemBlock->get_field("foo")); - - //Check field data for equality - auto cat_field = cat_elemBlock->get_fieldref("foo"); + + // Check field data for equality + auto cat_field = cat_elemBlock->get_fieldref("foo"); std::vector dcBuffer(cat_field.get_size()); cat_elemBlock->get_field_data("foo", Data(dcBuffer), dcBuffer.size()); exo_reg.begin_state(1); - auto exo_field = exo_elemBlock->get_fieldref("foo"); + auto exo_field = exo_elemBlock->get_fieldref("foo"); std::vector deBuffer(exo_field.get_size()); exo_elemBlock->get_field_data("foo", Data(deBuffer), deBuffer.size()); EXPECT_EQ(dcBuffer, deBuffer); - } TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_SUFFIX_SEPARATOR) @@ -269,23 +271,23 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_SUFFIX_SEPARATOR) bm.addTransientCellField("bar:y", 6); bm.addTransientCellField("bar:z", 7); - addBlockMesh(bm); Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("FIELD_SUFFIX_SEPARATOR", ":")); - + Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_field_suf_sep", iossProp); Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); - Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); + Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -295,27 +297,26 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_SUFFIX_SEPARATOR) bool cat_foo_x_exists = cat_elemBlock->field_exists("foo_x"); EXPECT_TRUE(exo_foo_x_exists); EXPECT_TRUE(cat_foo_x_exists); - if(exo_foo_x_exists && cat_foo_x_exists) + if (exo_foo_x_exists && cat_foo_x_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo_x") == cat_elemBlock->get_field("foo_x")); - + bool exo_bar_exists = exo_elemBlock->field_exists("bar"); bool cat_bar_exists = cat_elemBlock->field_exists("bar"); EXPECT_TRUE(exo_bar_exists); EXPECT_TRUE(cat_bar_exists); - if(exo_bar_exists && cat_bar_exists) + if (exo_bar_exists && cat_bar_exists) EXPECT_TRUE(exo_elemBlock->get_field("bar") == cat_elemBlock->get_field("bar")); - - //Check bar field data for equality - auto cat_field = cat_elemBlock->get_fieldref("bar"); + + // Check bar field data for equality + auto cat_field = cat_elemBlock->get_fieldref("bar"); std::vector dcBuffer(cat_field.get_size()); cat_elemBlock->get_field_data("bar", Data(dcBuffer), dcBuffer.size()); exo_reg.begin_state(1); - auto exo_field = exo_elemBlock->get_fieldref("bar"); + auto exo_field = exo_elemBlock->get_fieldref("bar"); std::vector deBuffer(exo_field.get_size()); exo_elemBlock->get_field_data("bar", Data(deBuffer), deBuffer.size()); EXPECT_EQ(dcBuffer, deBuffer); - } TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_STRIP_TRAILING_UNDERSCORE) @@ -333,17 +334,20 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_STRIP_TRAILING_UNDERSCORE) iossProp.add(Ioss::Property("FIELD_STRIP_TRAILING_UNDERSCORE", "ON")); iossProp.add(Ioss::Property("FIELD_SUFFIX_SEPARATOR", "")); - Ioss::DatabaseIO *exo_d = writeAndGetExodusDatabaseOnRead("test_eb_1_field_strip_tr_unders", iossProp); + Ioss::DatabaseIO *exo_d = + writeAndGetExodusDatabaseOnRead("test_eb_1_field_strip_tr_unders", iossProp); Iocatalyst::BlockMeshSet::IOSSparams iop("cat", EXODUS_DATABASE_TYPE, iossProp); Ioss::DatabaseIO *cat_d = bmSet.getCatalystDatabase(iop); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize on read"; + } Ioss::Region cat_reg(cat_d); - + Ioss::Region exo_reg(exo_d); - + auto cat_elemBlock = cat_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); auto exo_elemBlock = exo_reg.get_element_block(bmSet.getUnstructuredBlockName(bm.getID())); @@ -353,23 +357,22 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_FIELD_STRIP_TRAILING_UNDERSCORE) bool cat_foo_exists = cat_elemBlock->field_exists("foo"); EXPECT_TRUE(exo_foo_exists); EXPECT_TRUE(cat_foo_exists); - if(exo_foo_exists && cat_foo_exists) + if (exo_foo_exists && cat_foo_exists) EXPECT_TRUE(exo_elemBlock->get_field("foo") == cat_elemBlock->get_field("foo")); - - //Check field data for equality - auto cat_field = cat_elemBlock->get_fieldref("foo"); + + // Check field data for equality + auto cat_field = cat_elemBlock->get_fieldref("foo"); std::vector dcBuffer(cat_field.get_size()); cat_elemBlock->get_field_data("foo", Data(dcBuffer), dcBuffer.size()); exo_reg.begin_state(1); - auto exo_field = exo_elemBlock->get_fieldref("foo"); + auto exo_field = exo_elemBlock->get_fieldref("foo"); std::vector deBuffer(exo_field.get_size()); exo_elemBlock->get_field_data("foo", Data(deBuffer), deBuffer.size()); EXPECT_EQ(dcBuffer, deBuffer); - } -//Read from file. Can. Or available exodus file in test suite. +// Read from file. Can. Or available exodus file in test suite. TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_SURFACE_SPLIT_TYPE) { Iocatalyst::BlockMesh bm; @@ -377,34 +380,37 @@ TEST_F(Iocatalyst_DatabaseIOTest, Exodus_Prop_SURFACE_SPLIT_TYPE) addBlockMesh(bm); - //If write and read have same split type, we can handle. Else no. + // If write and read have same split type, we can handle. Else no. Ioss::PropertyManager iossProp; iossProp.add(Ioss::Property("SURFACE_SPLIT_TYPE", "BLOCK")); std::string exoFile = "can.ex2"; - + conduit_cpp::Node c_node = getConduitFromExodusFile(exoFile, iossProp); Ioss::DatabaseIO *cat_d = getCatalystDatabaseFromConduit(c_node, iossProp); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize"; } - + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize"; + } + Ioss::Region cat_reg(cat_d); - + Ioss::SideSetContainer cat_sideSets = cat_reg.get_sidesets(); checkEntityContainerZeroCopyFields(cat_sideSets); - - EXPECT_TRUE(cat_sideSets.empty())<<"Cat sidesets not empty when different SURFACE_SPLIT_TYPE"; + + EXPECT_TRUE(cat_sideSets.empty()) << "Cat sidesets not empty when different SURFACE_SPLIT_TYPE"; Ioss::PropertyManager iossProp_s; iossProp_s.add(Ioss::Property("SURFACE_SPLIT_TYPE", "TOPOLOGY")); cat_d = getCatalystDatabaseFromConduit(c_node, iossProp_s); - if(cat_d == nullptr){ EXPECT_TRUE(false) << "Catalyst db unable to initialize"; } + if (cat_d == nullptr) { + EXPECT_TRUE(false) << "Catalyst db unable to initialize"; + } Ioss::Region cat_reg_same(cat_d); - - cat_sideSets = cat_reg_same.get_sidesets(); - EXPECT_TRUE(!cat_sideSets.empty())<<"Cat sidesets empty when identical SURFACE_SPLIT_TYPE"; + cat_sideSets = cat_reg_same.get_sidesets(); + EXPECT_TRUE(!cat_sideSets.empty()) << "Cat sidesets empty when identical SURFACE_SPLIT_TYPE"; } diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_LoggingTest.h b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_LoggingTest.h index fd00c6308339..e90e761c700a 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_LoggingTest.h +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_LoggingTest.h @@ -29,4 +29,4 @@ class LoggingTest : public ::testing::Test } return outputFileExists; } -}; +}; \ No newline at end of file diff --git a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_TestDriverMain.C b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_TestDriverMain.C index 7d0e88549f40..33c32ac8b6de 100644 --- a/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_TestDriverMain.C +++ b/packages/seacas/libraries/ioss/src/catalyst_tests/Iocatalyst_TestDriverMain.C @@ -5,9 +5,9 @@ // See packages/seacas/LICENSE for details #include "iocatalyst_export.h" -#include -#include #include +#include +#include #ifdef SEACAS_HAVE_MPI #include diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.C b/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.C index e0b17839a32b..edbf32ad2479 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.C @@ -1640,6 +1640,15 @@ namespace Iocgns { myProcessor); } + std::vector DatabaseIO::get_db_step_times_nl() + { + std::vector timesteps; + + Utils::get_step_times(get_file_pointer(), timesteps, nullptr, timeScaleFactor, myProcessor); + + return timesteps; + } + void DatabaseIO::write_adjacency_data() { // Determine adjacency information between unstructured blocks. diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.h b/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.h index 718edc8b9d28..1477cf6817ee 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_DatabaseIO.h @@ -102,12 +102,13 @@ namespace Iocgns { IOSS_NODISCARD bool end_state_nl(int state, double time) override; void flush_database_nl() const override; - bool check_valid_file_open(int status) const; - void create_structured_block(int base, int zone, size_t &num_node); - void create_structured_block_fpp(int base, int num_zones, size_t &num_node); - size_t finalize_structured_blocks(); - void finalize_database() const override; - void get_step_times_nl() override; + bool check_valid_file_open(int status) const; + void create_structured_block(int base, int zone, size_t &num_node); + void create_structured_block_fpp(int base, int num_zones, size_t &num_node); + size_t finalize_structured_blocks(); + void finalize_database() const override; + void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; void create_unstructured_block(int base, int zone, size_t &num_node); void write_adjacency_data(); diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.C b/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.C index 3ba956c99364..b09ff5756a6c 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.C @@ -806,6 +806,15 @@ namespace Iocgns { myProcessor); } + std::vector ParallelDatabaseIO::get_db_step_times_nl() + { + std::vector timesteps; + + Utils::get_step_times(get_file_pointer(), timesteps, nullptr, timeScaleFactor, myProcessor); + + return timesteps; + } + void ParallelDatabaseIO::write_adjacency_data() { // Determine adjacency information between unstructured blocks. @@ -2263,7 +2272,8 @@ namespace Iocgns { // ======================================================================== // Repetitive code for each coordinate direction; use a lambda to consolidate... - auto coord_lambda = [=, &coord](const char *ordinate, int ordinal) { + auto coord_lambda = [&coord, phys_dimension, rmax, rmin, base, zone, &rdata, num_to_get, + this](const char *ordinate, int ordinal) { // Data required by upper classes store x0, y0, z0, ... xn, // yn, zn. Data stored in cgns file is x0, ..., xn, y0, // ..., yn, z0, ..., zn so we have to allocate some scratch diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.h b/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.h index e51ec3f11c49..5ad814938b3a 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_ParallelDatabaseIO.h @@ -107,13 +107,14 @@ namespace Iocgns { bool end_state_nl(int state, double time) override; void flush_database_nl() const override; - void handle_structured_blocks(); - void handle_unstructured_blocks(); - size_t finalize_structured_blocks(); - int64_t handle_node_ids(void *ids, int64_t num_to_get) const; - void finalize_database() const override; - void get_step_times_nl() override; - void write_adjacency_data(); + void handle_structured_blocks(); + void handle_unstructured_blocks(); + size_t finalize_structured_blocks(); + int64_t handle_node_ids(void *ids, int64_t num_to_get) const; + void finalize_database() const override; + void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; + void write_adjacency_data(); int64_t get_field_internal(const Ioss::Region *reg, const Ioss::Field &field, void *data, size_t data_size) const override; diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_StructuredZoneData.C b/packages/seacas/libraries/ioss/src/cgns/Iocgns_StructuredZoneData.C index da349a3b61f6..222bfe91f1e1 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_StructuredZoneData.C +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_StructuredZoneData.C @@ -1,4 +1,4 @@ -// Copyright(C) 1999-2024 National Technology & Engineering Solutions +// Copyright(C) 1999-2025 National Technology & Engineering Solutions // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with // NTESS, the U.S. Government retains certain rights in this software. // @@ -263,13 +263,13 @@ namespace Iocgns { size_t work2 = ord2 * m_ordinal[0] * m_ordinal[1]; // Don't decompose along m_lineOrdinal direction and Avoid decompositions 1-cell thick. - if (m_lineOrdinal & Ordinal::I || m_ordinal[0] == 1 || ord0 == 1 || m_ordinal[0] - ord0 == 1) { + if (m_lineOrdinal & Ordinal::I || m_ordinal[0] == 1 || ord0 <= 1 || m_ordinal[0] - ord0 <= 1) { work0 = 0; } - if (m_lineOrdinal & Ordinal::J || m_ordinal[1] == 1 || ord1 == 1 || m_ordinal[1] - ord1 == 1) { + if (m_lineOrdinal & Ordinal::J || m_ordinal[1] == 1 || ord1 <= 1 || m_ordinal[1] - ord1 <= 1) { work1 = 0; } - if (m_lineOrdinal & Ordinal::K || m_ordinal[2] == 1 || ord2 == 1 || m_ordinal[2] - ord2 == 1) { + if (m_lineOrdinal & Ordinal::K || m_ordinal[2] == 1 || ord2 <= 1 || m_ordinal[2] - ord2 <= 1) { work2 = 0; } diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.C b/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.C index 84bbd54c37e1..2af15c79ba15 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.C +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.C @@ -428,11 +428,9 @@ namespace { size_t max_face = std::string("Face Count").length(); for (auto &eb : ebs) { const std::string &name = eb->name(); - if (name.length() > max_name) { - max_name = name.length(); - } - size_t face_width = Ioss::Utils::number_width(boundary_faces[name].size()); - max_face = face_width > max_face ? face_width : max_face; + max_name = std::max(name.length(), max_name); + size_t face_width = Ioss::Utils::number_width(boundary_faces[name].size()); + max_face = std::max(face_width, max_face); } max_name += 4; // Padding max_face += 4; @@ -1938,7 +1936,7 @@ Iocgns::Utils::resolve_processor_shared_nodes(Ioss::Region ®ion, int my_proce std::vector>> shared_nodes(blocks.size() + 1); for (auto &owner_block : blocks) { - int owner_zone = owner_block->get_property("zone").get_int(); + int owner_zone = owner_block->get_property("zone").get_int(); for (const auto &zgc : owner_block->m_zoneConnectivity) { assert(zgc.m_donorProcessor >= 0); assert(zgc.m_ownerProcessor >= 0); @@ -1950,10 +1948,10 @@ Iocgns::Utils::resolve_processor_shared_nodes(Ioss::Region ®ion, int my_proce // don't store or access any "bulk" data on it. auto donor_block = region.get_structured_block(zgc.m_donorName); assert(donor_block != nullptr); - int donor_zone = donor_block->get_property("zone").get_int(); - std::vector i_range = zgc.get_range(1); - std::vector j_range = zgc.get_range(2); - std::vector k_range = zgc.get_range(3); + int donor_zone = donor_block->get_property("zone").get_int(); + std::vector i_range = zgc.get_range(1); + std::vector j_range = zgc.get_range(2); + std::vector k_range = zgc.get_range(3); for (auto &k : k_range) { for (auto &j : j_range) { for (auto &i : i_range) { @@ -2392,7 +2390,9 @@ int Iocgns::Utils::get_step_times(int cgns_file_ptr, std::vector ×t timesteps.reserve(num_timesteps); for (int i = 0; i < num_timesteps; i++) { - region->add_state(times[i] * timeScaleFactor); + if (nullptr != region) { + region->add_state(times[i] * timeScaleFactor); + } timesteps.push_back(times[i]); } return num_timesteps; diff --git a/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.h b/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.h index 874f0dd79fa9..e8438dc1eca0 100644 --- a/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.h +++ b/packages/seacas/libraries/ioss/src/cgns/Iocgns_Utils.h @@ -301,7 +301,7 @@ namespace Iocgns { static void write_state_meta_data(int file_ptr, const Ioss::Region ®ion, bool is_parallel_io); static size_t common_write_metadata(int file_ptr, const Ioss::Region ®ion, - std::vector &zone_offset, bool is_parallel); + std::vector &zone_offset, bool is_parallel); static size_t resolve_nodes(Ioss::Region ®ion, int my_processor, bool is_parallel); IOSS_NODISCARD static std::vector>> resolve_processor_shared_nodes(Ioss::Region ®ion, int my_processor); diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.C index 8ce14bbfd072..de8af659d188 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.C @@ -4,6 +4,7 @@ // // See packages/seacas/LICENSE for details +#include #include #include #include @@ -18,7 +19,6 @@ #include #include #include -#include #include "Ioex_Utils.h" #include "Ioss_Assembly.h" @@ -88,7 +88,7 @@ namespace { template void write_attribute_names(int exoid, ex_entity_type type, const std::vector &entities); - void query_groups(int exoid, Ioss::NameList& names, bool return_full_names); + void query_groups(int exoid, Ioss::NameList &names, bool return_full_names); class AssemblyTreeFilter { @@ -231,6 +231,12 @@ namespace Ioex { "IOEX: Setting EX_VERBOSE|EX_DEBUG because EX_DEBUG environment variable is set.\n"); ex_opts(EX_VERBOSE | EX_DEBUG); } + // This is also done down in the exodus library, but helps logic to do it here... + if (util().get_environment("EXODUS_VERBOSE", isParallel)) { + fmt::print(Ioss::DebugOut(), "IOEX: Exodus error reporting set to VERBOSE because " + "EXODUS_VERBOSE environment variable is set.\n"); + ex_opts(EX_VERBOSE); + } if (!is_input()) { if (util().get_environment("EX_MODE", exodusMode, isParallel)) { @@ -261,40 +267,57 @@ namespace Ioex { // See if there are any properties that need to (or can) be // handled prior to opening/creating database... -#if NC_HAS_HDF5 - bool compress = ((properties.exists("COMPRESSION_LEVEL") && - properties.get("COMPRESSION_LEVEL").get_int() > 0) || - (properties.exists("COMPRESSION_SHUFFLE") && - properties.get("COMPRESSION_SHUFFLE").get_int() > 0)); - - if (compress) { - exodusMode |= EX_NETCDF4; - } -#endif - if (properties.exists("FILE_TYPE")) { std::string type = properties.get("FILE_TYPE").get_string(); + type = Ioss::Utils::lowercase(type); if (type == "netcdf3" || type == "netcdf-3") { exodusMode = EX_CLOBBER; // Reset back to default... } -#if NC_HAS_HDF5 if (type == "netcdf4" || type == "netcdf-4" || type == "hdf5") { +#if NC_HAS_HDF5 exodusMode |= EX_NETCDF4; - } +#else + fmt::print(Ioss::OUTPUT(), "IOEX: HDF5/netcdf-4 is not supported in this build. FILE_TYPE " + "setting will be ignored.\n"); #endif -#if NC_HAS_CDF5 + } else if (type == "netcdf5" || type == "netcdf-5" || type == "cdf5") { +#if NC_HAS_CDF5 exodusMode |= EX_64BIT_DATA; - } +#else + fmt::print(Ioss::OUTPUT(), "IOEX: CDF5/netcdf-5 is not supported in this build. FILE_TYPE " + "setting will be ignored.\n"); #endif + } } -#if NC_HAS_HDF5 if (properties.exists("ENABLE_FILE_GROUPS")) { +#if NC_HAS_HDF5 exodusMode |= EX_NETCDF4; exodusMode |= EX_NOCLASSIC; +#else + fmt::print(Ioss::OUTPUT(), "IOEX: HDF5/netcdf-4 is not supported in this build. " + "ENABLE_FILE_GROUPS setting will be ignored.\n"); +#endif } + + bool compress = ((properties.exists("COMPRESSION_LEVEL") && + properties.get("COMPRESSION_LEVEL").get_int() > 0) || + (properties.exists("COMPRESSION_SHUFFLE") && + properties.get("COMPRESSION_SHUFFLE").get_int() > 0)); + + if (compress) { +#if NC_HAS_HDF5 + if (!(exodusMode & EX_NETCDF4)) { + fmt::print(Ioss::OUTPUT(), "IOEX: Compression requires netcdf-4/HDF5-based file. Setting " + "file type to netcdf-4.\n"); + exodusMode |= EX_NETCDF4; + } +#else + fmt::print(Ioss::OUTPUT(), "IOEX: HDF5/netcdf-4 is not supported in this build. Compression " + "setting will be ignored.\n"); #endif + } if (properties.exists("MAXIMUM_NAME_LENGTH")) { maximumNameLength = properties.get("MAXIMUM_NAME_LENGTH").get_int(); @@ -406,10 +429,6 @@ namespace Ioex { bool overwrite = true; handle_output_file(write_message, nullptr, nullptr, overwrite, abort_if_error); } - - if (!m_groupName.empty()) { - ex_get_group_id(m_exodusFilePtr, m_groupName.c_str(), &m_exodusFilePtr); - } } assert(m_exodusFilePtr >= 0); fileExists = true; @@ -500,31 +519,52 @@ namespace Ioex { } ex_set_max_name_length(m_exodusFilePtr, maximumNameLength); + + open_root_group_nl(); + open_child_group_nl(0); } - bool BaseDatabaseIO::open_root_group_nl() + bool BaseDatabaseIO::supports_internal_change_set_nl() { return supports_group(); } + + bool BaseDatabaseIO::supports_group() const + { + Ioss::SerializeIO serializeIO_(this); + int exoid = get_file_pointer(); + + int64_t format = ex_inquire_int(exoid, EX_INQ_FILE_FORMAT); + + if (format < 0) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Could not query file format for file '{}'.\n", get_filename()); + IOSS_ERROR(errmsg); + } + + return (NC_FORMAT_NETCDF4 == format); + } + + bool BaseDatabaseIO::open_root_group_nl() const { // Get existing file pointer... bool success = false; Ioss::SerializeIO serializeIO_(this); - int exoid = get_file_pointer(); + int exoid = get_file_pointer(); - int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); - std::vector group_name(group_name_length+1, '\0'); + int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); + std::vector group_name(group_name_length + 1, '\0'); // Get name of this group... int idum; float rdum; - int ierr = ex_inquire(exoid, EX_INQ_GROUP_NAME, &idum, &rdum, group_name.data()); + int ierr = ex_inquire(exoid, EX_INQ_GROUP_NAME, &idum, &rdum, group_name.data()); if (ierr < 0) { std::ostringstream errmsg; - fmt::print(errmsg, "ERROR: Could not open root group of group named '{}' in file '{}'.\n", m_groupName, - get_filename()); + fmt::print(errmsg, "ERROR: Could not open root group of group named '{}' in file '{}'.\n", + m_groupName, get_filename()); IOSS_ERROR(errmsg); } - m_groupName = std::string(group_name.data()); + m_groupName = std::string(group_name.data()); m_exodusFilePtr = ex_inquire_int(exoid, EX_INQ_GROUP_ROOT); if (m_exodusFilePtr < 0) { @@ -537,13 +577,34 @@ namespace Ioex { return success; } - bool BaseDatabaseIO::open_group_nl(const std::string &group_name) + bool BaseDatabaseIO::open_internal_change_set_nl(const std::string &set_name) + { + if (set_name == m_groupName) { + return true; + } + + // Check name for '/' which is not allowed since it is the + // separator character in a full group path + if (set_name.find('/') != std::string::npos) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Invalid group name '{}' contains a '/' which is not allowed.\n", + set_name); + IOSS_ERROR(errmsg); + } + + if (!open_root_group_nl()) + return false; + + return open_group_nl(set_name); + } + + bool BaseDatabaseIO::open_group_nl(const std::string &group_name) const { // Get existing file pointer... bool success = false; Ioss::SerializeIO serializeIO_(this); - int exoid = get_file_pointer(); + int exoid = get_file_pointer(); m_groupName = group_name; ex_get_group_id(exoid, m_groupName.c_str(), &m_exodusFilePtr); @@ -558,13 +619,21 @@ namespace Ioex { return success; } + bool BaseDatabaseIO::create_internal_change_set_nl(const std::string &set_name) + { + if (!open_root_group_nl()) + return false; + + return create_subgroup_nl(set_name); + } + bool BaseDatabaseIO::create_subgroup_nl(const std::string &group_name) { bool success = false; if (!is_input()) { // Get existing file pointer... Ioss::SerializeIO serializeIO_(this); - int exoid = get_file_pointer(); + int exoid = get_file_pointer(); // Check name for '/' which is not allowed since it is the // separator character in a full group path @@ -2040,7 +2109,7 @@ namespace Ioex { } // Output field metadata - bool do_metadata = false; + bool do_metadata = true; Ioss::Utils::check_set_bool_property(properties, "OUTPUT_FIELD_METADATA", do_metadata); if (do_metadata) { output_field_metadata(); @@ -3221,13 +3290,29 @@ namespace Ioex { write_coordinate_frames(get_file_pointer(), get_region()->get_coordinate_frames()); } + Ioss::NameList BaseDatabaseIO::internal_change_set_describe_nl(bool return_full_names) + { + Ioss::NameList names = groups_describe(return_full_names); + + // Downshift by 1 since the first is the root group "/" + int numNames = static_cast(names.size()); + for (int i = 0; i < numNames - 1; i++) { + names[i] = names[i + 1]; + } + + if (numNames > 0) { + names.resize(numNames - 1); + } + + return names; + } - Ioss::NameList BaseDatabaseIO::groups_describe_nl(bool return_full_names) + Ioss::NameList BaseDatabaseIO::groups_describe(bool return_full_names) const { Ioss::SerializeIO serializeIO_(this); Ioss::NameList names; - int group_root = ex_inquire_int(get_file_pointer(), EX_INQ_GROUP_ROOT); + int group_root = ex_inquire_int(get_file_pointer(), EX_INQ_GROUP_ROOT); query_groups(group_root, names, return_full_names); return names; @@ -3256,24 +3341,58 @@ namespace Ioex { activeNodeSetNodesIndex.clear(); } - int BaseDatabaseIO::num_child_group_nl() + int BaseDatabaseIO::num_internal_change_set_nl() + { + // Save and reset state + int currentExodusFilePtr = m_exodusFilePtr; + std::string currentGroupName = m_groupName; + + if (!open_root_group_nl()) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Could not open root group.\n", m_groupName); + IOSS_ERROR(errmsg); + } + + int numChildGroup = num_child_group(); + + m_exodusFilePtr = currentExodusFilePtr; + m_groupName = currentGroupName; + + return numChildGroup; + } + + int BaseDatabaseIO::num_child_group() const { Ioss::SerializeIO serializeIO_(this); - int exoid = get_file_pointer(); - exoid = ex_inquire_int(exoid, EX_INQ_GROUP_ROOT); - int num_children = ex_inquire_int(exoid, EX_INQ_NUM_CHILD_GROUPS); + int exoid = get_file_pointer(); + exoid = ex_inquire_int(exoid, EX_INQ_GROUP_ROOT); + int num_children = ex_inquire_int(exoid, EX_INQ_NUM_CHILD_GROUPS); return num_children; } - bool BaseDatabaseIO::open_child_group_nl(int index) + bool BaseDatabaseIO::open_internal_change_set_nl(int index) + { + if (!open_root_group_nl()) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: Could not open root group.\n", m_groupName); + IOSS_ERROR(errmsg); + } + + return open_child_group_nl(index); + } + + bool BaseDatabaseIO::open_child_group_nl(int index) const { - if(index < 0) return false; + if (index < 0) + return false; Ioss::SerializeIO serializeIO_(this); - int exoid = get_file_pointer(); - int num_children = ex_inquire_int(exoid, EX_INQ_NUM_CHILD_GROUPS); - if(num_children == 0) return true; + int exoid = get_file_pointer(); + int num_children = ex_inquire_int(exoid, EX_INQ_NUM_CHILD_GROUPS); + if (num_children == 0) + return true; - if(index >= num_children) return false; + if (index >= num_children) + return false; std::vector children(num_children); @@ -3284,8 +3403,8 @@ namespace Ioex { exoid = children[index]; - int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); - std::vector group_name(group_name_length+1, '\0'); + int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); + std::vector group_name(group_name_length + 1, '\0'); // Get name of this group... int idum; @@ -3296,7 +3415,7 @@ namespace Ioex { } m_exodusFilePtr = exoid; - m_groupName = std::string(group_name.data()); + m_groupName = std::string(group_name.data()); return true; } @@ -3603,13 +3722,13 @@ namespace { #endif } - void query_groups(int exoid, Ioss::NameList& names, bool return_full_names) + void query_groups(int exoid, Ioss::NameList &names, bool return_full_names) { int idum; float rdum; - int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); - std::vector group_name(group_name_length+1, '\0'); + int group_name_length = ex_inquire_int(exoid, EX_INQ_GROUP_NAME_LEN); + std::vector group_name(group_name_length + 1, '\0'); // Get name of this group... int ierr = ex_inquire(exoid, EX_INQ_GROUP_NAME, &idum, &rdum, group_name.data()); @@ -3617,14 +3736,15 @@ namespace { Ioex::exodus_error(exoid, __LINE__, __func__, __FILE__); } - if(return_full_names) { + if (return_full_names) { std::fill(group_name.begin(), group_name.end(), '\0'); ierr = ex_inquire(exoid, EX_INQ_FULL_GROUP_NAME, &idum, &rdum, group_name.data()); if (ierr < 0) { Ioex::exodus_error(exoid, __LINE__, __func__, __FILE__); } names.push_back(std::string(group_name.data())); - } else { + } + else { names.push_back(std::string(group_name.data())); } diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.h b/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.h index b6f18fc75653..f2a0758ebff2 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_BaseDatabaseIO.h @@ -90,6 +90,82 @@ namespace Ioex { // database supports that type (e.g. return_value & Ioss::FACESET) IOSS_NODISCARD unsigned entity_field_support() const override; + IOSS_NODISCARD std::string get_internal_change_set_name() const override { return m_groupName; } + + /** \brief Checks if a database type supports groups + * + * \returns True if successful. + */ + bool supports_group() const; + + /** \brief If a database type supports groups and if the database + * contains groups, open the specified group. + * + * If the group_name begins with '/', it specifies the absolute path + * name from the root with '/' separating groups. Otherwise, the + * group_name specifies a child group of the currently active group. + * If group_name == "/" then the root group is opened. + * + * \param[in] group_name The name of the group to open. + * \returns True if successful. + */ + bool open_group(const std::string &group_name) + { + IOSS_FUNC_ENTER(m_); + return open_group_nl(group_name); + } + + /** \brief If a database type supports groups, create the specified + * group as a child of the current group. + * + * The name of the group must not contain a '/' character. + * If the command is successful, then the group will be the + * active group for all subsequent writes to the database. + * + * \param[in] group_name The name of the subgroup to create. + * \returns True if successful. + */ + bool create_subgroup(const std::string &group_name) + { + IOSS_FUNC_ENTER(m_); + return create_subgroup_nl(group_name); + } + + /** \brief If a database type supports groups, and if the database + * contains groups, open the root group for the current group. + */ + bool open_root_group() + { + IOSS_FUNC_ENTER(m_); + return open_root_group_nl(); + } + + /** \brief If a database type supports groups, and if the database + * contains groups, return the number of child groups for + * the current group. + */ + int num_child_group() const; + + /** \brief If a database type supports groups, open the child group + * of the current group at the specified [zero-based] index + * + * \param[in] child_index The [zero-based] index of the subgroup to open. + * \returns True if successful. + */ + bool open_child_group(int child_index) + { + IOSS_FUNC_ENTER(m_); + return open_child_group_nl(child_index); + } + + /** \brief If a database type supports groups, return a list of group names + * + * \param[in] return_full_names Flag to control return of relative + * or full group name paths. + * \returns True if successful. + */ + Ioss::NameList groups_describe(bool return_full_names = false) const; + protected: // Check to see if database state is ok... // If 'write_message' true, then output a warning message indicating the problem. @@ -101,12 +177,17 @@ namespace Ioex { void release_memory_nl() override; - int num_child_group_nl() override; - bool open_child_group_nl(int index) override; - bool open_root_group_nl() override; - bool open_group_nl(const std::string &group_name) override; - bool create_subgroup_nl(const std::string &group_name) override; - Ioss::NameList groups_describe_nl(bool return_full_names) override; + bool supports_internal_change_set_nl() override; + bool open_internal_change_set_nl(const std::string &set_name) override; + bool open_internal_change_set_nl(int index) override; + bool create_internal_change_set_nl(const std::string &set_name) override; + int num_internal_change_set_nl() override; + Ioss::NameList internal_change_set_describe_nl(bool return_full_names) override; + + bool open_root_group_nl() const; + bool open_group_nl(const std::string &group_name) const; + bool open_child_group_nl(int index) const; + bool create_subgroup_nl(const std::string &group_name); bool begin_nl(Ioss::State state) override; bool end_nl(Ioss::State state) override; diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.C new file mode 100644 index 000000000000..b71bb5d151ee --- /dev/null +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.C @@ -0,0 +1,162 @@ +// Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#include "Ioex_ChangeSet.h" +#include "Ioex_DatabaseIO.h" + +#include "Ioss_CodeTypes.h" // for Int64Vector, IntVector +#include "Ioss_SmartAssert.h" +#include // for assert +#include // for sqrt +#include +#include +#include // for ostringstream +#include +#include // for string, operator==, etc +#include + +#include "Ioss_ChangeSetFactory.h" // for ChangeSetFactory +#include "Ioss_Property.h" // for Property +#include "Ioss_PropertyManager.h" // for PropertyManager +#include "Ioss_Region.h" // for Region + +namespace Ioex { + // ======================================================================== + const ChangeSetFactory *ChangeSetFactory::factory() + { + static ChangeSetFactory registerThis; + return ®isterThis; + } + + ChangeSetFactory::ChangeSetFactory() : Ioss::ChangeSetFactory("exodus") + { + Ioss::ChangeSetFactory::alias("exodus", "exodusii"); + Ioss::ChangeSetFactory::alias("exodus", "exodusII"); + Ioss::ChangeSetFactory::alias("exodus", "genesis"); +#if defined(PARALLEL_AWARE_EXODUS) + Ioss::ChangeSetFactory::alias("exodus", "dof_exodus"); + Ioss::ChangeSetFactory::alias("exodus", "dof"); +#endif + } + + Ioss::ChangeSet *ChangeSetFactory::make_ChangeSet(Ioss::Region *region) const + { + return new ChangeSet(region); + } + + Ioss::ChangeSet *ChangeSetFactory::make_ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount) const + { + return new ChangeSet(db, dbName, dbType, fileCyclicCount); + } + + // ======================================================================== + ChangeSet::ChangeSet(Ioss::Region *region) : Ioss::ChangeSet(region) + { + Ioss::ChangeSet::m_supportedFormats = + (Ioss::CHANGE_SET_INTERNAL_FILES | Ioss::CHANGE_SET_LINEAR_MULTI_FILES | + Ioss::CHANGE_SET_CYCLIC_MULTI_FILES); + } + + ChangeSet::ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, const std::string &dbType, + unsigned fileCyclicCount) + : Ioss::ChangeSet(db, dbName, dbType, fileCyclicCount) + { + Ioss::ChangeSet::m_supportedFormats = + (Ioss::CHANGE_SET_INTERNAL_FILES | Ioss::CHANGE_SET_LINEAR_MULTI_FILES | + Ioss::CHANGE_SET_CYCLIC_MULTI_FILES); + } + + ChangeSet::~ChangeSet() {} + + void ChangeSet::get_group_change_sets() + { + auto iossDB = get_database(); + Ioex::BaseDatabaseIO *ioexDB = dynamic_cast(iossDB); + + if (nullptr == ioexDB) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: The database file named '{}' is not Exodus format\n", + iossDB->get_filename()); + IOSS_ERROR(errmsg); + } + + m_databaseFormat = Ioss::CHANGE_SET_INTERNAL_FILES; + m_currentChangeSet = ioexDB->get_internal_change_set_name(); + + Ioss::NameList names = ioexDB->groups_describe(false); + + // Downshift by 1 since the first is the root group "/" + int numNames = static_cast(names.size()); + for (int i = 0; i < numNames - 1; i++) { + m_changeSetNames.push_back(names[i + 1]); + } + } + + bool ChangeSet::supports_group() + { + auto iossDB = get_database(); + Ioex::BaseDatabaseIO *ioexDB = dynamic_cast(iossDB); + + if (nullptr == ioexDB) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: The database file named '{}' is not Exodus format\n", + iossDB->get_filename()); + IOSS_ERROR(errmsg); + } + + return ioexDB->supports_group() && (ioexDB->num_child_group() > 0); + } + + void ChangeSet::populate_change_sets(bool loadAllFiles) + { + if (supports_group()) { + get_group_change_sets(); + } + else { + Ioss::ChangeSet::populate_change_sets(loadAllFiles); + } + } + + void ChangeSet::clear_change_sets() + { + m_changeSetNames.clear(); + m_currentChangeSet = ""; + } + + void ChangeSet::close_change_set(unsigned index) + { + if (Ioss::CHANGE_SET_INTERNAL_FILES != m_databaseFormat) { + Ioss::ChangeSet::close_change_set(index); + return; + } + + verify_change_set_index(index); + + auto iossDB = get_database(); + if (!iossDB->open_internal_change_set(m_currentChangeSet)) { + std::ostringstream errmsg; + fmt::print(errmsg, "ERROR: The database file named '{}' could not open group '{}\n", + iossDB->get_filename(), m_currentChangeSet); + IOSS_ERROR(errmsg); + } + } + + Ioss::DatabaseIO *ChangeSet::open_change_set(unsigned index, Ioss::DatabaseUsage usage) + { + if (Ioss::CHANGE_SET_INTERNAL_FILES != m_databaseFormat) { + return Ioss::ChangeSet::open_change_set(index, usage); + } + + verify_change_set_index(index); + + auto db = get_database(); + db->open_internal_change_set(index); + + return db; + } +} // namespace Ioex diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.h b/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.h new file mode 100644 index 000000000000..cc0431390171 --- /dev/null +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_ChangeSet.h @@ -0,0 +1,69 @@ +// Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions +// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with +// NTESS, the U.S. Government retains certain rights in this software. +// +// See packages/seacas/LICENSE for details + +#pragma once + +#include "Ioss_ChangeSet.h" // for ChangeSet +#include "Ioss_ChangeSetFactory.h" // for ChangeSetFactory +#include "Ioss_CodeTypes.h" +#include "Ioss_DBUsage.h" // for DatabaseUsage +#include "Ioss_Map.h" // for Map +#include // for size_t +#include // for int64_t +#include // for string +#include // for vector + +#include "Ioss_State.h" // for State +#include "ioex_export.h" + +namespace Ioss { + class Region; +} // namespace Ioss + +/** \brief A namespace for the exodus change set type. + */ +namespace Ioex { + class IOEX_EXPORT ChangeSetFactory : public Ioss::ChangeSetFactory + { + public: + static const ChangeSetFactory *factory(); + + private: + ChangeSetFactory(); + Ioss::ChangeSet *make_ChangeSet(Ioss::Region *region) const override; + Ioss::ChangeSet *make_ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, + const std::string &dbType, + unsigned fileCyclicCount) const override; + }; + + class IOEX_EXPORT ChangeSet : public Ioss::ChangeSet + { + public: + explicit ChangeSet(Ioss::Region *region); + ChangeSet(Ioss::DatabaseIO *db, const std::string &dbName, const std::string &dbType, + unsigned fileCyclicCount); + + ~ChangeSet() override; + + void populate_change_sets(bool loadAllFiles = true) override; + + IOSS_NODISCARD Ioss::DatabaseIO *open_change_set(unsigned index, + Ioss::DatabaseUsage usage) override; + void close_change_set(unsigned index) override; + + private: + ChangeSet() = delete; + ChangeSet(const ChangeSet &) = delete; + + std::string m_currentChangeSet; + + protected: + void get_group_change_sets(); + void clear_change_sets() override; + bool supports_group(); + }; + +} // namespace Ioex diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.C index d84be0925268..0d49fa766328 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.C @@ -171,9 +171,6 @@ namespace Ioex { IOSS_ERROR(errmsg); } } - - open_root_group_nl(); - open_child_group_nl(0); } bool DatabaseIO::check_valid_file_ptr(bool write_message, std::string *error_msg, int *bad_count, @@ -376,6 +373,11 @@ namespace Ioex { if (is_ok) { ex_set_max_name_length(m_exodusFilePtr, maximumNameLength); + if (fileExists) { + open_root_group_nl(); + open_child_group_nl(0); + } + // Check properties handled post-create/open... if (properties.exists("COMPRESSION_METHOD")) { auto method = properties.get("COMPRESSION_METHOD").get_string(); @@ -391,19 +393,50 @@ namespace Ioex { #if NC_HAS_SZIP_WRITE exo_method = EX_COMPRESS_SZIP; #else - fmt::print(Ioss::WarnOut(), "The NetCDF library does not have SZip compression enabled." - " 'zlib' will be used instead.\n\n"); + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), "The NetCDF library does not have SZip compression enabled." + " 'zlib' will be used instead.\n\n"); + } +#endif + } + else if (method == "zstd") { +#if NC_HAS_ZSTD == 1 + exo_method = EX_COMPRESS_ZSTD; +#else + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), + "The NetCDF library does not have ZStandard compression enabled." + " 'zlib' will be used instead.\n\n"); + } +#endif + } + else if (method == "bzip2") { +#if NC_HAS_BZ2 == 1 + exo_method = EX_COMPRESS_BZ2; +#else + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), + "The NetCDF library does not have Bzip2 / BZ2 compression enabled." + " 'zlib' will be used instead.\n\n"); + } #endif } else { - fmt::print(Ioss::WarnOut(), - "Unrecognized compression method specified: '{}'." - " 'zlib' will be used instead.\n\n", - method); + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), + "Unrecognized compression method specified: '{}'." + " 'zlib' will be used instead.\n\n", + method); + } } ex_set_option(m_exodusFilePtr, EX_OPT_COMPRESSION_TYPE, exo_method); } + if (properties.exists("COMPRESSION_QUANTIZE_NSD")) { + int quant_level = properties.get("COMPRESSION_QUANTIZE_NSD").get_int(); + ex_set_option(m_exodusFilePtr, EX_OPT_QUANTIZE_NSD, quant_level); + } + if (properties.exists("COMPRESSION_LEVEL")) { int comp_level = properties.get("COMPRESSION_LEVEL").get_int(); ex_set_option(m_exodusFilePtr, EX_OPT_COMPRESSION_LEVEL, comp_level); @@ -641,17 +674,24 @@ namespace Ioex { } } - void DatabaseIO::get_step_times_nl() + std::vector DatabaseIO::internal_get_step_times_nl(bool setRegionTimeSteps) { - bool exists = false; - double last_time = DBL_MAX; + bool exists = false; + double last_time = DBL_MAX; + int tstepCount = 0; std::vector tsteps(0); + // Use reference to make sure that no Region modifications occur based on the input flag + // setRegionTimeSteps flag determines whether we are actually populating the region + // timesteps or just querying the timesteps that are on a specific database without + // populating the regions timesteps data and setting the number of timesteps on the region + int ×tepCount = setRegionTimeSteps ? m_timestepCount : tstepCount; + if (dbUsage == Ioss::WRITE_HISTORY) { if (myProcessor == 0) { - m_timestepCount = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); - if (m_timestepCount <= 0) { - return; + timestepCount = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); + if (timestepCount <= 0) { + return tsteps; } // For an exodus file, timesteps are global and are stored in the region. @@ -659,57 +699,66 @@ namespace Ioex { // Read the timesteps and add them to the region. // Since we can't access the Region's stateCount directly, we just add // all of the steps and assume the Region is dealing with them directly... - tsteps.resize(m_timestepCount); + tsteps.resize(timestepCount); int error = ex_get_all_times(get_file_pointer(), Data(tsteps)); if (error < 0) { Ioex::exodus_error(get_file_pointer(), __LINE__, __func__, __FILE__); } - int max_step = properties.get_optional("APPEND_OUTPUT_AFTER_STEP", m_timestepCount); - max_step = std::min(max_step, m_timestepCount); + int max_step = properties.get_optional("APPEND_OUTPUT_AFTER_STEP", timestepCount); + max_step = std::min(max_step, timestepCount); double max_time = properties.get_optional("APPEND_OUTPUT_AFTER_TIME", std::numeric_limits::max()); Ioss::Region *this_region = get_region(); + int numSteps = 0; for (int i = 0; i < max_step; i++) { if (tsteps[i] <= max_time) { - this_region->add_state_nl(tsteps[i] * timeScaleFactor); + if (setRegionTimeSteps) { + this_region->add_state_nl(tsteps[i] * timeScaleFactor); + } + + tsteps[i] *= timeScaleFactor; + numSteps++; } } + tsteps.resize(numSteps); } } else { { Ioss::SerializeIO serializeIO_(this); - m_timestepCount = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); - } - // Need to sync timestep count across ranks if parallel... - if (isParallel) { - auto min_timestep_count = util().global_minmax(m_timestepCount, Ioss::ParallelUtils::DO_MIN); - if (min_timestep_count == 0) { - auto max_timestep_count = util().global_minmax(m_timestepCount, Ioss::ParallelUtils::DO_MAX); - if (max_timestep_count != 0) { - if (myProcessor == 0) { - // NOTE: Don't want to warn on all processors if the - // timestep count is zero on some, but not all ranks. - fmt::print(Ioss::WarnOut(), - "At least one database has no timesteps. No times will be read on ANY" - " database for consistency.\n"); - } - } - } - m_timestepCount = min_timestep_count; - } - - if (m_timestepCount <= 0) { - return; + timestepCount = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); + int exTimestepCount = timestepCount; + // Need to sync timestep count across ranks if parallel... + if (isParallel) { + auto min_timestep_count = + util().global_minmax(timestepCount, Ioss::ParallelUtils::DO_MIN); + if (min_timestep_count == 0) { + auto max_timestep_count = + util().global_minmax(timestepCount, Ioss::ParallelUtils::DO_MAX); + if (max_timestep_count != 0) { + if (myProcessor == 0) { + // NOTE: Don't want to warn on all processors if the + // timestep count is zero on some, but not all ranks. + fmt::print(Ioss::WarnOut(), + "At least one database has no timesteps. No times will be read on ANY" + " database for consistency.\n"); + } + } + } + timestepCount = min_timestep_count; + } + + if (timestepCount <= 0) { + return tsteps; } // For an exodus file, timesteps are global and are stored in the region. // Read the timesteps and add to the region - tsteps.resize(m_timestepCount, -std::numeric_limits::max()); + tsteps.resize(exTimestepCount, -std::numeric_limits::max()); // The `EXODUS_CALL_GET_ALL_TIMES=NO` is typically only used in // isSerialParallel mode and the client is responsible for @@ -726,7 +775,6 @@ namespace Ioex { Ioss::Utils::check_set_bool_property(properties, "EXODUS_CALL_GET_ALL_TIMES", call_ex_get_all_times); if (call_ex_get_all_times) { - Ioss::SerializeIO serializeIO_(this); int error = ex_get_all_times(get_file_pointer(), Data(tsteps)); if (error < 0) { Ioex::exodus_error(get_file_pointer(), __LINE__, __func__, __FILE__); @@ -735,11 +783,8 @@ namespace Ioex { // See if the "last_written_time" attribute exists and if it // does, check that it matches the largest time in 'tsteps'. - { - Ioss::SerializeIO serializeIO_(this); - exists = Ioex::read_last_time_attribute(get_file_pointer(), &last_time); - } - + exists = Ioex::read_last_time_attribute(get_file_pointer(), &last_time); + } if (exists && isParallel) { // Assume that if it exists on 1 processor, it exists on // all... Sync value among processors since could have a @@ -759,17 +804,23 @@ namespace Ioex { // One use case is that job is restarting at a time prior to what has been // written to the results file, so want to start appending after // restart time instead of at end time on database. - int max_step = properties.get_optional("APPEND_OUTPUT_AFTER_STEP", m_timestepCount); - max_step = std::min(max_step, m_timestepCount); + int max_step = properties.get_optional("APPEND_OUTPUT_AFTER_STEP", timestepCount); + max_step = std::min(max_step, timestepCount); double max_time = properties.get_optional("APPEND_OUTPUT_AFTER_TIME", std::numeric_limits::max()); last_time = std::min(last_time, max_time); Ioss::Region *this_region = get_region(); + int numSteps = 0; for (int i = 0; i < max_step; i++) { if (tsteps[i] <= last_time) { - this_region->add_state_nl(tsteps[i] * timeScaleFactor); + if (setRegionTimeSteps) { + this_region->add_state_nl(tsteps[i] * timeScaleFactor); + } + + tsteps[i] *= timeScaleFactor; + numSteps++; } else { if (myProcessor == 0 && max_time == std::numeric_limits::max()) { @@ -786,9 +837,20 @@ namespace Ioex { } } } + + tsteps.resize(numSteps); } + + return tsteps; } + std::vector DatabaseIO::get_db_step_times_nl() + { + return internal_get_step_times_nl(false); + } + + void DatabaseIO::get_step_times_nl() { internal_get_step_times_nl(true); } + void DatabaseIO::read_communication_metadata() { // Check that file is nemesis. diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.h b/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.h index 66c87690ad22..bb3699227c99 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_DatabaseIO.h @@ -68,7 +68,9 @@ namespace Ioex { IOSS_NODISCARD int get_file_pointer() const override; // Open file and set exodusFilePtr. private: - void get_step_times_nl() override; + void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; + std::vector internal_get_step_times_nl(bool setRegionTimeSteps); bool open_input_file(bool write_message, std::string *error_msg, int *bad_count, bool abort_if_error) const override; diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_DecompositionData.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_DecompositionData.C index 9097acbe20c8..cb186f8b4e60 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_DecompositionData.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_DecompositionData.C @@ -300,13 +300,15 @@ namespace Ioex { Ioss::Region region(dbi, "line_decomp_region"); - Ioss::DecompUtils::line_decompose( - region, m_processorCount, m_decomposition.m_method, m_decomposition.m_decompExtra, - element_to_proc_global, INT(0)); - - if (m_decomposition.m_showHWM || m_decomposition.m_showProgress) { - Ioss::DecompUtils::output_decomposition_statistics(element_to_proc_global, m_processorCount); - } + Ioss::DecompUtils::line_decompose(region, m_processorCount, m_decomposition.m_method, + m_decomposition.m_decompExtra, element_to_proc_global, + INT(0)); + + if (m_decomposition.m_showHWM || m_decomposition.m_showProgress) { + auto work_per_rank = + Ioss::DecompUtils::get_work_per_rank(element_to_proc_global, m_processorCount); + Ioss::DecompUtils::output_decomposition_statistics(work_per_rank); + } } // Now broadcast the parts of the `element_to_proc_global` // vector to the owning ranks in the initial linear @@ -336,7 +338,7 @@ namespace Ioex { } if (m_decomposition.m_lineDecomp) { - // Do not combine into previous if block since we want to release memory for + // Do not combine into previous if block since we want to release memory for // the local vectors in that block before allocating the large adjacency vector. generate_adjacency_list(filePtr, m_decomposition); } diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_Internals.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_Internals.C index 6644599d1f6a..d938a861906b 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_Internals.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_Internals.C @@ -386,7 +386,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params int status = nc_set_fill(exodusFilePtr, NC_NOFILL, &old_fill); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } status = nc_put_att_text(exodusFilePtr, NC_GLOBAL, "base_database", @@ -397,7 +397,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format( "Error: failed to define 'base_database' attribute to file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Time Dimension... @@ -406,7 +406,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define time dimension in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Name String Length... @@ -417,7 +417,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define 'name string length' in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Nodes (Node Block) ... @@ -429,7 +429,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define number of nodes in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -448,11 +448,11 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define number of elements in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "element block", mesh.elemblocks.size(), DIM_NUM_EL_BLK, VAR_STAT_EL_BLK, VAR_ID_EL_BLK, VAR_NAME_EL_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -469,11 +469,11 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define number of faces in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "face block", mesh.faceblocks.size(), DIM_NUM_FA_BLK, VAR_STAT_FA_BLK, VAR_ID_FA_BLK, VAR_NAME_FA_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -490,11 +490,11 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format("Error: failed to define number of edges in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "edge block", mesh.edgeblocks.size(), DIM_NUM_ED_BLK, VAR_STAT_ED_BLK, VAR_ID_ED_BLK, VAR_NAME_ED_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -503,28 +503,28 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params if (var_params.num_nset > 0) { if (define_netcdf_vars(exodusFilePtr, "node set", mesh.nodesets.size(), DIM_NUM_NS, VAR_NS_STAT, VAR_NS_IDS, VAR_NAME_NS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } if (var_params.num_eset > 0) { if (define_netcdf_vars(exodusFilePtr, "edge set", mesh.edgesets.size(), DIM_NUM_ES, VAR_ES_STAT, VAR_ES_IDS, VAR_NAME_ES) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } if (var_params.num_fset > 0) { if (define_netcdf_vars(exodusFilePtr, "face set", mesh.facesets.size(), DIM_NUM_FS, VAR_FS_STAT, VAR_FS_IDS, VAR_NAME_FS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } if (var_params.num_elset > 0) { if (define_netcdf_vars(exodusFilePtr, "element set", mesh.elemsets.size(), DIM_NUM_ELS, VAR_ELS_STAT, VAR_ELS_IDS, VAR_NAME_ELS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -533,7 +533,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params if (var_params.num_sset > 0) { if (define_netcdf_vars(exodusFilePtr, "side set", mesh.sidesets.size(), DIM_NUM_SS, VAR_SS_STAT, VAR_SS_IDS, VAR_NAME_SS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -592,7 +592,7 @@ int Internals::initialize_state_file(Mesh &mesh, const ex_var_params &var_params std::string errmsg = fmt::format( "Error: failed to define whole time step variable in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } struct exi_file_item *file = exi_find_file_item(exodusFilePtr); @@ -1063,7 +1063,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: initialization already done for file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), EX_MSG); - return (EX_FATAL); + return EX_FATAL; } if (rootid == exodusFilePtr) { @@ -1078,7 +1078,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define title attribute to file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // For use later as a consistency check, define the number of processors and @@ -1091,7 +1091,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format( "Error: failed to define processor info attribute to file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1105,7 +1105,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format( "Error: failed to define 'last_written_time' attribute to file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1120,7 +1120,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format( "Error: failed to define ATT_MAX_NAME_LENGTH attribute to file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } } @@ -1136,7 +1136,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define name string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1146,14 +1146,14 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define number of dimensions in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_def_dim(exodusFilePtr, DIM_TIME, NC_UNLIMITED, &timedim)) != NC_NOERR) { std::string errmsg = fmt::format("Error: failed to define time dimension in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } std::array dim{timedim}; @@ -1162,7 +1162,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format( "Error: failed to define whole time step variable in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { struct exi_file_item *file = exi_find_file_item(exodusFilePtr); @@ -1179,7 +1179,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define number of nodes in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Define the node map here to avoid a later redefine call @@ -1198,7 +1198,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) "Error: failed to create node numbering map array in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); } @@ -1215,7 +1215,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) " in file id {}", static_cast(mesh.nodeblocks[0].id), exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } std::array dims{numnoddim, numattrdim}; @@ -1227,7 +1227,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) fmt::format("Error: failed to define attributes for node block {} in file id {}", mesh.nodeblocks[0].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); @@ -1243,7 +1243,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) " in file id {}", mesh.nodeblocks[0].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } @@ -1261,7 +1261,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define number of elements in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Define the element map here to avoid a later redefine call @@ -1281,7 +1281,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) "Error: failed to create element numbering map in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); } @@ -1300,7 +1300,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define number of faces in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Define the face map here to avoid a later redefine call @@ -1320,7 +1320,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) "Error: failed to create face numbering map in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); } @@ -1339,7 +1339,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define number of edges in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // Define the edge map here to avoid a later redefine call @@ -1359,7 +1359,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) "Error: failed to create edge numbering map in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); } @@ -1369,53 +1369,53 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) // Blocks... if (define_netcdf_vars(exodusFilePtr, "edge block", mesh.edgeblocks.size(), DIM_NUM_ED_BLK, VAR_STAT_ED_BLK, VAR_ID_ED_BLK, VAR_NAME_ED_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "face block", mesh.faceblocks.size(), DIM_NUM_FA_BLK, VAR_STAT_FA_BLK, VAR_ID_FA_BLK, VAR_NAME_FA_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "element block", mesh.elemblocks.size(), DIM_NUM_EL_BLK, VAR_STAT_EL_BLK, VAR_ID_EL_BLK, VAR_NAME_EL_BLK) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // ======================================================================== // Sets... if (define_netcdf_vars(exodusFilePtr, "node set", mesh.nodesets.size(), DIM_NUM_NS, VAR_NS_STAT, VAR_NS_IDS, VAR_NAME_NS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "edge set", mesh.edgesets.size(), DIM_NUM_ES, VAR_ES_STAT, VAR_ES_IDS, VAR_NAME_ES) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "face set", mesh.facesets.size(), DIM_NUM_FS, VAR_FS_STAT, VAR_FS_IDS, VAR_NAME_FS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (define_netcdf_vars(exodusFilePtr, "element set", mesh.elemsets.size(), DIM_NUM_ELS, VAR_ELS_STAT, VAR_ELS_IDS, VAR_NAME_ELS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // ======================================================================== // side sets... if (define_netcdf_vars(exodusFilePtr, "side set", mesh.sidesets.size(), DIM_NUM_SS, VAR_SS_STAT, VAR_SS_IDS, VAR_NAME_SS) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // ======================================================================== if (!mesh.nodeblocks.empty()) { if (define_coordinate_vars(exodusFilePtr, mesh.nodeblocks[0].entityCount, numnoddim, mesh.dimensionality, numdimdim, namestrdim) != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1432,7 +1432,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file ID {}", DIM_NUM_PROCS, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } } @@ -1448,7 +1448,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file ID {}", DIM_NUM_PROCS_F, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1461,7 +1461,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to define file type in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } exi_set_compact_storage(exodusFilePtr, varid); @@ -1482,7 +1482,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file ID {}", DIM_NUM_NODES_GLOBAL, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1496,7 +1496,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file ID {}", DIM_NUM_ELEMS_GLOBAL, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1510,7 +1510,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = define_variables(exodusFilePtr, static_cast(comm.globalElementBlocks), DIM_NUM_ELBLK_GLOBAL, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1525,7 +1525,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = define_variables(exodusFilePtr, static_cast(comm.globalNodeSets), DIM_NUM_NS_GLOBAL, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1540,7 +1540,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = define_variables(exodusFilePtr, static_cast(comm.globalSideSets), DIM_NUM_SS_GLOBAL, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1549,21 +1549,21 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = conditional_define_variable(exodusFilePtr, VAR_INT_N_STAT, dimid_npf, &nodeMapVarID[0], NC_INT); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Border node status status = conditional_define_variable(exodusFilePtr, VAR_BOR_N_STAT, dimid_npf, &nodeMapVarID[1], NC_INT); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // External Node status status = conditional_define_variable(exodusFilePtr, VAR_EXT_N_STAT, dimid_npf, &nodeMapVarID[2], NC_INT); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define the variable IDs for the elemental status vectors @@ -1571,49 +1571,49 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = conditional_define_variable(exodusFilePtr, VAR_INT_E_STAT, dimid_npf, &elementMapVarID[0], NC_INT); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Border elements status = conditional_define_variable(exodusFilePtr, VAR_BOR_E_STAT, dimid_npf, &elementMapVarID[1], NC_INT); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define variable for the internal element information status = define_variable(exodusFilePtr, comm.elementsInternal, DIM_NUM_INT_ELEMS, VAR_ELEM_MAP_INT, bulk_type); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define variable for the border element information status = define_variable(exodusFilePtr, comm.elementsBorder, DIM_NUM_BOR_ELEMS, VAR_ELEM_MAP_BOR, bulk_type); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define variable for vector of internal FEM node IDs status = define_variable(exodusFilePtr, comm.nodesInternal, DIM_NUM_INT_NODES, VAR_NODE_MAP_INT, bulk_type); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define variable for vector of border FEM node IDs status = define_variable(exodusFilePtr, comm.nodesBorder, DIM_NUM_BOR_NODES, VAR_NODE_MAP_BOR, bulk_type); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Define dimension for vector of external FEM node IDs status = define_variable(exodusFilePtr, comm.nodesExternal, DIM_NUM_EXT_NODES, VAR_NODE_MAP_EXT, bulk_type); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1632,7 +1632,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = define_variables(exodusFilePtr, static_cast(comm.nodeMap.size()), DIM_NUM_N_CMAPS, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } { @@ -1642,7 +1642,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) // Add dimensions for all of the nodal communication maps status = define_variables(exodusFilePtr, ncnt_cmap, DIM_NCNT_CMAP, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -1661,7 +1661,7 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) status = define_variables(exodusFilePtr, static_cast(comm.elementMap.size()), DIM_NUM_E_CMAPS, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } { @@ -1670,12 +1670,12 @@ int Internals::put_metadata(const Mesh &mesh, const CommunicationMetaData &comm) const std::array types{ids_type, NC_INT, bulk_type}; status = define_variables(exodusFilePtr, ecnt_cmap, DIM_ECNT_CMAP, Data(vars), Data(types)); if (status != EX_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_metadata(const std::vector &assemblies) @@ -1687,7 +1687,7 @@ int Internals::put_metadata(const std::vector &assemblies) if ((status = exi_check_valid_file_id(exodusFilePtr, __func__)) != EX_NOERR) { std::string errmsg = fmt::format("Error: Invalid exodus file handle: {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int int_type = NC_INT; @@ -1706,7 +1706,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format( "Error: failed to define number of entities in assembly in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } /* create variable array in which to store the entry lists */ @@ -1717,7 +1717,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format( "Error: failed to define entity assembly variable in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, entlst_id, 1); @@ -1734,7 +1734,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format("Error: failed to define '{}' attribute to file id {}", EX_ATTRIBUTE_ID, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int type = assembly.type; @@ -1744,7 +1744,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format("Error: failed to define '{}' attribute to file id {}", EX_ATTRIBUTE_TYPE, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_put_att_text(exodusFilePtr, entlst_id, EX_ATTRIBUTE_NAME, assembly.name.size() + 1, @@ -1754,7 +1754,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format("Error: failed to define '{}' attribute to file id {}", EX_ATTRIBUTE_NAME, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -1766,7 +1766,7 @@ int Internals::put_metadata(const std::vector &assemblies) std::string errmsg = fmt::format("Error: failed to define '{}' attribute to file id {}", EX_ATTRIBUTE_TYPENAME, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1793,7 +1793,7 @@ int Internals::put_metadata(const std::vector &blobs) std::string errmsg = fmt::format("Error: failed to define number \"1\" dimension in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (const auto &blob : blobs) { @@ -1807,7 +1807,7 @@ int Internals::put_metadata(const std::vector &blobs) fmt::format("Error: failed to define number of entries in blob {} in file id {}", blob.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // create a variable just as a way to have a blob and its attributes; values not used for @@ -1819,7 +1819,7 @@ int Internals::put_metadata(const std::vector &blobs) std::string errmsg = fmt::format("Error: failed to create entity for blob {} in file id {}", blob.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, entlst); @@ -1835,7 +1835,7 @@ int Internals::put_metadata(const std::vector &blobs) std::string errmsg = fmt::format("Error: failed to store blob id {} in file id {}", blob.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_put_att_text(exodusFilePtr, entlst, EX_ATTRIBUTE_NAME, blob.name.length() + 1, @@ -1843,10 +1843,10 @@ int Internals::put_metadata(const std::vector &blobs) std::string errmsg = fmt::format("Error: failed to store blob name {} in file id {}", blob.name, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_metadata(const std::vector &blocks, bool count_only) @@ -1854,7 +1854,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl int status = 0; // clear error code if (blocks.empty()) { - return (EX_NOERR); + return EX_NOERR; } int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); @@ -1868,7 +1868,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: no element blocks defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int namestrdim; @@ -1878,7 +1878,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_inq_dimlen(exodusFilePtr, dimid, &num_elem_blk); @@ -1887,7 +1887,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get number of element blocks in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } SMART_ASSERT(blocks.size() == num_elem_blk); @@ -1919,7 +1919,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -1935,7 +1935,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // element connectivity array @@ -1949,7 +1949,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, connid, 1); @@ -1963,7 +1963,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to store element type name {} in file id {}", blocks[iblk].elType, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -1978,7 +1978,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // element->edge connectivity array @@ -1993,7 +1993,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, connid, 1); } @@ -2009,7 +2009,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // element->face connectivity array @@ -2024,7 +2024,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, connid, 1); } @@ -2040,7 +2040,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -2055,7 +2055,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); @@ -2086,13 +2086,13 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_metadata(const std::vector &blocks, bool count_only) @@ -2102,7 +2102,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); if (blocks.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Get number of face blocks defined for this file @@ -2113,7 +2113,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl ex_opts(EX_VERBOSE); std::string errmsg = fmt::format("Error: no face blocks defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int namestrdim; @@ -2123,7 +2123,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_inq_dimlen(exodusFilePtr, dimid, &num_face_blk); @@ -2132,7 +2132,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get number of face blocks in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } SMART_ASSERT(blocks.size() == num_face_blk); @@ -2164,7 +2164,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -2179,7 +2179,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // face attribute array @@ -2193,7 +2193,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -2207,7 +2207,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to define attributes for face block {} in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -2225,7 +2225,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } @@ -2242,7 +2242,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to create connectivity array for block {} in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, connid, 1); @@ -2256,17 +2256,17 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to store element type name {} in file id {}", blocks[iblk].elType, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_metadata(const std::vector &blocks, bool count_only) { if (blocks.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Get number of edge blocks defined for this file @@ -2277,7 +2277,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl ex_opts(EX_VERBOSE); std::string errmsg = fmt::format("Error: no edge blocks defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int namestrdim; @@ -2287,7 +2287,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_inq_dimlen(exodusFilePtr, dimid, &num_edge_blk); @@ -2296,7 +2296,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to get number of edge blocks in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } SMART_ASSERT(blocks.size() == num_edge_blk); @@ -2328,7 +2328,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -2344,7 +2344,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].nodesPerEntity, blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // edge attribute array @@ -2358,7 +2358,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } std::array dims{numelbdim, numattrdim}; @@ -2371,7 +2371,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to define attributes for edge block {} in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); @@ -2388,7 +2388,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl " in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } @@ -2405,7 +2405,7 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl fmt::format("Error: failed to create connectivity array for block {} in file id {}", blocks[iblk].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, connid, 1); @@ -2418,10 +2418,10 @@ int Internals::put_metadata(const std::vector &blocks, bool count_onl std::string errmsg = fmt::format("Error: failed to store element type name {} in file id {}", blocks[iblk].elType, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_nemesis_data) @@ -2438,7 +2438,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format("Error: failed to locate file type in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int lftype = 0; // Parallel file... @@ -2448,7 +2448,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format("Error: unable to output file type variable in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (full_nemesis_data) { @@ -2459,7 +2459,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output status for internal node map in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } nmstat = comm.nodesBorder == 0 ? 0 : 1; @@ -2469,7 +2469,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output status for border node map in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } nmstat = comm.nodesExternal == 0 ? 0 : 1; @@ -2479,7 +2479,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output status for external node map in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } nmstat = comm.elementsInternal == 0 ? 0 : 1; @@ -2489,7 +2489,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output status for internal elem map in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } nmstat = comm.elementsBorder == 0 ? 0 : 1; @@ -2499,7 +2499,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output status for border elem map in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } @@ -2517,7 +2517,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ fmt::format("Error: failed to find variable ID for \"{}\" in file ID {}", VAR_N_COMM_STAT, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } long long nl_ncnt_cmap = 0; @@ -2531,7 +2531,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format("Error: unable to output variable in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // increment to the next starting position @@ -2544,7 +2544,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to locate node communication map in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_put_var1_longlong(exodusFilePtr, commIndexVar, Data(start), &nl_ncnt_cmap); @@ -2553,7 +2553,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output node communication map index in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } // End "for(icm=0; icm < num_n_comm_maps; icm++)" @@ -2563,7 +2563,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ node_cmap_ids[i] = comm.nodeMap[i].id; } if (put_id_array(exodusFilePtr, VAR_N_COMM_IDS, node_cmap_ids) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } // Set the status of the elemental communication maps @@ -2583,7 +2583,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ fmt::format("Error: failed to find variable ID for \"{}\" in file ID {}", VAR_E_COMM_STAT, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } long long nl_ecnt_cmap = 0; // reset this for index @@ -2598,7 +2598,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format("Error: unable to output variable in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // increment to the next starting position @@ -2611,7 +2611,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to locate element communication map in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_put_var1_longlong(exodusFilePtr, elemCommIndexVar, Data(start), &nl_ecnt_cmap); if (status != NC_NOERR) { @@ -2619,7 +2619,7 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ std::string errmsg = fmt::format( "Error: failed to output int elem map index in file ID {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } // End "for(icm=0; icm < num_e_comm_maps; icm++)" @@ -2629,11 +2629,11 @@ int Internals::put_non_define_data(const CommunicationMetaData &comm, bool full_ elem_cmap_ids[i] = comm.elementMap[i].id; } if (put_id_array(exodusFilePtr, VAR_E_COMM_IDS, elem_cmap_ids) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &blobs) @@ -2649,7 +2649,7 @@ int Internals::put_non_define_data(const std::vector &blobs) fmt::format("Error: failed to locate entity list array for blob {} in file id {}", blob.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } long dummy = 0; @@ -2657,7 +2657,7 @@ int Internals::put_non_define_data(const std::vector &blobs) std::string errmsg = fmt::format( "Error: failed to output dummy value for blob {} in file id {}", blob.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } exi_update_max_name_length(exodusFilePtr, name_length); @@ -2679,7 +2679,7 @@ int Internals::put_non_define_data(const std::vector &assemblies) fmt::format("Error: failed to locate entity list for assembly {} in file id {}", assembly.id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if ((status = nc_put_var_longlong(exodusFilePtr, entlst_id, (long long int *)Data(assembly.memberIdList))) != @@ -2708,12 +2708,12 @@ int Internals::put_non_define_data(const std::vector &blocks, bool ou } if (put_id_array(exodusFilePtr, VAR_ID_EL_BLK, elem_blk_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (output_global_data) { if (put_id_array(exodusFilePtr, VAR_ELBLK_IDS_GLOBAL, elem_blk_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } std::vector counts(num_elem_blk); @@ -2721,7 +2721,7 @@ int Internals::put_non_define_data(const std::vector &blocks, bool ou counts[iblk] = blocks[iblk].globalEntityCount; } if (put_int_array(exodusFilePtr, VAR_ELBLK_CNT_GLOBAL, counts) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -2732,7 +2732,7 @@ int Internals::put_non_define_data(const std::vector &blocks, bool ou } if (put_int_array(exodusFilePtr, VAR_STAT_EL_BLK, elem_blk_status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // TODO: Is this code correct? `text` is never set... @@ -2749,7 +2749,7 @@ int Internals::put_non_define_data(const std::vector &blocks, bool ou std::string errmsg = fmt::format( "Error: failed to locate variable name attribute in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < blocks[iblk].attributeCount; i++) { @@ -2759,7 +2759,7 @@ int Internals::put_non_define_data(const std::vector &blocks, bool ou } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &blocks) @@ -2774,7 +2774,7 @@ int Internals::put_non_define_data(const std::vector &blocks) } if (put_id_array(exodusFilePtr, VAR_ID_FA_BLK, face_blk_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Now, write the face block status array @@ -2784,7 +2784,7 @@ int Internals::put_non_define_data(const std::vector &blocks) } if (put_int_array(exodusFilePtr, VAR_STAT_FA_BLK, face_blk_status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // TODO: Is this code correct? `text` is never set... @@ -2801,7 +2801,7 @@ int Internals::put_non_define_data(const std::vector &blocks) std::string errmsg = fmt::format( "Error: failed to locate face variable name attribute in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < blocks[iblk].attributeCount; i++) { @@ -2811,7 +2811,7 @@ int Internals::put_non_define_data(const std::vector &blocks) } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &blocks) @@ -2826,7 +2826,7 @@ int Internals::put_non_define_data(const std::vector &blocks) } if (put_id_array(exodusFilePtr, VAR_ID_ED_BLK, edge_blk_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Now, write the edge block status array @@ -2836,7 +2836,7 @@ int Internals::put_non_define_data(const std::vector &blocks) } if (put_int_array(exodusFilePtr, VAR_STAT_ED_BLK, edge_blk_status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // TODO: Is this code correct? `text` is never set... @@ -2853,7 +2853,7 @@ int Internals::put_non_define_data(const std::vector &blocks) fmt::format("Error: failed to locate element variable name attribute in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < blocks[iblk].attributeCount; i++) { @@ -2863,14 +2863,14 @@ int Internals::put_non_define_data(const std::vector &blocks) } } } - return (EX_NOERR); + return EX_NOERR; } // ======================================================================== int Internals::put_metadata(const std::vector &nodesets, bool count_only) { if (nodesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); @@ -2890,7 +2890,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl fmt::format("Error: failed to locate node sets defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // inquire how many node sets are to be stored @@ -2903,7 +2903,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } SMART_ASSERT(static_cast(nodesets.size()) == num_node_sets); @@ -2933,7 +2933,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -2958,7 +2958,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -2973,7 +2973,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl nodesets[i].dfCount, nodesets[i].entityCount, nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // create variable for distribution factors status = nc_def_var(exodusFilePtr, VAR_FACT_NS(cur_num_node_sets + 1), @@ -2992,7 +2992,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3008,7 +3008,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl " in file id {}", nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -3022,7 +3022,7 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl " in file id {}", nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3040,20 +3040,20 @@ int Internals::put_metadata(const std::vector &nodesets, bool count_onl " in file id {}", nodesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } } } - return (EX_NOERR); + return EX_NOERR; } // ======================================================================== int Internals::put_metadata(const std::vector &edgesets, bool count_only) { if (edgesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); @@ -3072,7 +3072,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl fmt::format("Error: failed to locate edge sets defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // inquire how many edge sets are to be stored @@ -3087,7 +3087,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < num_edge_sets; i++) { @@ -3115,7 +3115,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -3140,7 +3140,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3161,7 +3161,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3176,7 +3176,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl edgesets[i].dfCount, edgesets[i].entityCount, edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // create variable for distribution factors status = nc_def_var(exodusFilePtr, VAR_FACT_ES(cur_num_edge_sets + 1), @@ -3195,7 +3195,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3210,7 +3210,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl " in file id {}", edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -3224,7 +3224,7 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl " in file id {}", edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3242,20 +3242,20 @@ int Internals::put_metadata(const std::vector &edgesets, bool count_onl " in file id {}", edgesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } } } - return (EX_NOERR); + return EX_NOERR; } // ======================================================================== int Internals::put_metadata(const std::vector &facesets, bool count_only) { if (facesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); @@ -3274,7 +3274,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl fmt::format("Error: failed to locate face sets defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // inquire how many face sets are to be stored @@ -3289,7 +3289,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < num_face_sets; i++) { @@ -3317,7 +3317,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -3342,7 +3342,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3363,7 +3363,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3378,7 +3378,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl facesets[i].dfCount, facesets[i].entityCount, facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // create variable for distribution factors status = nc_def_var(exodusFilePtr, VAR_FACT_FS(cur_num_face_sets + 1), @@ -3397,7 +3397,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3412,7 +3412,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl " in file id {}", facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -3426,7 +3426,7 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl " in file id {}", facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3444,20 +3444,20 @@ int Internals::put_metadata(const std::vector &facesets, bool count_onl " in file id {}", facesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } } } - return (EX_NOERR); + return EX_NOERR; } // ======================================================================== int Internals::put_metadata(const std::vector &elemsets, bool count_only) { if (elemsets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Get number of element sets defined for this file int dimid; @@ -3475,7 +3475,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl fmt::format("Error: failed to locate element sets defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // inquire how many element sets are to be stored @@ -3490,7 +3490,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } for (int i = 0; i < num_elem_sets; i++) { @@ -3518,7 +3518,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -3544,7 +3544,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3559,7 +3559,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl elemsets[i].dfCount, elemsets[i].entityCount, elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // create variable for distribution factors status = nc_def_var(exodusFilePtr, VAR_FACT_ELS(cur_num_elem_sets + 1), @@ -3578,7 +3578,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3593,7 +3593,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl " in file id {}", elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } { @@ -3607,7 +3607,7 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl " in file id {}", elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -3625,19 +3625,19 @@ int Internals::put_metadata(const std::vector &elemsets, bool count_onl " in file id {}", elemsets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); } } } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &nodesets, bool output_global_data) { if (nodesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Output nodeset ids... @@ -3648,12 +3648,12 @@ int Internals::put_non_define_data(const std::vector &nodesets, bool ou } if (put_id_array(exodusFilePtr, VAR_NS_IDS, nodeset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (output_global_data) { if (put_id_array(exodusFilePtr, VAR_NS_IDS_GLOBAL, nodeset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } std::vector counts(num_nodesets); @@ -3661,7 +3661,7 @@ int Internals::put_non_define_data(const std::vector &nodesets, bool ou counts[iset] = nodesets[iset].globalEntityCount; } if (put_int_array(exodusFilePtr, VAR_NS_NODE_CNT_GLOBAL, counts) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -3672,16 +3672,16 @@ int Internals::put_non_define_data(const std::vector &nodesets, bool ou } if (put_int_array(exodusFilePtr, VAR_NS_STAT, status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &edgesets) { if (edgesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Output edgeset ids... @@ -3692,7 +3692,7 @@ int Internals::put_non_define_data(const std::vector &edgesets) } if (put_id_array(exodusFilePtr, VAR_ES_IDS, edgeset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Now, write the status array @@ -3702,16 +3702,16 @@ int Internals::put_non_define_data(const std::vector &edgesets) } if (put_int_array(exodusFilePtr, VAR_ES_STAT, status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &facesets) { if (facesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Output faceset ids... @@ -3722,7 +3722,7 @@ int Internals::put_non_define_data(const std::vector &facesets) } if (put_id_array(exodusFilePtr, VAR_FS_IDS, faceset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Now, write the status array @@ -3732,16 +3732,16 @@ int Internals::put_non_define_data(const std::vector &facesets) } if (put_int_array(exodusFilePtr, VAR_FS_STAT, status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &elemsets) { if (elemsets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Output elemset ids... @@ -3752,7 +3752,7 @@ int Internals::put_non_define_data(const std::vector &elemsets) } if (put_id_array(exodusFilePtr, VAR_ELS_IDS, elemset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } // Now, write the status array @@ -3762,17 +3762,17 @@ int Internals::put_non_define_data(const std::vector &elemsets) } if (put_int_array(exodusFilePtr, VAR_ELS_STAT, status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } // ======================================================================== int Internals::put_metadata(const std::vector &sidesets, bool count_only) { if (sidesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } int bulk_type = get_type(exodusFilePtr, EX_BULK_INT64_DB); @@ -3791,7 +3791,7 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl fmt::format("Error: failed to locate side sets defined in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // inquire how many side sets are to be stored @@ -3824,7 +3824,7 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl sidesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } if (count_only) { continue; @@ -3848,7 +3848,7 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl sidesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3869,7 +3869,7 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl sidesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); @@ -3891,7 +3891,7 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl sidesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } // create distribution factor list variable for side set @@ -3913,18 +3913,18 @@ int Internals::put_metadata(const std::vector &sidesets, bool count_onl sidesets[i].id, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); } - return (EX_FATAL); + return EX_FATAL; } } exi_compress_variable(exodusFilePtr, varid, 2); } - return (EX_NOERR); + return EX_NOERR; } int Internals::put_non_define_data(const std::vector &sidesets, bool output_global_data) { if (sidesets.empty()) { - return (EX_NOERR); + return EX_NOERR; } // Output sideset ids... @@ -3935,12 +3935,12 @@ int Internals::put_non_define_data(const std::vector &sidesets, bool ou } if (put_id_array(exodusFilePtr, VAR_SS_IDS, sideset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } if (output_global_data) { if (put_id_array(exodusFilePtr, VAR_SS_IDS_GLOBAL, sideset_id) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } std::vector counts(num_sidesets); @@ -3948,7 +3948,7 @@ int Internals::put_non_define_data(const std::vector &sidesets, bool ou counts[iset] = sidesets[iset].globalEntityCount; } if (put_int_array(exodusFilePtr, VAR_SS_SIDE_CNT_GLOBAL, counts) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } } @@ -3959,10 +3959,10 @@ int Internals::put_non_define_data(const std::vector &sidesets, bool ou } if (put_int_array(exodusFilePtr, VAR_SS_STAT, status) != NC_NOERR) { - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } namespace { @@ -3986,7 +3986,7 @@ namespace { } return (ex_put_names(exoid, ent_type, Data(names))); } - return (EX_NOERR); + return EX_NOERR; } int conditional_define_variable(int exodusFilePtr, const char *var, int dimid, int *varid, @@ -4000,11 +4000,11 @@ namespace { std::string errmsg = fmt::format("Error: Failed to define variable \"{}\" in file ID {}", var, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } } exi_compress_variable(exodusFilePtr, *varid, 1); - return (EX_NOERR); + return EX_NOERR; } int define_variable(int exodusFilePtr, int64_t size, const char *dim, const char *var, @@ -4019,7 +4019,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file id {}", DIM_NUM_BOR_ELEMS, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int varid; @@ -4029,11 +4029,11 @@ namespace { std::string errmsg = fmt::format("Error: failed to define variable \"{}\" in file ID {}", VAR_ELEM_MAP_BOR, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 1); } - return (EX_NOERR); + return EX_NOERR; } int define_variables(int exodusFilePtr, int64_t size, const char *dim, const char *var[], @@ -4047,7 +4047,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to dimension \"{}\" in file id {}", DIM_NUM_BOR_ELEMS, exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int i = 0; @@ -4059,13 +4059,13 @@ namespace { std::string errmsg = fmt::format("Error: failed to define variable \"{}\" in file ID {}", var[i], exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); i++; } } - return (EX_NOERR); + return EX_NOERR; } int put_int_array(int exoid, const char *var_type, const std::vector &array) @@ -4076,7 +4076,7 @@ namespace { ex_opts(EX_VERBOSE); std::string errmsg = fmt::format("Error: failed to locate {} in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_put_var_int(exoid, var_id, Data(array)); @@ -4085,9 +4085,9 @@ namespace { std::string errmsg = fmt::format("Error: failed to write {} array in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int put_int_array(int exoid, const char *var_type, const std::vector &array) @@ -4098,7 +4098,7 @@ namespace { ex_opts(EX_VERBOSE); std::string errmsg = fmt::format("Error: failed to locate {} in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_put_var_longlong(exoid, var_id, (long long *)Data(array)); @@ -4107,9 +4107,9 @@ namespace { std::string errmsg = fmt::format("Error: failed to write {} array in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int put_id_array(int exoid, const char *var_type, const std::vector &ids) @@ -4120,7 +4120,7 @@ namespace { ex_opts(EX_VERBOSE); std::string errmsg = fmt::format("Error: failed to locate {} in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } int id_type = get_type(exoid, EX_IDS_INT64_API); @@ -4147,9 +4147,9 @@ namespace { std::string errmsg = fmt::format("Error: failed to write {} array in file id {}", var_type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } - return (EX_NOERR); + return EX_NOERR; } int define_coordinate_vars(int exodusFilePtr, int64_t nodes, int node_dim, int dimension, @@ -4168,7 +4168,7 @@ namespace { std::string errmsg = fmt::format( "Error: failed to define node x coordinate array in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -4181,7 +4181,7 @@ namespace { std::string errmsg = fmt::format( "Error: failed to define node y coordinate array in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -4194,7 +4194,7 @@ namespace { std::string errmsg = fmt::format( "Error: failed to define node z coordinate array in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_compress_variable(exodusFilePtr, varid, 2); } @@ -4209,10 +4209,10 @@ namespace { std::string errmsg = fmt::format("Error: failed to define coordinate name array in file id {}", exodusFilePtr); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exodusFilePtr, varid); - return (EX_NOERR); + return EX_NOERR; } int define_netcdf_vars(int exoid, const char *type, size_t count, const char *dim_num, @@ -4231,7 +4231,7 @@ namespace { if (status != NC_NOERR) { std::string errmsg = fmt::format("Error: failed to get string length in file id {}", exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } status = nc_def_dim(exoid, dim_num, count, &dimid); @@ -4240,7 +4240,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to define number of {}s in file id {}", type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } // id status array: @@ -4251,7 +4251,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to define side {} status in file id {}", type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (count * 4 < sixty_four_kb) { exi_set_compact_storage(exoid, varid); @@ -4266,7 +4266,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to define {} property in file id {}", type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (count * ids_size < sixty_four_kb) { exi_set_compact_storage(exoid, varid); @@ -4279,7 +4279,7 @@ namespace { std::string errmsg = fmt::format("Error: failed to store {} property name {} in file id {}", type, "ID", exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } if (name_var != nullptr) { @@ -4290,10 +4290,10 @@ namespace { std::string errmsg = fmt::format("Error: failed to define {} name array in file id {}", type, exoid); ex_err_fn(exoid, __func__, errmsg.c_str(), status); - return (EX_FATAL); + return EX_FATAL; } exi_set_compact_storage(exoid, varid); } - return (EX_NOERR); + return EX_NOERR; } } // namespace diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.C index b4c093182a37..8a73c77d3764 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.C @@ -399,6 +399,9 @@ namespace Ioex { } } } + + open_root_group_nl(); + open_child_group_nl(0); } ParallelDatabaseIO::~ParallelDatabaseIO() = default; @@ -553,7 +556,7 @@ namespace Ioex { #if !defined(__IOSS_WINDOWS__) if (!path.empty()) { - chdir(current_cwd); + (void)chdir(current_cwd); } std::free(current_cwd); #endif @@ -629,7 +632,7 @@ namespace Ioex { std::string path = file.pathname(); filename = file.tailname(); char *current_cwd = getcwd(nullptr, 0); - chdir(path.c_str()); + (void)chdir(path.c_str()); #endif bool do_timer = false; @@ -684,7 +687,7 @@ namespace Ioex { } #if !defined(__IOSS_WINDOWS__) - chdir(current_cwd); + (void)chdir(current_cwd); std::free(current_cwd); #endif @@ -693,6 +696,11 @@ namespace Ioex { if (is_ok) { ex_set_max_name_length(m_exodusFilePtr, maximumNameLength); + if (fileExists) { + open_root_group_nl(); + open_child_group_nl(0); + } + // Check properties handled post-create/open... if (properties.exists("COMPRESSION_METHOD")) { auto method = properties.get("COMPRESSION_METHOD").get_string(); @@ -712,6 +720,28 @@ namespace Ioex { fmt::print(Ioss::WarnOut(), "The NetCDF library does not have SZip compression enabled." " 'zlib' will be used instead.\n\n"); } +#endif + } + else if (method == "zstd") { +#if NC_HAS_ZSTD == 1 + exo_method = EX_COMPRESS_ZSTD; +#else + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), + "The NetCDF library does not have ZStandard compression enabled." + " 'zlib' will be used instead.\n\n"); + } +#endif + } + else if (method == "bzip2") { +#if NC_HAS_BZ2 == 1 + exo_method = EX_COMPRESS_BZ2; +#else + if (myProcessor == 0) { + fmt::print(Ioss::WarnOut(), + "The NetCDF library does not have Bzip2 / BZ2 compression enabled." + " 'zlib' will be used instead.\n\n"); + } #endif } else { @@ -724,6 +754,12 @@ namespace Ioex { } ex_set_option(m_exodusFilePtr, EX_OPT_COMPRESSION_TYPE, exo_method); } + + if (properties.exists("COMPRESSION_QUANTIZE_NSD")) { + int quant_level = properties.get("COMPRESSION_QUANTIZE_NSD").get_int(); + ex_set_option(m_exodusFilePtr, EX_OPT_QUANTIZE_NSD, quant_level); + } + if (properties.exists("COMPRESSION_LEVEL")) { int comp_level = properties.get("COMPRESSION_LEVEL").get_int(); ex_set_option(m_exodusFilePtr, EX_OPT_COMPRESSION_LEVEL, comp_level); @@ -913,17 +949,20 @@ namespace Ioex { } } - void ParallelDatabaseIO::get_step_times_nl() + std::vector ParallelDatabaseIO::internal_get_step_times_nl(bool setRegionTimeSteps) { double last_time = DBL_MAX; + int tstepCount = 0; int timestep_count = 0; std::vector tsteps(0); + int &l_timestepCount = setRegionTimeSteps ? m_timestepCount : tstepCount; + { - timestep_count = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); - m_timestepCount = timestep_count; + timestep_count = ex_inquire_int(get_file_pointer(), EX_INQ_TIME); + l_timestepCount = timestep_count; if (timestep_count <= 0) { - return; + return tsteps; } // For an exodusII file, timesteps are global and are stored in the region. @@ -959,9 +998,15 @@ namespace Ioex { last_time = std::min(last_time, max_time); Ioss::Region *this_region = get_region(); + int numSteps = 0; for (int i = 0; i < max_step; i++) { if (tsteps[i] <= last_time) { - this_region->add_state(tsteps[i] * timeScaleFactor); + if (setRegionTimeSteps) { + this_region->add_state(tsteps[i] * timeScaleFactor); + } + + tsteps[i] *= timeScaleFactor; + numSteps++; } else { if (myProcessor == 0 && max_time == std::numeric_limits::max()) { @@ -977,8 +1022,18 @@ namespace Ioex { } } } + + tsteps.resize(numSteps); + return tsteps; + } + + std::vector ParallelDatabaseIO::get_db_step_times_nl() + { + return internal_get_step_times_nl(false); } + void ParallelDatabaseIO::get_step_times_nl() { internal_get_step_times_nl(true); } + const Ioss::Map &ParallelDatabaseIO::get_map(ex_entity_type type) const { switch (type) { @@ -3972,13 +4027,13 @@ namespace Ioex { index += comp_count; } } - auto eb_offset = - eb->get_offset(); // Offset of beginning of the element block elements for this block - int index = -1 * (field.get_index() + - comp); // Negative since specifying index, not id to exodus API. + int map_index = -1 * (field.get_index() + + comp); // Negative since specifying index, not id to exodus API. - ierr = ex_put_partial_num_map(get_file_pointer(), EX_ELEM_MAP, index, - proc_offset + eb_offset + 1, file_count, component.data()); + size_t global_map_offset = eb->get_property("global_map_offset").get_int(); + ierr = ex_put_partial_num_map(get_file_pointer(), EX_ELEM_MAP, map_index, + global_map_offset + proc_offset + 1, file_count, + component.data()); } } else if (role == Ioss::Field::ATTRIBUTE) { @@ -4805,11 +4860,10 @@ namespace Ioex { return num_to_get; } - template - void ParallelDatabaseIO::output_processor_id_map(Ioss::Region *region, INT /*dummy*/) + template void ParallelDatabaseIO::output_processor_id_map(Ioss::Region *region) { std::vector proc_id(elementCount, myProcessor); - const auto &blocks = region->get_element_blocks(); + const auto &blocks = region->get_element_blocks(); for (const auto &block : blocks) { put_field_internal(block, block->get_field("proc_id"), Data(proc_id), 0); } @@ -4870,10 +4924,10 @@ namespace Ioex { add_processor_id_map(region); output_other_metadata(); if (int_byte_size_api() == 8) { - output_processor_id_map(region, int64_t(0)); + output_processor_id_map(region); } else { - output_processor_id_map(region, int(0)); + output_processor_id_map(region); } } } diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.h b/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.h index 2ab679de5414..e537c7c2cde3 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_ParallelDatabaseIO.h @@ -85,6 +85,10 @@ namespace Ioex { void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; + + std::vector internal_get_step_times_nl(bool setRegionTimeSteps); + bool open_input_file(bool write_message, std::string *error_msg, int *bad_count, bool abort_if_error) const override; bool handle_output_file(bool write_message, std::string *error_msg, int *bad_count, @@ -197,8 +201,7 @@ namespace Ioex { void write_entity_transient_field(const Ioss::Field &field, const Ioss::GroupingEntity *ge, int64_t count, void *variables) const; void write_meta_data(Ioss::IfDatabaseExistsBehavior behavior) override; - template - void output_processor_id_map(Ioss::Region *region, INT /*dummy*/); + template void output_processor_id_map(Ioss::Region *region); // Read related metadata and store it in the region... void read_region(); diff --git a/packages/seacas/libraries/ioss/src/exodus/Ioex_Utils.C b/packages/seacas/libraries/ioss/src/exodus/Ioex_Utils.C index 12ac92d9e6b0..8cf3cf2b3f8f 100644 --- a/packages/seacas/libraries/ioss/src/exodus/Ioex_Utils.C +++ b/packages/seacas/libraries/ioss/src/exodus/Ioex_Utils.C @@ -16,8 +16,8 @@ #include #include #include -#include #include +#include #include "Ioss_BasisVariableType.h" #include "Ioss_CoordinateFrame.h" diff --git a/packages/seacas/libraries/ioss/src/exonull/Ioexnl_Utils.C b/packages/seacas/libraries/ioss/src/exonull/Ioexnl_Utils.C index 52f3d0f48f92..b724bc209884 100644 --- a/packages/seacas/libraries/ioss/src/exonull/Ioexnl_Utils.C +++ b/packages/seacas/libraries/ioss/src/exonull/Ioexnl_Utils.C @@ -207,7 +207,7 @@ namespace Ioexnl { auto errmsg = fmt::format("Error: failed to read processor info attribute from file {}", filename); ex_err_fn(exodusFilePtr, __func__, errmsg.c_str(), status); - return (EX_FATAL) != 0; + return EX_FATAL != 0; } } return matches; @@ -488,7 +488,7 @@ namespace Ioexnl { } nodes.resize(active); nodes.shrink_to_fit(); // shrink to fit - return (active != orig_size); + return active != orig_size; } void filter_element_list(Ioss::Region *region, Ioss::Int64Vector &elements, diff --git a/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.C b/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.C index bf294cbd2e85..5c3dbb5b68ad 100644 --- a/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.C @@ -351,6 +351,35 @@ mpisyncstart.enable true // } } + std::vector DatabaseIO::get_db_step_times_nl() + { + std::vector tsteps; + auto search_key = make_states_search_key(parallel_rank(), *get_region()); + kelpie::ObjectCapacities oc; + pool.List(search_key, &oc); + if (oc.keys.size() == 1) { + lunasa::DataObject ldo; + pool.Need(oc.keys[0], oc.capacities[0], &ldo); + + auto meta = static_cast(ldo.GetMetaPtr()); + + auto entry = static_cast( + static_cast(static_cast(ldo.GetDataPtr()) + meta->value.offset)); + + auto data = static_cast( + static_cast(entry->data + entry->value.offset)); + + for (size_t state(1); state <= entry->count; state++) + tsteps.push_back(data[state - 1]); + } + // TODO + // else { + // Report error of not having 1 set of time steps + // } + + return tsteps; + } + void DatabaseIO::read_region() { diff --git a/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.h b/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.h index 7a609f2f3612..43b668e40403 100644 --- a/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/faodel/Iofaodel_DatabaseIO.h @@ -126,6 +126,8 @@ namespace Iofaodel { */ void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; + void get_edgeblocks(); void get_elemblocks(); void get_faceblocks(); diff --git a/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.C b/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.C index 4e0cf39be10f..34e57cb33692 100644 --- a/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.C @@ -489,6 +489,20 @@ namespace Iogs { } } + std::vector DatabaseIO::get_db_step_times_nl() + { + std::vector timesteps; + + int time_step_count = m_generatedMesh->timestep_count(); + timesteps.reserve(time_step_count); + + for (int i = 0; i < time_step_count; i++) { + timesteps.push_back(i); + } + + return timesteps; + } + void DatabaseIO::get_structured_blocks() { // Name, global range, local offset, local range. diff --git a/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.h b/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.h index 3a71d0a4809c..fe264d3a7be8 100644 --- a/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/gen_struc/Iogs_DatabaseIO.h @@ -97,7 +97,9 @@ namespace Iogs { bool begin_state_nl(int state, double time) override; - void get_step_times_nl() override; + void get_step_times_nl() override; + std::vector get_db_step_times_nl() override; + void get_nodeblocks(); void get_structured_blocks(); void get_nodesets(); diff --git a/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.C b/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.C index aab00bca2ba1..df82f3793a99 100644 --- a/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.C +++ b/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.C @@ -590,6 +590,19 @@ namespace Iogn { } } + std::vector DatabaseIO::get_db_step_times_nl() + { + std::vector timesteps; + + int time_step_count = m_generatedMesh->timestep_count(); + timesteps.reserve(time_step_count); + for (int i = 0; i < time_step_count; i++) { + timesteps.push_back(i); + } + + return timesteps; + } + void DatabaseIO::get_elemblocks() { // Attributes of an element block are: diff --git a/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.h b/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.h index 7ee2e5048815..a7643bd9de6a 100644 --- a/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.h +++ b/packages/seacas/libraries/ioss/src/generated/Iogn_DatabaseIO.h @@ -106,7 +106,10 @@ namespace Iogn { bool begin_state_nl(int state, double time) override; - void get_step_times_nl() override; + void get_step_times_nl() override; + + std::vector get_db_step_times_nl() override; + void get_nodeblocks(); void get_elemblocks(); void get_nodesets(); diff --git a/packages/seacas/libraries/ioss/src/init/Ionit_Initializer.C b/packages/seacas/libraries/ioss/src/init/Ionit_Initializer.C index 47be56adea03..3c3ace3a8c65 100644 --- a/packages/seacas/libraries/ioss/src/init/Ionit_Initializer.C +++ b/packages/seacas/libraries/ioss/src/init/Ionit_Initializer.C @@ -9,6 +9,7 @@ #include "Ioss_CodeTypes.h" #if defined(SEACAS_HAVE_EXODUS) +#include "exodus/Ioex_ChangeSet.h" #include "exodus/Ioex_IOFactory.h" #if defined(SEACAS_HAVE_EXONULL) #include "exonull/Ioexnl_IOFactory.h" @@ -49,7 +50,8 @@ #include "Ioss_IOFactory.h" -#include "Ioss_DynamicTopology.h" +#include "Ioss_ChangeSetFactory.h" +#include "Ioss_DynamicTopologyBroker.h" namespace { #if defined(IOSS_THREADSAFE) @@ -76,6 +78,7 @@ namespace Ioss::Init { #if defined(SEACAS_HAVE_EXODUS) Ioex::IOFactory::factory(); // Exodus + Ioex::ChangeSetFactory::factory(); #if defined(SEACAS_HAVE_EXONULL) Ioexnl::IOFactory::factory(); #endif @@ -101,6 +104,7 @@ namespace Ioss::Init { Ionull::IOFactory::factory(); Ioss::StorageInitializer(); Ioss::DynamicTopologyBroker::broker(); + Ioss::ChangeSetFactory::factory(); Ioss::Initializer(); Iotr::Initializer(); #ifdef HAVE_SEACASIOSS_ADIOS2 diff --git a/packages/seacas/libraries/ioss/src/main/CMakeLists.txt b/packages/seacas/libraries/ioss/src/main/CMakeLists.txt index dc447fa7d40e..b3a0b5cb6376 100644 --- a/packages/seacas/libraries/ioss/src/main/CMakeLists.txt +++ b/packages/seacas/libraries/ioss/src/main/CMakeLists.txt @@ -105,9 +105,11 @@ if (TPL_ENABLE_MPI) set(JOIN_ARG "--compose=mpiio") set(PJOIN_ARG "--compose=pnetcdf") set(NPROCS "1") + set(NPROCS_BUG "1") set(SERIALIZE_ARG "--serialize_io_size=2") else() set(NPROCS "1") + set(NPROCS_BUG "1") endif() endif() @@ -124,6 +126,37 @@ TRIBITS_ADD_ADVANCED_TEST(exodus32_to_exodus32 XHOSTTYPE Windows ) + if (TPL_Netcdf_Enables_Netcdf4) + SET(IOSHELL_ARG --split_times 1 --in_type generated 10x10x10+shell:xXyYzZ+times:4+variables:element,2,nodal,3) + TRIBITS_ADD_ADVANCED_TEST( + io_shell_group_ungroup + TEST_0 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS ${IOSHELL_ARG} splits.g + TEST_1 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS splits.g_1 splits.g_2 splits.g_3 splits.g_4 grouped.g + TEST_2 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS --extract_group splits.g_1 grouped.g split-extract.g_1 + TEST_3 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS --extract_group splits.g_2 grouped.g split-extract.g_2 + TEST_4 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS --extract_group splits.g_3 grouped.g split-extract.g_3 + TEST_5 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS --extract_group splits.g_4 grouped.g split-extract.g_4 + TEST_6 EXEC exodiff ARGS -pedantic splits.g_1 split-extract.g_1 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_7 EXEC exodiff ARGS -pedantic splits.g_2 split-extract.g_2 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_8 EXEC exodiff ARGS -pedantic splits.g_3 split-extract.g_3 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_9 EXEC exodiff ARGS -pedantic splits.g_4 split-extract.g_4 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + COMM serial + FINAL_PASS_REGULAR_EXPRESSION + ) + endif() + if (TPL_ENABLE_MPI) IF (TPL_Netcdf_PARALLEL) TRIBITS_ADD_ADVANCED_TEST(exodus_fpp_serialize @@ -133,7 +166,7 @@ if (TPL_ENABLE_MPI) TEST_1 EXEC io_shell ARGS ${JOIN_ARG} ${SERIALIZE_ARG} 8-block32-ser.g 8-block-32-serj.g NOEXEPREFIX NOEXESUFFIX NUM_MPI_PROCS ${NPROCS} - TEST_2 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/8-block.g 8-block-32-serj.g + TEST_2 EXEC exodiff ARGS -map -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/8-block.g 8-block-32-serj.g DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX NUM_MPI_PROCS 1 @@ -199,6 +232,37 @@ IF (SEACASIoss_ENABLE_THREADSAFE) COMM mpi serial FINAL_PASS_REGULAR_EXPRESSION ) + + if (TPL_Netcdf_Enables_Netcdf4) + SET(IOSHELL_ARG --split_times 1 --in_type generated 10x10x10+shell:xXyYzZ+times:4+variables:element,2,nodal,3) + TRIBITS_ADD_ADVANCED_TEST( + io_shell_ts_group_ungroup + TEST_0 NOEXEPREFIX NOEXESUFFIX EXEC io_shell ARGS ${IOSHELL_ARG} splits_ts.g + TEST_1 NOEXEPREFIX NOEXESUFFIX EXEC io_shell_ts ARGS splits_ts.g_1 splits_ts.g_2 splits_ts.g_3 splits_ts.g_4 grouped_ts.g + TEST_2 NOEXEPREFIX NOEXESUFFIX EXEC io_shell_ts ARGS --extract_group splits_ts.g_1 grouped_ts.g split_ts-extract.g_1 + TEST_3 NOEXEPREFIX NOEXESUFFIX EXEC io_shell_ts ARGS --extract_group splits_ts.g_2 grouped_ts.g split_ts-extract.g_2 + TEST_4 NOEXEPREFIX NOEXESUFFIX EXEC io_shell_ts ARGS --extract_group splits_ts.g_3 grouped_ts.g split_ts-extract.g_3 + TEST_5 NOEXEPREFIX NOEXESUFFIX EXEC io_shell_ts ARGS --extract_group splits_ts.g_4 grouped_ts.g split_ts-extract.g_4 + TEST_6 EXEC exodiff ARGS -pedantic splits_ts.g_1 split_ts-extract.g_1 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_7 EXEC exodiff ARGS -pedantic splits_ts.g_2 split_ts-extract.g_2 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_8 EXEC exodiff ARGS -pedantic splits_ts.g_3 split_ts-extract.g_3 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + TEST_9 EXEC exodiff ARGS -pedantic splits_ts.g_4 split_ts-extract.g_4 + DIRECTORY ../../../../applications/exodiff + NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 + COMM serial + FINAL_PASS_REGULAR_EXPRESSION + ) + endif() ENDIF() ENDIF() @@ -342,7 +406,7 @@ TRIBITS_ADD_ADVANCED_TEST(exodus_to_unstructured_cgns_to_exodus NUM_MPI_PROCS ${NPROCS} TEST_1 EXEC io_shell ARGS ${JOIN_ARG} 8-block.cgns 8-block.g NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_2 EXEC exodiff ARGS -stat -pedantic -map -dumpmap ${CMAKE_CURRENT_SOURCE_DIR}/test/8-block.g 8-block.g DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -354,13 +418,15 @@ TRIBITS_ADD_ADVANCED_TEST(exodus_to_unstructured_cgns_to_exodus TRIBITS_ADD_ADVANCED_TEST(exodus_to_unstructured_cgns_file_per_state_to_exodus TEST_0 EXEC io_shell ARGS ${DECOMP_ARG} --file_per_state ${CMAKE_CURRENT_SOURCE_DIR}/test/8-block.g 8-block-link.cgns NOEXEPREFIX NOEXESUFFIX - TEST_1 EXEC io_shell ARGS ${JOIN_ARG} 8-block-link.cgns 8-block-rt.g + NUM_MPI_PROCS ${NPROCS} + TEST_1 EXEC io_shell ARGS 8-block-link.cgns 8-block-rt.g NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS 1 TEST_2 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/8-block.g 8-block-rt.g DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX NUM_MPI_PROCS 1 - COMM serial + COMM mpi serial XHOSTTYPE Windows ) @@ -370,7 +436,7 @@ TRIBITS_ADD_ADVANCED_TEST(exodus_to_unstructured_cgns_to_exodus_single_block NUM_MPI_PROCS ${NPROCS} TEST_1 EXEC io_shell ARGS ${JOIN_ARG} cube.cgns cube.g NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_2 EXEC exodiff ARGS -stat -pedantic -map ${CMAKE_CURRENT_SOURCE_DIR}/test/cube.g cube.g DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -385,7 +451,7 @@ TRIBITS_ADD_ADVANCED_TEST(exodus_to_unstructured_cgns_to_exodus_double_block NUM_MPI_PROCS ${NPROCS} TEST_1 EXEC io_shell ARGS ${JOIN_ARG} two-block.cgns two-block.g NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_2 EXEC exodiff ARGS -stat -pedantic -map ${CMAKE_CURRENT_SOURCE_DIR}/test/two-block.g two-block.g DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -398,7 +464,7 @@ IF (NOT SEACASIoss_ENABLE_THREADSAFE) TRIBITS_ADD_ADVANCED_TEST(cgns_bc_no_parents_to_exodus TEST_0 EXEC io_shell ARGS ${DECOMP_ARG} ${JOIN_ARG} ${CMAKE_CURRENT_SOURCE_DIR}/test/BC_without_parents.cgns exodus_bc_parents.e NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_1 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/exodus_bc_parents.gold exodus_bc_parents.e DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -410,7 +476,7 @@ TRIBITS_ADD_ADVANCED_TEST(cgns_bc_no_parents_to_exodus TRIBITS_ADD_ADVANCED_TEST(cgns_Q2_bc_no_parents_to_exodus TEST_0 EXEC io_shell ARGS ${DECOMP_ARG} ${JOIN_ARG} ${CMAKE_CURRENT_SOURCE_DIR}/test/BC_Q2_without_parents.cgns exodus_Q2_bc_parents.e NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_1 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/exodus_Q2_bc_parents.gold exodus_Q2_bc_parents.e DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -458,7 +524,7 @@ ENDIF() TRIBITS_ADD_ADVANCED_TEST(unstructured_cgns_to_exodus TEST_0 EXEC io_shell ARGS ${JOIN_ARG} ${CMAKE_CURRENT_SOURCE_DIR}/test/generated.cgns exodus_generated.e NOEXEPREFIX NOEXESUFFIX - NUM_MPI_PROCS ${NPROCS} + NUM_MPI_PROCS ${NPROCS_BUG} TEST_1 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/exodus_generated.gold exodus_generated.e DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX @@ -476,18 +542,19 @@ TRIBITS_ADD_ADVANCED_TEST(structured_cgns_to_unstructured DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX NUM_MPI_PROCS 1 - COMM mpi + COMM mpi serial XHOSTTYPE Windows ) ELSE() TRIBITS_ADD_ADVANCED_TEST(structured_cgns_to_unstructured TEST_0 EXEC struc_to_unstruc ARGS ${CMAKE_CURRENT_SOURCE_DIR}/test/sparc1.cgns exodus_struc.e NOEXEPREFIX NOEXESUFFIX + NUM_MPI_PROCS ${NPROCS} TEST_1 EXEC exodiff ARGS -stat -pedantic ${CMAKE_CURRENT_SOURCE_DIR}/test/exodus_struc.gold exodus_struc.e DIRECTORY ../../../../applications/exodiff NOEXEPREFIX NOEXESUFFIX NUM_MPI_PROCS 1 - COMM serial + COMM mpi serial XHOSTTYPE Windows ) ENDIF() @@ -671,7 +738,7 @@ TRIBITS_ADD_ADVANCED_TEST(structured_cgns_assembly_copy NOEXEPREFIX NOEXESUFFIX TEST_1 CMND ${CGNS_CGNSDIFF_BINARY} ARGS -d ${CMAKE_CURRENT_SOURCE_DIR}/test/assemblies.cgns assemblies-out.cgns NUM_MPI_PROCS 1 - COMM mpi + COMM mpi serial ) if (TPL_ENABLE_MPI) diff --git a/packages/seacas/libraries/ioss/src/main/cgns_decomp.C b/packages/seacas/libraries/ioss/src/main/cgns_decomp.C index 2ef43f03c6b6..f49b3a395776 100644 --- a/packages/seacas/libraries/ioss/src/main/cgns_decomp.C +++ b/packages/seacas/libraries/ioss/src/main/cgns_decomp.C @@ -9,6 +9,7 @@ #include "Ionit_Initializer.h" #include "Ioss_DatabaseIO.h" +#include "Ioss_DecompositionUtils.h" #include "Ioss_GetLongOpt.h" #include "Ioss_IOFactory.h" #include "Ioss_Property.h" @@ -37,9 +38,7 @@ #include "Ioss_ScopeGuard.h" #include "Ioss_StructuredBlock.h" -#if !defined __NVCC__ #include -#endif #include namespace { @@ -385,10 +384,7 @@ namespace { auto search = comms.find(std::make_pair(value, key)); if (search == comms.end()) { valid = false; - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif + fmt::print(stderr, fg(fmt::color::red), "ERROR: Could not find matching ZGC for {}, proc {} -> {}, proc {}\n", key.first, key.second, value.first, value.second); } @@ -439,11 +435,8 @@ namespace { for (const auto &proc : comms) { if (proc.second < 0) { // From decomposition - fmt::print( -#if !defined __NVCC__ - fg(fmt::color::yellow), -#endif - "[{:{}}->{:{}}] ", proc.first, pw, -proc.second, pw); + fmt::print(fg(fmt::color::yellow), "[{:{}}->{:{}}] ", proc.first, pw, -proc.second, + pw); } else { // Zone to Zone @@ -462,63 +455,6 @@ namespace { } } - void output_histogram(const std::vector &proc_work, size_t avg_work, size_t median) - { - fmt::print("Work-per-processor Histogram\n"); - std::array histogram{}; - - auto wmin = *std::min_element(proc_work.begin(), proc_work.end()); - auto wmax = *std::max_element(proc_work.begin(), proc_work.end()); - - size_t hist_size = std::min(size_t(16), (wmax - wmin)); - hist_size = std::min(hist_size, proc_work.size()); - - if (hist_size <= 1) { - fmt::print("\tWork is the same on all processors; no histogram needed.\n\n"); - return; - } - - auto delta = double(wmax + 1 - wmin) / hist_size; - for (const auto &pw : proc_work) { - auto bin = size_t(double(pw - wmin) / delta); - SMART_ASSERT(bin < hist_size)(bin)(hist_size); - histogram[bin]++; - } - - size_t proc_width = Ioss::Utils::number_width(proc_work.size(), true); - size_t work_width = Ioss::Utils::number_width(wmax, true); - - fmt::print("\n\t{:^{}} {:^{}}\n", "Work Range", 2 * work_width + 2, "#", proc_width); - auto hist_max = *std::max_element(histogram.begin(), histogram.end()); - for (size_t i = 0; i < hist_size; i++) { - int max_star = 50; - int star_cnt = ((double)histogram[i] / hist_max * max_star); - std::string stars(star_cnt, '*'); - for (int j = 9; j < star_cnt;) { - stars[j] = '|'; - j += 10; - } - if (histogram[i] > 0 && star_cnt == 0) { - stars = '.'; - } - size_t w1 = wmin + size_t(i * delta); - size_t w2 = wmin + size_t((i + 1) * delta); - std::string postfix; - if (w1 <= avg_work && avg_work < w2) { - postfix += "average"; - } - if (w1 <= median && median < w2) { - if (!postfix.empty()) { - postfix += ", "; - } - postfix += "median"; - } - fmt::print("\t{:{}}..{:{}} ({:{}}):\t{:{}} {}\n", fmt::group_digits(w1), work_width, - fmt::group_digits(w2), work_width, fmt::group_digits(histogram[i]), proc_width, - stars, max_star, postfix); - } - fmt::print("\n"); - } void describe_decomposition(std::vector &zones, size_t orig_zone_count, const Interface &interFace) { @@ -558,9 +494,7 @@ namespace { for (const auto &zone : zones) { if (zone->is_active()) { auto len = zone->m_name.length(); - if (len > name_len) { - name_len = len; - } + name_len = std::max(name_len, len); } } @@ -608,71 +542,27 @@ namespace { } } - auto min_work = *std::min_element(proc_work.begin(), proc_work.end()); - auto max_work = *std::max_element(proc_work.begin(), proc_work.end()); - size_t median = 0; - { - auto pw_copy(proc_work); - std::nth_element(pw_copy.begin(), pw_copy.begin() + pw_copy.size() / 2, pw_copy.end()); - median = pw_copy[pw_copy.size() / 2]; - fmt::print("\nWork per processor:\n\tMinimum = {}, Maximum = {}, Median = {}, Ratio = " - "{:.3}\n\n", - fmt::group_digits(min_work), fmt::group_digits(max_work), - fmt::group_digits(median), (double)(max_work) / min_work); - } - if (interFace.work_per_processor) { - if (min_work == max_work) { - fmt::print("\nWork on all processors is {}\n\n", fmt::group_digits(min_work)); - } - else { - int max_star = 40; - int min_star = max_star * ((double)min_work / (double)(max_work)); - int delta = max_star - min_star; - - for (size_t i = 0; i < proc_work.size(); i++) { - int star_cnt = - (double)(proc_work[i] - min_work) / (max_work - min_work) * delta + min_star; - std::string stars(star_cnt, '*'); - const std::string format = "\tProcessor {:{}}, work = {:{}} ({:.2f})\t{}\n"; - if (proc_work[i] == max_work) { - fmt::print( -#if !defined __NVCC__ - fg(fmt::color::red), -#endif - fmt::runtime(format), i, proc_width, fmt::group_digits(proc_work[i]), work_width, - proc_work[i] / avg_work, stars); - } - else if (proc_work[i] == min_work) { - fmt::print( -#if !defined __NVCC__ - fg(fmt::color::green), -#endif - fmt::runtime(format), i, proc_width, fmt::group_digits(proc_work[i]), work_width, - proc_work[i] / avg_work, stars); - } - else { - fmt::print(fmt::runtime(format), i, proc_width, fmt::group_digits(proc_work[i]), work_width, - proc_work[i] / avg_work, stars); - } - if (verbose) { - for (const auto &zone : zones) { - if ((size_t)zone->m_proc == i) { - auto pct = int(100.0 * (double)zone->work() / proc_work[i] + 0.5); - fmt::print("\t {:{}} {:{}}\t{:3}%\t{:^12}\n", zone->m_name, name_len, - fmt::group_digits(zone->work()), work_width, pct, - fmt::format("{1:{0}} x {2:{0}} x {3:{0}}", ord_width, zone->m_ordinal[0], - zone->m_ordinal[1], zone->m_ordinal[2])); - } - } - fmt::print("\n"); + auto avg_median = Ioss::DecompUtils::output_decomposition_statistics(proc_work); + + if (verbose) { + for (size_t i = 0; i < proc_work.size(); i++) { + for (const auto &zone : zones) { + if ((size_t)zone->m_proc == i) { + auto pct = int(100.0 * (double)zone->work() / proc_work[i] + 0.5); + fmt::print("\t {:{}} {:{}}\t{:3}%\t{:^12}\n", zone->m_name, name_len, + fmt::group_digits(zone->work()), work_width, pct, + fmt::format("{1:{0}} x {2:{0}} x {3:{0}}", ord_width, zone->m_ordinal[0], + zone->m_ordinal[1], zone->m_ordinal[2])); } } + fmt::print("\n"); } } + fmt::print("\n"); // Output Histogram... if (interFace.histogram) { - output_histogram(proc_work, (size_t)avg_work, median); + Ioss::DecompUtils::output_histogram(proc_work, avg_median.first, avg_median.second); } // Communication Information (proc X communicates with proc Z) @@ -698,14 +588,6 @@ namespace { fmt::group_digits(nodal_work), fmt::group_digits(new_nodal_work), fmt::group_digits(delta), (double)new_nodal_work / nodal_work); } - - // Imbalance penalty -- max work / avg work. If perfect balance, then all processors would have - // "avg_work" work to do. With current decomposition, every processor has to wait until - // "max_work" is done. Penalty = max_work / avg_work. - fmt::print("Imbalance Penalty:\n\tMaximum Work = {}, Average Work = {}, Penalty (max/avg) " - "= {:.2f}\n\n", - fmt::group_digits(max_work), fmt::group_digits((size_t)avg_work), - (double)max_work / avg_work); } } // namespace @@ -796,10 +678,7 @@ int main(int argc, char *argv[]) auto valid = validate_symmetric_communications(zones); if (!valid) { - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif + fmt::print(stderr, fg(fmt::color::red), "\nERROR: Zone Grid Communication interfaces are not symmetric. There is an error " "in the decomposition.\n"); } diff --git a/packages/seacas/libraries/ioss/src/main/info_interface.C b/packages/seacas/libraries/ioss/src/main/info_interface.C index 2e10d616c680..cef12645709a 100644 --- a/packages/seacas/libraries/ioss/src/main/info_interface.C +++ b/packages/seacas/libraries/ioss/src/main/info_interface.C @@ -16,7 +16,10 @@ #include "Ioss_Utils.h" #include "info_interface.h" -Info::Interface::Interface() { enroll_options(); } +Info::Interface::Interface(std::string app_version) : version(std::move(app_version)) +{ + enroll_options(); +} void Info::Interface::enroll_options() { @@ -143,11 +146,19 @@ void Info::Interface::enroll_options() nullptr, nullptr, true); #endif + options_.enroll( + "list_change_sets", Ioss::GetLongOption::NoValue, + "Print a list of the names of all change_sets (previosly groups) in this file and then exit.", + nullptr); options_.enroll("list_groups", Ioss::GetLongOption::NoValue, - "Print a list of the names of all groups in this file and then exit.", nullptr); + "[deprecated] Use --list_change_sets", nullptr); + options_.enroll("change_set_name", Ioss::GetLongOption::MandatoryValue, + "List information only for the specified comma-separated list of change_set(s) " + "or `ALL` to list for all.", + nullptr); options_.enroll("group_name", Ioss::GetLongOption::MandatoryValue, - "List information only for the specified group.", nullptr, nullptr, true); + "[deprecated] Use --change_set_name.", nullptr, nullptr, true); options_.enroll("query_timesteps_only", Ioss::GetLongOption::NoValue, "Only read and output the timestep data on the file", nullptr); @@ -188,7 +199,7 @@ bool Info::Interface::parse_options(int argc, char **argv) } if (options_.retrieve("version") != nullptr) { - // Version is printed up front, just exit... + fmt::print(stderr, "IO_INFO\tVersion: {}\n", version); exit(0); } @@ -197,16 +208,18 @@ bool Info::Interface::parse_options(int argc, char **argv) ints64Bit_ = options_.retrieve("64-bit") != nullptr; computeVolume_ = options_.retrieve("compute_volume") != nullptr; computeBBox_ = options_.retrieve("compute_bbox") != nullptr; - listGroups_ = options_.retrieve("list_groups") != nullptr; + listChangeSets_ = options_.retrieve("list_change_sets") != nullptr || + options_.retrieve("list_groups") != nullptr; useGenericNames_ = options_.retrieve("use_generic_names") != nullptr; summary_ = options_.retrieve("summary") != nullptr; showConfig_ = options_.retrieve("configuration") != nullptr; queryTimeOnly_ = options_.retrieve("query_timesteps_only") != nullptr; fieldDetails_ = options_.retrieve("detailed_field_info") != nullptr; - filetype_ = options_.get_option_value("db_type", filetype_); - filetype_ = options_.get_option_value("in_type", filetype_); - groupname_ = options_.get_option_value("group_name", groupname_); + filetype_ = options_.get_option_value("db_type", filetype_); + filetype_ = options_.get_option_value("in_type", filetype_); + changeSetName_ = options_.get_option_value("change_set_name", changeSetName_); + changeSetName_ = options_.get_option_value("group_name", changeSetName_); { const char *temp = options_.retrieve("surface_split_scheme"); diff --git a/packages/seacas/libraries/ioss/src/main/info_interface.h b/packages/seacas/libraries/ioss/src/main/info_interface.h index a5191171eaef..f89e53f6557c 100644 --- a/packages/seacas/libraries/ioss/src/main/info_interface.h +++ b/packages/seacas/libraries/ioss/src/main/info_interface.h @@ -19,7 +19,7 @@ namespace Info { class IO_INFO_LIB_EXPORT Interface { public: - Interface(); + explicit Interface(std::string app_version); bool parse_options(int argc, char **argv); @@ -29,7 +29,7 @@ namespace Info { bool compute_bbox() const { return computeBBox_; } bool adjacencies() const { return adjacencies_; } bool ints_64_bit() const { return ints64Bit_; } - bool list_groups() const { return listGroups_; } + bool list_change_sets() const { return listChangeSets_; } bool show_config() const { return showConfig_; } bool query_timesteps_only() const { return queryTimeOnly_; } bool field_details() const { return fieldDetails_; } @@ -41,10 +41,10 @@ namespace Info { std::string decomp_method() const { return decompMethod_; } std::string filename() const { return filename_; } std::string type() const { return filetype_; } - std::string groupname() const { return groupname_; } + std::string change_set_name() const { return changeSetName_; } std::string custom_field() const { return customField_; } - //! Dumps representation of data in this class to cerr + std::string version{}; private: void enroll_options(); @@ -52,7 +52,7 @@ namespace Info { Ioss::GetLongOption options_; std::string filetype_{"exodus"}; std::string filename_{}; - std::string groupname_{}; + std::string changeSetName_{}; std::string decompMethod_{}; std::string customField_{}; @@ -61,7 +61,7 @@ namespace Info { bool adjacencies_{false}; bool ints64Bit_{false}; bool computeBBox_{false}; - bool listGroups_{false}; + bool listChangeSets_{false}; bool useGenericNames_{false}; bool disableFieldRecognition_{false}; bool showConfig_{false}; diff --git a/packages/seacas/libraries/ioss/src/main/io_info.C b/packages/seacas/libraries/ioss/src/main/io_info.C index 1483423816ee..e1af5433629b 100644 --- a/packages/seacas/libraries/ioss/src/main/io_info.C +++ b/packages/seacas/libraries/ioss/src/main/io_info.C @@ -51,6 +51,7 @@ #include "Ioss_SurfaceSplit.h" #include "Ioss_Utils.h" #include "Ioss_VariableType.h" +#include "Ioss_use_fmt.h" #if defined(SEACAS_HAVE_EXODUS) #include "exodusII.h" #endif @@ -92,7 +93,7 @@ namespace { } void file_info(const Info::Interface &interFace); - void group_info(Info::Interface &interFace); + void change_set_info(Info::Interface &interFace); void info_df(const Ioss::GroupingEntity *ge, const std::string &prefix) { @@ -162,45 +163,22 @@ namespace { } } -#if defined(SEACAS_HAVE_EXODUS) - int print_groups(int exoid, std::string prefix) - { - int idum; - float rdum; - char group_name[33]; - // Print name of this group... - ex_inquire(exoid, EX_INQ_GROUP_NAME, &idum, &rdum, group_name); - if (group_name[0] == '/') { - fmt::print("{}/ (root)\n", prefix); - } - else { - fmt::print("{}{}\n", prefix, group_name); - } - - int num_children = ex_inquire_int(exoid, EX_INQ_NUM_CHILD_GROUPS); - std::vector children(num_children); - ex_get_group_ids(exoid, nullptr, Data(children)); - prefix += '\t'; - for (int i = 0; i < num_children; i++) { - print_groups(children[i], prefix); - } - return 0; - } -#endif - - void group_info(Info::Interface &interFace) + void change_set_info(Info::Interface &interFace) { -#if defined(SEACAS_HAVE_EXODUS) - // Assume exodusII... - std::string inpfile = interFace.filename(); - float vers = 0.0; - int CPU_word_size = 0; - int IO_word_size = 0; + std::string inpfile = interFace.filename(); + std::string input_type = interFace.type(); + Ioss::PropertyManager properties = set_properties(interFace); - int exoid = ex_open(inpfile.c_str(), EX_READ, &CPU_word_size, &IO_word_size, &vers); + auto mode = Ioss::READ_RESTART; + Ioss::DatabaseIO *dbi = Ioss::IOFactory::create(input_type, inpfile, mode, + Ioss::ParallelUtils::comm_world(), properties); - print_groups(exoid, "\t"); -#endif + Ioss::io_info_set_db_properties(interFace, dbi); + auto cs_names = dbi->internal_change_set_describe(); + fmt::print("\t/ (root)\n"); + for (const auto &cs_name : cs_names) { + fmt::print("\t\t{}\n", cs_name); + } } void file_info(const Info::Interface &interFace) @@ -234,7 +212,32 @@ namespace { info_timesteps(region); } else { - Ioss::io_info_file_info(interFace, region); + auto cs_list = Ioss::tokenize(interFace.change_set_name(), ","); + if (cs_list.empty()) { + cs_list.push_back("/"); + } + else { + if (cs_list[0] == "ALL") { + cs_list = dbi->internal_change_set_describe(); + } + } + + bool first = true; + for (const auto &cs_name : cs_list) { + if (!first) { + fmt::print("-----------------------------------------------------------------------------" + "-----------------------\n"); + } + if (cs_name != "/") { + bool success = region.load_internal_change_set_mesh(cs_name); + if (!success) { + fmt::print("ERROR: Unable to open change set '{}' in file '{}'\n", cs_name, inpfile); + return; + } + first = false; + } + Ioss::io_info_file_info(interFace, region); + } } } @@ -317,7 +320,11 @@ namespace { if (!sb->m_zoneConnectivity.empty()) { fmt::print("\tConnectivity with other blocks:\n"); for (const auto &zgc : sb->m_zoneConnectivity) { +#if defined __NVCC__ std::cout << zgc << "\n"; +#else + fmt::print("{}\n", zgc); +#endif } } if (!sb->m_boundaryConditions.empty()) { @@ -331,7 +338,11 @@ namespace { }); for (const auto &bc : sb_bc) { +#if defined __NVCC__ std::cout << bc << "\n"; +#else + fmt::print("{}\n", bc); +#endif } } if (interFace.compute_bbox()) { @@ -643,7 +654,7 @@ namespace { namespace Ioss { void io_info_file_info(const Info::Interface &interFace) { file_info(interFace); } - void io_info_group_info(Info::Interface &interFace) { group_info(interFace); } + void io_info_change_set_info(Info::Interface &interFace) { change_set_info(interFace); } void io_info_set_db_properties(const Info::Interface &interFace, Ioss::DatabaseIO *dbi) { @@ -663,16 +674,6 @@ namespace Ioss { if (interFace.ints_64_bit()) { dbi->set_int_byte_size_api(Ioss::USE_INT64_API); } - - if (!interFace.groupname().empty()) { - bool success = dbi->open_group(interFace.groupname()); - if (!success) { - std::string inpfile = interFace.filename(); - fmt::print("ERROR: Unable to open group '{}' in file '{}'\n", interFace.groupname(), - inpfile); - return; - } - } } void io_info_file_info(const Info::Interface &interFace, Ioss::Region ®ion) diff --git a/packages/seacas/libraries/ioss/src/main/io_info.h b/packages/seacas/libraries/ioss/src/main/io_info.h index beb6be062c83..ded93b87a5c1 100644 --- a/packages/seacas/libraries/ioss/src/main/io_info.h +++ b/packages/seacas/libraries/ioss/src/main/io_info.h @@ -1,5 +1,5 @@ /* - * Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions + * Copyright(C) 1999-2020, 2022, 2023, 2024 National Technology & Engineering Solutions * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with * NTESS, the U.S. Government retains certain rights in this software. * @@ -7,51 +7,7 @@ */ #pragma once -#include "Ionit_Initializer.h" -#include "Ioss_CodeTypes.h" -#include "Ioss_SurfaceSplit.h" -#include "Ioss_Utils.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include "info_interface.h" #include "io_info_lib_export.h" -#if defined(SEACAS_HAVE_EXODUS) -#include -#endif - -#include - -#include "Ioss_Assembly.h" -#include "Ioss_Blob.h" -#include "Ioss_CommSet.h" -#include "Ioss_CoordinateFrame.h" -#include "Ioss_DBUsage.h" -#include "Ioss_DatabaseIO.h" -#include "Ioss_EdgeBlock.h" -#include "Ioss_EdgeSet.h" -#include "Ioss_ElementBlock.h" -#include "Ioss_ElementSet.h" -#include "Ioss_ElementTopology.h" -#include "Ioss_FaceBlock.h" -#include "Ioss_FaceSet.h" -#include "Ioss_Field.h" -#include "Ioss_GroupingEntity.h" -#include "Ioss_IOFactory.h" -#include "Ioss_NodeBlock.h" -#include "Ioss_NodeSet.h" -#include "Ioss_Property.h" -#include "Ioss_Region.h" -#include "Ioss_SideBlock.h" -#include "Ioss_SideSet.h" -#include "Ioss_StructuredBlock.h" -#include "Ioss_VariableType.h" namespace Info { class Interface; @@ -63,7 +19,7 @@ namespace Ioss { // internal to io_info IO_INFO_LIB_EXPORT void io_info_file_info(const Info::Interface &interFace); - IO_INFO_LIB_EXPORT void io_info_group_info(Info::Interface &interFace); + IO_INFO_LIB_EXPORT void io_info_change_set_info(Info::Interface &interFace); // for external calls IO_INFO_LIB_EXPORT void io_info_set_db_properties(const Info::Interface &interFace, diff --git a/packages/seacas/libraries/ioss/src/main/io_info_main.C b/packages/seacas/libraries/ioss/src/main/io_info_main.C index d528681661b6..1d1e5b8e4e11 100644 --- a/packages/seacas/libraries/ioss/src/main/io_info_main.C +++ b/packages/seacas/libraries/ioss/src/main/io_info_main.C @@ -22,7 +22,7 @@ namespace { std::string codename; - std::string version = "1.06"; + std::string version = "1.07 (2024/11/08)"; #ifdef SEACAS_HAVE_MPI void mpi_finalize() @@ -45,7 +45,7 @@ int main(int argc, char *argv[]) ON_BLOCK_EXIT(mpi_finalize); #endif - Info::Interface interFace; + Info::Interface interFace(version); interFace.parse_options(argc, argv); Ioss::Init::Initializer io; @@ -61,8 +61,8 @@ int main(int argc, char *argv[]) codename = codename.substr(ind + 1, codename.size()); } - if (interFace.list_groups()) { - Ioss::io_info_group_info(interFace); + if (interFace.list_change_sets()) { + Ioss::io_info_change_set_info(interFace); } else { Ioss::io_info_file_info(interFace); diff --git a/packages/seacas/libraries/ioss/src/main/io_modify.C b/packages/seacas/libraries/ioss/src/main/io_modify.C index b0461dc297c0..9cbde6677649 100644 --- a/packages/seacas/libraries/ioss/src/main/io_modify.C +++ b/packages/seacas/libraries/ioss/src/main/io_modify.C @@ -969,13 +969,9 @@ namespace { if (Ioss::Utils::substr_equal(tokens[2], "add")) { // Must be at least 6 tokens... if (tokens.size() < 6) { - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif - "ERROR: ATTRIBUTE Command does not have enough tokens to be valid.\n" - "\t\t{}\n", - fmt::join(tokens, " ")); + fmt::print(stderr, fg(fmt::color::red), + "ERROR: ATTRIBUTE Command does not have enough tokens to be valid.\n"); + fmt::print(stderr, "\t\t{}\n", fmt::join(tokens, " ")); handle_help("attribute"); return false; } @@ -1091,13 +1087,9 @@ namespace { // Must be at least 4 tokens... if (tokens.size() < 4) { - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif - "ERROR: RENAME Command does not have enough tokens to be valid.\n" - "\t\t{}\n", - fmt::join(tokens, " ")); + fmt::print(stderr, fg(fmt::color::red), + "ERROR: RENAME Command does not have enough tokens to be valid.\n"); + fmt::print(stderr, "\t\t{}\n", fmt::join(tokens, " ")); handle_help("rename"); return false; } @@ -1225,13 +1217,9 @@ namespace { // TIME SCALE {{scale}} // TIME OFFSET {{offset} if (tokens.size() < 3) { - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif - "ERROR: TIME Command does not have enough tokens to be valid.\n" - "\t\t{}\n", - fmt::join(tokens, " ")); + fmt::print(stderr, fg(fmt::color::red), + "ERROR: TIME Command does not have enough tokens to be valid.\n"); + fmt::print(stderr, "\t\t{}\n", fmt::join(tokens, " ")); handle_help("time"); return false; } @@ -1264,13 +1252,9 @@ namespace { // GEOMETRY OFFSET {{ELEMENTBLOCKS|BLOCKS|ASSEMBLY}} {{names}} {{X|Y|Z}} {{offset}} ... if (tokens.size() < 3) { - fmt::print(stderr, -#if !defined __NVCC__ - fg(fmt::color::red), -#endif - "ERROR: GEOMETRY Command does not have enough tokens to be valid.\n" - "\t\t{}\n", - fmt::join(tokens, " ")); + fmt::print(stderr, fg(fmt::color::red), + "ERROR: GEOMETRY Command does not have enough tokens to be valid.\n"); + fmt::print(stderr, "\t\t{}\n", fmt::join(tokens, " ")); handle_help("geometry"); return false; } diff --git a/packages/seacas/libraries/ioss/src/main/io_shell.C b/packages/seacas/libraries/ioss/src/main/io_shell.C index bba91946c7a1..7e61b2434b84 100644 --- a/packages/seacas/libraries/ioss/src/main/io_shell.C +++ b/packages/seacas/libraries/ioss/src/main/io_shell.C @@ -4,21 +4,11 @@ // // See packages/seacas/LICENSE for details -#include "Ionit_Initializer.h" -#include "Ioss_Compare.h" -#include "Ioss_CopyDatabase.h" -#include "Ioss_FileInfo.h" -#include "Ioss_MemoryUtils.h" -#include "Ioss_MeshCopyOptions.h" -#include "Ioss_MeshType.h" -#include "Ioss_ParallelUtils.h" -#include "Ioss_SerializeIO.h" -#include "Ioss_SurfaceSplit.h" -#include "Ioss_Utils.h" #include #include #include #include +#include #include #include #include @@ -26,15 +16,26 @@ #include #include +#include "Ionit_Initializer.h" +#include "Ioss_Compare.h" +#include "Ioss_CopyDatabase.h" #include "Ioss_DBUsage.h" #include "Ioss_DataSize.h" #include "Ioss_DatabaseIO.h" +#include "Ioss_FileInfo.h" #include "Ioss_GetLongOpt.h" #include "Ioss_IOFactory.h" +#include "Ioss_MemoryUtils.h" +#include "Ioss_MeshCopyOptions.h" +#include "Ioss_MeshType.h" +#include "Ioss_ParallelUtils.h" #include "Ioss_Property.h" #include "Ioss_PropertyManager.h" #include "Ioss_Region.h" #include "Ioss_ScopeGuard.h" +#include "Ioss_SerializeIO.h" +#include "Ioss_SurfaceSplit.h" +#include "Ioss_Utils.h" #include "Ioss_VariableType.h" #include "shell_interface.h" @@ -42,38 +43,39 @@ namespace { std::string codename; - std::string version = "6.8 (2024/05/31)"; + std::string version = "7.0 (2024/11/08)"; bool mem_stats = false; - void file_copy(IOShell::Interface &interFace, int rank); + bool file_copy(IOShell::Interface &interFace, int rank); bool file_compare(IOShell::Interface &interFace, int rank); Ioss::PropertyManager set_properties(IOShell::Interface &interFace); Ioss::MeshCopyOptions set_mesh_copy_options(IOShell::Interface &interFace) { Ioss::MeshCopyOptions options{}; - options.selected_times = interFace.selected_times; - options.rel_tolerance = interFace.rel_tolerance; - options.abs_tolerance = interFace.abs_tolerance; - options.tol_floor = interFace.tol_floor; - options.verbose = !interFace.quiet; - options.output_summary = true; - options.memory_statistics = interFace.memory_statistics; - options.debug = interFace.debug; - options.ints_64_bit = interFace.ints_64_bit; - options.delete_timesteps = interFace.delete_timesteps; - options.minimum_time = interFace.minimum_time; - options.maximum_time = interFace.maximum_time; - options.time_scale = interFace.time_scale; - options.time_offset = interFace.time_offset; - options.data_storage_type = interFace.data_storage_type; - options.delay = interFace.timestep_delay; - options.reverse = interFace.reverse; - options.add_proc_id = interFace.add_processor_id_field; - options.boundary_sideset = interFace.boundary_sideset; - options.ignore_qa_info = interFace.ignore_qa_info; - options.omitted_blocks = !interFace.omitted_blocks.empty(); + options.selected_times = interFace.selected_times; + options.rel_tolerance = interFace.rel_tolerance; + options.abs_tolerance = interFace.abs_tolerance; + options.tol_floor = interFace.tol_floor; + options.verbose = !interFace.quiet; + options.output_summary = true; + options.memory_statistics = interFace.memory_statistics; + options.debug = interFace.debug; + options.ints_64_bit = interFace.ints_64_bit; + options.delete_timesteps = interFace.delete_timesteps; + options.minimum_time = interFace.minimum_time; + options.maximum_time = interFace.maximum_time; + options.time_scale = interFace.time_scale; + options.time_offset = interFace.time_offset; + options.data_storage_type = interFace.data_storage_type; + options.delay = interFace.timestep_delay; + options.reverse = interFace.reverse; + options.add_proc_id = interFace.add_processor_id_field; + options.boundary_sideset = interFace.boundary_sideset; + options.ignore_qa_info = interFace.ignore_qa_info; + options.omitted_blocks = !interFace.omitted_blocks.empty(); + options.selected_change_sets = interFace.selectedChangeSets; options.omitted_sets = interFace.omitted_sets; Ioss::sort(options.omitted_sets); @@ -83,6 +85,21 @@ namespace { return options; } + bool open_change_set(const std::string &cs_name, Ioss::Region ®ion, int rank) + { + bool success = true; + if (!cs_name.empty()) { + success = region.load_internal_change_set_mesh(cs_name); + if (!success) { + if (rank == 0) { + fmt::print(stderr, "ERROR: Unable to open change_set '{}' in file '{}'\n", cs_name, + region.get_database()->get_filename()); + } + } + } + return success; + } + #ifdef SEACAS_HAVE_MPI void mpi_finalize() { @@ -166,7 +183,7 @@ int main(int argc, char *argv[]) success = file_compare(interFace, rank); } else { - file_copy(interFace, rank); + success = file_copy(interFace, rank); } } catch (std::exception &e) { @@ -213,17 +230,17 @@ int main(int argc, char *argv[]) #endif } if (rank == 0) { - fmt::print(stderr, "\n{} execution successful.\n", codename); + fmt::print(stderr, "\n{} execution {}.\n", codename, success ? "successful" : "failed"); } return success ? EXIT_SUCCESS : EXIT_FAILURE; } namespace { - void file_copy(IOShell::Interface &interFace, int rank) + bool file_copy(IOShell::Interface &interFace, int rank) { + bool success = true; Ioss::PropertyManager properties = set_properties(interFace); - bool first = true; for (const auto &inpfile : interFace.inputFile) { //======================================================================== @@ -259,17 +276,6 @@ namespace { dbi->set_int_byte_size_api(Ioss::USE_INT64_API); } - if (!interFace.groupName.empty()) { - bool success = dbi->open_group(interFace.groupName); - if (!success) { - if (rank == 0) { - fmt::print(stderr, "ERROR: Unable to open group '{}' in file '{}'\n", - interFace.groupName, inpfile); - } - return; - } - } - if (!interFace.omitted_blocks.empty()) { std::vector inclusions{}; dbi->set_block_omissions(interFace.omitted_blocks, inclusions); @@ -278,6 +284,17 @@ namespace { // NOTE: 'region' owns 'db' pointer at this time... Ioss::Region region(dbi, "region_1"); + // Change_set specified... We will read the specified changeSet from the input file + if (!interFace.changeSetName.empty()) { + success = Ioss::Utils::check_valid_change_set_name(interFace.changeSetName, region, rank); + if (success) { + success = open_change_set(interFace.changeSetName, region, rank); + } + if (!success) { + return success; + } + } + if (region.mesh_type() == Ioss::MeshType::HYBRID) { if (rank == 0) { fmt::print(stderr, @@ -285,7 +302,7 @@ namespace { "'Structured' mesh is supported at this time.\n", region.mesh_type_string()); } - return; + return success; } // Get length of longest name on input file... @@ -306,6 +323,7 @@ namespace { if (int_byte_size_api == 8) { interFace.ints_64_bit = true; } + //======================================================================== // OUTPUT Database... //======================================================================== @@ -335,8 +353,15 @@ namespace { int flush_interval = interFace.flush_interval; // Default is zero -- do not flush until end properties.add(Ioss::Property("FLUSH_INTERVAL", flush_interval)); + int change_set_count = dbi->num_internal_change_set(); + if (interFace.split_times == 0 || interFace.delete_timesteps || ts_count == 0 || append || - interFace.inputFile.size() > 1) { + interFace.inputFile.size() > 1 || + (change_set_count > 1 && interFace.changeSetName.empty())) { + if (interFace.inputFile.size() > 1 || + (change_set_count > 1 && interFace.changeSetName.empty())) { + properties.add(Ioss::Property("ENABLE_FILE_GROUPS", "YES")); + } Ioss::DatabaseIO *dbo = Ioss::IOFactory::create( interFace.outFiletype, interFace.outputFile, Ioss::WRITE_RESTART, Ioss::ParallelUtils::comm_world(), properties); @@ -355,19 +380,66 @@ namespace { if (interFace.inputFile.size() > 1) { properties.add(Ioss::Property("APPEND_OUTPUT", Ioss::DB_APPEND_GROUP)); - if (!first) { - // Putting each file into its own output group... - // The name of the group will be the basename portion of the filename... - Ioss::FileInfo file(inpfile); - dbo->create_subgroup(file.tailname()); + // Putting each file into its own change_set in the output file... + // The name of the change_set will be the basename portion of the filename... + Ioss::FileInfo file(inpfile); + + success = dbo->create_internal_change_set(file.tailname()); + if (!success) { + if (rank == 0) { + fmt::print(stderr, "ERROR: Unable to create change set {} in output file.\n", + file.tailname()); + } + return success; + } + } + + if (change_set_count > 1 && interFace.changeSetName.empty()) { + bool first = true; + Ioss::NameList cs_names; + if (!options.selected_change_sets.empty() && options.selected_change_sets != "ALL") { + cs_names = Ioss::tokenize(options.selected_change_sets, ","); + success = true; + for (const auto &cs_name : cs_names) { + success &= Ioss::Utils::check_valid_change_set_name(cs_name, region); + } + if (!success) { + return false; + } } else { + cs_names = dbi->internal_change_set_describe(); + } + for (const auto &cs_name : cs_names) { + success = region.load_internal_change_set_mesh(cs_name); + if (!success) { + if (rank == 0) { + fmt::print(stderr, "ERROR: Unable to open change set {} in input file.\n", cs_name); + } + return success; + } + output_region.reset_region(); + output_region.get_database()->release_memory(); + success = dbo->create_internal_change_set(cs_name); + if (!success) { + if (rank == 0) { + fmt::print(stderr, "ERROR: Unable to create change set {} in output file.\n", + cs_name); + } + return success; + } + fmt::print(stderr, "Copying change set {}\n", cs_name); + if (!first) { + options.ignore_qa_info = true; + } + Ioss::copy_database(region, output_region, options); first = false; } } - - // Do normal copy... - Ioss::copy_database(region, output_region, options); + else { + // Do normal copy... + Ioss::copy_database(region, output_region, options); + } if (mem_stats) { dbo->release_memory(); @@ -453,6 +525,7 @@ namespace { dbi->progress("Memory Released... "); } } // loop over input files + return true; } bool file_compare(IOShell::Interface &interFace, int rank) @@ -493,17 +566,6 @@ namespace { dbi1->set_int_byte_size_api(Ioss::USE_INT64_API); } - if (!interFace.groupName.empty()) { - bool success = dbi1->open_group(interFace.groupName); - if (!success) { - if (rank == 0) { - fmt::print(stderr, "ERROR: Unable to open group '{}' in file '{}'\n", interFace.groupName, - inpfile); - } - return false; - } - } - // NOTE: 'input_region1' owns 'dbi1' pointer at this time... Ioss::Region input_region1(dbi1, "region_1"); @@ -555,17 +617,6 @@ namespace { dbi2->set_int_byte_size_api(Ioss::USE_INT64_API); } - if (!interFace.groupName.empty()) { - bool success = dbi2->open_group(interFace.groupName); - if (!success) { - if (rank == 0) { - fmt::print(stderr, "ERROR: Unable to open group '{}' in file '{}'\n", interFace.groupName, - inpfile); - } - return false; - } - } - // NOTE: 'input_region2' owns 'dbi2' pointer at this time... Ioss::Region input_region2(dbi2, "region_2"); @@ -631,16 +682,27 @@ namespace { properties.add(Ioss::Property("IGNORE_INFO_RECORDS", "YES")); } - if (interFace.compression_level > 0 || interFace.shuffle || interFace.szip) { + if (interFace.compression_level > 0 || interFace.shuffle || interFace.szip || interFace.quant || + interFace.zlib || interFace.zstd || interFace.bz2) { properties.add(Ioss::Property("FILE_TYPE", "netcdf4")); properties.add(Ioss::Property("COMPRESSION_LEVEL", interFace.compression_level)); properties.add(Ioss::Property("COMPRESSION_SHUFFLE", static_cast(interFace.shuffle))); - if (interFace.szip) { + if (interFace.zlib) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + } + else if (interFace.szip) { properties.add(Ioss::Property("COMPRESSION_METHOD", "szip")); } - else if (interFace.zlib) { - properties.add(Ioss::Property("COMPRESSION_METHOD", "zlib")); + else if (interFace.zstd) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "zstd")); + } + else if (interFace.bz2) { + properties.add(Ioss::Property("COMPRESSION_METHOD", "bzip2")); + } + + if (interFace.quant) { + properties.add(Ioss::Property("COMPRESSION_QUANTIZE_NSD", interFace.quantize_nsd)); } } diff --git a/packages/seacas/libraries/ioss/src/main/io_shell_ts.C b/packages/seacas/libraries/ioss/src/main/io_shell_ts.C index 45bf61a950d2..e64c5f1c3585 100644 --- a/packages/seacas/libraries/ioss/src/main/io_shell_ts.C +++ b/packages/seacas/libraries/ioss/src/main/io_shell_ts.C @@ -4,6 +4,19 @@ // // See packages/seacas/LICENSE for details +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "Ionit_Initializer.h" #include "Ioss_CodeTypes.h" #include "Ioss_DataPool.h" @@ -17,26 +30,9 @@ #include "Ioss_SurfaceSplit.h" #include "Ioss_Transform.h" #include "Ioss_Utils.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "shell_interface.h" -#ifdef SEACAS_HAVE_KOKKOS -#include // for Kokkos::View -#endif - #define DO_OUTPUT \ if (rank == 0) \ std::cerr @@ -95,6 +91,22 @@ namespace { template void set_owned_node_count(Ioss::Region ®ion, int my_processor, INT dummy); + + bool open_change_set(const std::string &cs_name, Ioss::Region ®ion, int my_rank) + { + bool success = true; + if (!cs_name.empty()) { + success = region.load_internal_change_set_mesh(cs_name); + if (!success) { + if (my_rank == 0) { + fmt::print(stderr, "ERROR: Unable to open change_set '{}' in file '{}'\n", cs_name, + region.get_database()->get_filename()); + } + } + } + return success; + } + } // namespace // ======================================================================== @@ -192,11 +204,10 @@ int main(int argc, char *argv[]) } namespace { - void file_copy(IOShell::Interface &interFace, int rank) + void file_copy(IOShell::Interface &interFace, int my_rank) { Ioss::PropertyManager properties = set_properties(interFace); - bool first = true; for (const auto &inpfile : interFace.inputFile) { Ioss::DatabaseIO *dbi = Ioss::IOFactory::create(interFace.inFiletype, inpfile, Ioss::READ_MODEL, @@ -218,22 +229,22 @@ namespace { dbi->set_int_byte_size_api(Ioss::USE_INT64_API); } - if (!interFace.groupName.empty()) { - bool success = dbi->open_group(interFace.groupName); + // NOTE: 'region' owns 'db' pointer at this time... + Ioss::Region region(dbi, "region_1"); + + if (!interFace.changeSetName.empty()) { + bool success = open_change_set(interFace.changeSetName, region, my_rank); if (!success) { - if (rank == 0) { + if (my_rank == 0) { fmt::print(stderr, "ERROR: Unable to open group '{}' in file '{}'\n", - interFace.groupName, inpfile); + interFace.changeSetName, inpfile); } return; } } - // NOTE: 'region' owns 'db' pointer at this time... - Ioss::Region region(dbi, "region_1"); - if (region.mesh_type() != Ioss::MeshType::UNSTRUCTURED) { - if (rank == 0) { + if (my_rank == 0) { fmt::print(stderr, "\nERROR: io_shell does not support '{}' meshes. Only 'Unstructured' mesh is " "supported at this time.\n", @@ -283,15 +294,10 @@ namespace { if (interFace.inputFile.size() > 1) { properties.add(Ioss::Property("APPEND_OUTPUT", Ioss::DB_APPEND_GROUP)); - if (!first) { - // Putting each file into its own output group... - // The name of the group will be the basename portion of the filename... - Ioss::FileInfo file(inpfile); - dbo->create_subgroup(file.tailname()); - } - else { - first = false; - } + // Putting each file into its own output group... + // The name of the group will be the basename portion of the filename... + Ioss::FileInfo file(inpfile); + dbo->create_internal_change_set(file.tailname()); } if (interFace.debug) { @@ -315,9 +321,9 @@ namespace { // and output regions... (This is checked during nodeset output) if (output_region.get_database()->needs_shared_node_information()) { if (interFace.ints_64_bit) - set_owned_node_count(region, rank, (int64_t)0); + set_owned_node_count(region, my_rank, (int64_t)0); else - set_owned_node_count(region, rank, (int)0); + set_owned_node_count(region, my_rank, (int)0); } transfer_edgeblocks(region, output_region, interFace.debug); @@ -974,7 +980,9 @@ namespace { assert(oge->field_exists(out_field_name)); +#ifdef SEACAS_HAVE_KOKKOS int basic_type = ige->get_field(field_name).get_type(); +#endif size_t isize = ige->get_field(field_name).get_size(); size_t osize = oge->get_field(out_field_name).get_size(); @@ -1180,7 +1188,6 @@ namespace { if (isize != oge->get_field(field_name).get_size()) { assert(isize == oge->get_field(field_name).get_size()); } - int basic_type = ige->get_field(field_name).get_type(); if (field_name == "mesh_model_coordinates_x") { return; @@ -1216,6 +1223,10 @@ namespace { return; } +#ifdef SEACAS_HAVE_KOKKOS + int basic_type = ige->get_field(field_name).get_type(); +#endif + Ioss::DataPool pool; pool.data.resize(isize); switch (interFace.data_storage_type) { diff --git a/packages/seacas/libraries/ioss/src/main/shell_interface.C b/packages/seacas/libraries/ioss/src/main/shell_interface.C index 40fad4c4e6b3..8af2049735c0 100644 --- a/packages/seacas/libraries/ioss/src/main/shell_interface.C +++ b/packages/seacas/libraries/ioss/src/main/shell_interface.C @@ -113,15 +113,15 @@ void IOShell::Interface::enroll_options() options_.enroll("netcdf5", Ioss::GetLongOption::NoValue, "Output database will be a netcdf5 (CDF5) " "file instead of the classical netcdf file format", - nullptr); + nullptr, nullptr, true); options_.enroll("shuffle", Ioss::GetLongOption::NoValue, "Use a netcdf4 hdf5-based file and use hdf5s shuffle mode with compression.", nullptr); options_.enroll("compress", Ioss::GetLongOption::MandatoryValue, - "Specify the hdf5 zlib compression level [0..9] or szip [even, 4..32] to be used " - "on the output file.", + "Specify the compression level to be used. Values depend on algorithm:\n" + "\t\tzlib/bzip2: 0..9\t\tszip: even, 4..32\t\tzstd: -131072..22", nullptr); options_.enroll( @@ -132,7 +132,20 @@ void IOShell::Interface::enroll_options() options_.enroll( "szip", Ioss::GetLongOption::NoValue, "Use the SZip library if compression is enabled. Not as portable as zlib [exodus only]", - nullptr, nullptr, true); + nullptr); + + options_.enroll("zstd", Ioss::GetLongOption::NoValue, + "Use the Zstandard compression method if compression is enabled [exodus only].", + nullptr); + + options_.enroll("bzip2", Ioss::GetLongOption::NoValue, + "Use the Bzip2 compression method if compression is enabled [exodus only].", + nullptr); + + options_.enroll("quantize_nsd", Ioss::GetLongOption::MandatoryValue, + "Use the lossy quantize compression method. Value specifies number of digits to " + "retain (1..15) [exodus only]", + nullptr, nullptr, true); #if defined(SEACAS_HAVE_MPI) options_.enroll( @@ -228,8 +241,15 @@ void IOShell::Interface::enroll_options() nullptr, nullptr, true); #endif + options_.enroll("select_change_sets", Ioss::GetLongOption::MandatoryValue, + "Read only the specified change set(s) (comma-separated list) from the input " + "file. Use \"ALL\" for all change sets (default).", + nullptr); + options_.enroll( + "extract_change_set", Ioss::GetLongOption::MandatoryValue, + "Write the data from the specified change_set (formerly group) to the output file.", nullptr); options_.enroll("extract_group", Ioss::GetLongOption::MandatoryValue, - "Write the data from the specified group to the output file.", nullptr); + "[deprecated] Use `--extract_change_set`.", nullptr); options_.enroll( "split_times", Ioss::GetLongOption::MandatoryValue, @@ -424,6 +444,7 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) netcdf4 = false; netcdf5 = false; ints_32_bit = true; + zlib = false; } if (options_.retrieve("netcdf4") != nullptr) { @@ -442,40 +463,44 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) if (options_.retrieve("szip") != nullptr) { szip = true; zlib = false; + zstd = false; + bz2 = false; + } + if (options_.retrieve("zstd") != nullptr) { + szip = false; + zlib = false; + zstd = true; + bz2 = false; + } + if (options_.retrieve("zlib") != nullptr) { + szip = false; + zlib = true; + zstd = false; + bz2 = false; + } + if (options_.retrieve("bzip2") != nullptr) { + szip = false; + zlib = false; + zstd = false; + bz2 = true; } - zlib = (options_.retrieve("zlib") != nullptr); - if (szip && zlib) { + if (szip + zlib + zstd + bz2 > 1) { if (my_processor == 0) { - fmt::print(stderr, "ERROR: Only one of 'szip' or 'zlib' can be specified.\n"); + fmt::print(stderr, + "ERROR: Only one of 'szip' or 'zlib' or 'zstd' or 'bzip2' can be specified.\n"); } return false; } - compare = (options_.retrieve("compare") != nullptr); - ignore_qa_info = (options_.retrieve("ignore_qa_info") != nullptr); - ignore_node_map = (options_.retrieve("ignore_node_map") != nullptr); - ignore_elem_map = (options_.retrieve("ignore_element_map") != nullptr); - ignore_edge_map = (options_.retrieve("ignore_edge_map") != nullptr); - ignore_face_map = (options_.retrieve("ignore_face_map") != nullptr); - delete_qa = (options_.retrieve("delete_qa_records") != nullptr); - delete_info = (options_.retrieve("delete_info_records") != nullptr); { - const char *temp = options_.retrieve("absolute"); + const char *temp = options_.retrieve("quantize_nsd"); if (temp != nullptr) { - abs_tolerance = std::strtod(temp, nullptr); - } - } - { - const char *temp = options_.retrieve("relative"); - if (temp != nullptr) { - rel_tolerance = std::strtod(temp, nullptr); - } - } - { - const char *temp = options_.retrieve("floor"); - if (temp != nullptr) { - tol_floor = std::strtod(temp, nullptr); + quant = true; + quantize_nsd = std::strtol(temp, nullptr, 10); + if (szip + zlib + zstd + bz2 == 0) { + zlib = true; + } } } @@ -484,12 +509,20 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) if (temp != nullptr) { compression_level = std::strtol(temp, nullptr, 10); + if (szip + zlib + zstd + bz2 == 0) { + zlib = true; + if (my_processor == 0) { + fmt::print(stderr, "INFO: Compression level specified, but no algorithm. Defaulting to " + "'zlib' and setting netcdf-4 file type.\n"); + } + } + if (zlib) { if (compression_level < 0 || compression_level > 9) { if (my_processor == 0) { fmt::print(stderr, "ERROR: Bad compression level {}, valid value is between 0 and 9 inclusive " - "for gzip compression.\n", + "for gzip/zlib compression.\n", compression_level); } return false; @@ -518,6 +551,34 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) } } + compare = (options_.retrieve("compare") != nullptr); + ignore_qa_info = (options_.retrieve("ignore_qa_info") != nullptr); + ignore_node_map = (options_.retrieve("ignore_node_map") != nullptr); + ignore_elem_map = (options_.retrieve("ignore_element_map") != nullptr); + ignore_edge_map = (options_.retrieve("ignore_edge_map") != nullptr); + ignore_face_map = (options_.retrieve("ignore_face_map") != nullptr); + delete_qa = (options_.retrieve("delete_qa_records") != nullptr); + delete_info = (options_.retrieve("delete_info_records") != nullptr); + + { + const char *temp = options_.retrieve("absolute"); + if (temp != nullptr) { + abs_tolerance = std::strtod(temp, nullptr); + } + } + { + const char *temp = options_.retrieve("relative"); + if (temp != nullptr) { + rel_tolerance = std::strtod(temp, nullptr); + } + } + { + const char *temp = options_.retrieve("floor"); + if (temp != nullptr) { + tol_floor = std::strtod(temp, nullptr); + } + } + #if defined(SEACAS_HAVE_MPI) add_processor_id_field = (options_.retrieve("add_processor_id_field") != nullptr); @@ -622,7 +683,9 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) } } - groupName = options_.get_option_value("extract_group", groupName); + selectedChangeSets = options_.get_option_value("select_change_sets", selectedChangeSets); + changeSetName = options_.get_option_value("extract_group", changeSetName); + changeSetName = options_.get_option_value("extract_change_set", changeSetName); { const char *temp = options_.retrieve("field_suffix_separator"); @@ -732,6 +795,15 @@ bool IOShell::Interface::parse_options(int argc, char **argv, int my_processor) exit(EXIT_SUCCESS); } + if (!changeSetName.empty() && !selectedChangeSets.empty()) { + if (my_processor == 0) { + fmt::print( + stderr, + "ERROR: Only one of 'extract_change_set' or 'select_change_sets'can be specified.\n"); + } + return false; + } + // Parse remaining options as directory paths. if (option_index < argc - 1) { while (option_index < argc - 1) { diff --git a/packages/seacas/libraries/ioss/src/main/shell_interface.h b/packages/seacas/libraries/ioss/src/main/shell_interface.h index a391174c7a82..6b781b0d3c0a 100644 --- a/packages/seacas/libraries/ioss/src/main/shell_interface.h +++ b/packages/seacas/libraries/ioss/src/main/shell_interface.h @@ -35,7 +35,8 @@ namespace IOShell { std::string outputFile; std::string inFiletype{"unknown"}; std::string outFiletype{"unknown"}; - std::string groupName; + std::string changeSetName; + std::string selectedChangeSets; std::string decomp_method; std::string decomp_extra{"processor_id"}; std::string compose_output{"default"}; @@ -53,6 +54,7 @@ namespace IOShell { int surface_split_type{-1}; int data_storage_type{0}; int compression_level{0}; + int quantize_nsd{0}; int serialize_io_size{0}; int flush_interval{0}; @@ -78,8 +80,11 @@ namespace IOShell { // -> file.A, t=7,8 -> file.B int split_cyclic{0}; bool shuffle{false}; - bool zlib{true}; + bool zlib{false}; bool szip{false}; + bool zstd{false}; + bool bz2{false}; + bool quant{false}; bool debug{false}; bool detect_nans{false}; bool statistics{false}; diff --git a/packages/seacas/libraries/ioss/src/main/skinner.C b/packages/seacas/libraries/ioss/src/main/skinner.C index bda07b2181c2..f63ad50d9a56 100644 --- a/packages/seacas/libraries/ioss/src/main/skinner.C +++ b/packages/seacas/libraries/ioss/src/main/skinner.C @@ -65,11 +65,9 @@ namespace { size_t max_face = std::string("Face Count").length(); for (auto &eb : ebs) { const std::string &name = eb->name(); - if (name.length() > max_name) { - max_name = name.length(); - } - size_t face_width = Ioss::Utils::number_width(boundary_faces[name].size()); - max_face = face_width > max_face ? face_width : max_face; + max_name = std::max(max_name, name.length()); + size_t face_width = Ioss::Utils::number_width(boundary_faces[name].size()); + max_face = std::max(max_face, face_width); } max_name += 4; // Padding max_face += 4; diff --git a/packages/seacas/libraries/ioss/src/main/test/exodus_Q2_bc_parents.gold b/packages/seacas/libraries/ioss/src/main/test/exodus_Q2_bc_parents.gold index 6020ad82cc38bdedf7aa3ab3dd47813c76ba9948..0c991edefa4a08d804d69ab74fcc4cbb9a76e945 100644 GIT binary patch literal 1472256 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

%_=o)b%YPK0 zAcZJQ5sFfb;*_8yr6^4q%2JN>6Q1&n=e*!0uXxQH-tvz3eBdLW_{~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12KgTs0A@eld=m;We0K?+frA{3<< z#VJ8aN>Q3Jl%*WysX#?4QJE@Kr5e?#K}~8=n>y5`9`$KJLmJVTCN!lP&1pePTG5&| zw51*G=|D$1(U~rEr5oMpK~H+on?CfVAN?7?Kn5|GAq-_0!x_OyMlqT(jAb0-nZQIQ zF_|e$Wg63&!Axc`n>oy79`jkiLKd-@B`jqb%UQunR$y!A)*)n>*a) z9`|{`Lmu&%Cp_gD&w0U1Uh$eYyyYG5`M^g$@tH4tFi_OMpjK;QY+qP}nwr$(CZQC|FA9H|RGLe}q zWF;Hf$w5wXAv$*+@{*7I6rdo5C`=KGQjFr1pd_UzO&Q8kj`CEXB9*926{=E=>eQen zwWv)U>QayTG@v1kXiO8D(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1z35FJ`qGd7 z3}7IG7|alcGK}GjU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s<}#1@EMOsvSj-ZZ zvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk%^TkGj`w`v zBcJ%p7rye1@BH8=zxd4`{ssi(2_O)G2|`eU5u6Z&Bov_uLs-HQo(M!F5|R0bC`2V1 z(TPD!ViB7-#N}V&5uXGkBoT>8LQ;~Eoc~BcN>Y)UG^8aR>B&GwGLe}qWF;Hf$w5wX zksIN8@{*7I6rdo5C`=KGQjFr1pd_UzO&Q8kj`CEXB9*926{=E=>eQenwWv)U>QayT zG@v1kXiO8D(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1z35FJ`qGd73}7IG7|alc zGK}GjU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s<}#1@EMOsvSj-ZZvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk%^TkGj`w`vBcJ%p7rye1 z@BH8=zxd4`{ssi(4ImJK2|`eU5u6Z&Bov_uLs-HQo(M!F5|R0bC`2V1(TPD!ViB7- z#N}V&5uXGkBoT>8LQ;~Eoc~BcN>Y)UG^8aR>B&GwGLe}qWF;Hf$w5wXk()e-&zq0@ z6rdo5C`=KGQjFr1pd_UzO&Q8kj`CEXB9*926{=E=>eQenwWv)U>QayTG@v1kXiO8D z(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1z35FJ`qGd73}7IG7|alcGK}GjU?ig$ z%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s<}#1@EMOsvSj-ZZvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk%^TkGj`w`vBcJ%p7rye1@BH8=zxd4` z{ssi(3m_1I2|`eU5u6Z&Bov_uLs-HQo(M!F5|R0bC`2V1(TPD!ViB7-#N}V&5uXGk zBoT>8LQ;~Eoc~BcN>Y)UG^8aR>B&GwGLe}qWF;Hf$w5wXk()f^#ejVIDL_FAQJ5kW zr5MF2K}kwcnlhB79ObD%MJiF5DpaK!)u};EYEhdy)TJKvX+T37(U>MQr5Vj>K}%ZE znl`kh9qs8rM>^4&E_9_E-RVJ3deNIc^ravD8NfgWF_<9?Wf;R5!AM3inlX%J9OIe5 zL?$trDNJP=)0x3cW-*&N%w-<)S-?UTv6v++Wf{v^!Ae%Knl-Ft9qZY^MmDjTEo@~Q z+u6ZRcCnj1>}4POIlw^fMJ{ofD_rFo*SWz>ZgHDC z+~pqkdB8&+@t7w({0#`mA3z`i z6NI1yBRC-lNhm@ShOmSqJQ0XUBqH+t(vyLVWFj+J$VxV{lY^Y(A~$)+OFm4I4f|8V? zG-W7DIm%Okid3R9Rj5ies#AlS)S@Q6^rAO?=u1EPGk}2%VlYD($}omAf{~13G-DXcIL0%9iA-WLQ<%y$ zrZa|!^2 z*vmflbAW>!;xI=z$}x^}f|H!$G-o)=InHx|i(KL|SGdYGu5*K%+~PKOxXV56^MHpu z;xSKn$}^txf|tDFHE(#!JKpnwk9^`YU--&5zVm~h{Ngu%_!|&VAb>ywCI~?ZMsPw9 zl2C*u3}FdJcp?yyNJQozq7ap6L?;F@iA8MU5SM?6M|={HkVGUV2}wyta{eO)DM>|Y z(vX&Pq$dLz$wX$dkdMhyn#EL}7|hlwuU81SKg&Y06NRa+Ie6 z6{$pJs!)|`RHp_tsYPw-P?vhtrvVLVL}QxJlx8%i1ubbsYueD3cC@Dh9qB}8y3mzw zbf*VB=|yk)(3gJnX8;2k#9)Rnlwk~K1S1*6XvQ#>ag1jI6Pd(hrZAOhOlJl&nZ<18 zFqe7EX8{XY#A24Plw~Yu1uI#_YSyrpb*yIt8`;EWwy>3LY-a~M*~M=5u$O)8=Ku#e z#9@wblw%y{1SdJgY0hw#bDZY_7rDe`u5guWT;~Qixy5bnaF=`B=K&9S#ABZDlxIBW z1uuEUYu@mdcf98VANj;*zVMZAeCG#0`NePk@HZf!U;u##Ob~(+jNpVIB%ugR7{U^c z@I)XYk%-JcL?J5Ch)xV*5{uZxAuj(CkN6}YA&E##5|WaP zs7?)PQj6Nup)U2PPXij#h{iObDa~k33tG~O*0iB5?PyO2I?{>GbfGKV=uQuM(u>~o zp)dXD&j1E8h`|hDD8m@e2u3oB(Trg%;~38bCNhc1Okpb1n9dAlGK<;FVJ`ES&jJ>* zh{Y^nDa%;S3Rbd;)vRGH>sZeQHnNG$Y+)*>T;VF$xXul3a*NyC;V$>M&jTLvh{rtPDbIM$3tsYy*Sz5^ z?|9D#KJtmreBmqK_|6Z0@{8a6;cq}dp#TCAm>>it7{LiaNJ0^sFoY!>;fX**A`zK? zh(c7N5uF&sBo?uWLtOqP9`Q*)LK2afBqSvn$@z~Iq$CxoNkdxFk)8}>Bomp*LRPYo zogCyO7rDtpUhsX|q%QJospq!zWQ zLtW}op9VCf5shg=Q<~A77PO=lt!YDB+R>g4bfgoV=|We!(VZUjq!+#ELtpyQp8*VH z5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*EQkJot z6|7_xt69TZ*0G)qY-AIg*}_(~v7H_4WEZ>H!(R5Wp937^5QjO!QI2t(6P)A}r#Zt} z&T*a#T;vj$xx!Vhah)67@%OetK1q7hfil%qTqs7NI$Q-!KjqdGOHNiAwqhq~0GJ`HF{ zBO23$rZl5DEoezATGNKMw4*&8=tw6z(}k{dqdPt5NiTZShraZqKLZ%ZAO&aK$t-3whq=sSJ_}gLA{MiRr7UAPD_F@YR>(8$u4%YhrR4$KLGwgl%@=2DMxuKP?1VhrV3T5Ms;dXlUmfK4t1$VeHze^Ml_}gO=(7R zTF{bKw5APhX-9iH(2-7brVCx^Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05jAjgD z8OL}gFp)`2W(rf8#&l*dlUdAW4s)5ud={{fMJ#3sOIgNpR)oEPH>V_oaPK?ImdY}aFI(~<_cH2#&vFR zlUv;84tKf7eID?TM?B^UPkF|3UhtAvyygvWdB=M`@R3h^<_ll>#&>@3lVAMi4}Sv! ziUtsfzyu*E!3a(WLK2G5gdr^92u}ne5{bzCLlmMCjp)Q6Cb5W39OCjX@rX|X5|W6- zBq1ruNX~zxASJ0tO&ZdYj`U<8Bbmrd7P69!?BpOPxyVf(@{*7I6rdo5C`=K|DO!x; zl%OP~C`}p4QjYRepdyv1Ockn9jq22(Cbg(d9qLk#`ZS;+jc800n$nEsw4f!eXiXd1 z(vJ3Ypd+2=Oc%P+jqdcIC%x!RANtad{tRFsgBZ*ZhBA!dj9?_A7|j^QGLG>~U?P*4 z%oL_Fjp@u_CbO8$9Og2Q`7B@|i&)GOma>fHtY9UpSj`&NvX1p^U?ZE@%oet?jqU7U zC%f3q9`>@2{T$#Rhd9g;j&h9SoZuv;3J>-%oo1$jqm*6C%^d3AN~de6bm2_feAuT zf)Sh$gd`N92}4-I5uOM{BodMNhbTlP8qtYCOkxq6IK<^&;t`(&BqR}uNkUSRk(~cX zK}u4Qnlz*(9qGwHMlz9^EMz4c*~vjpa*>-n! znJ#pt8{O$aPkPatKJ=v@{TaYO1~Hf+3}qO@8NoS|UJKW_S_j$lW9`Tqb zJmneBdBICw@tQZh}r{0uzLw1S2>h2uUbH z6Na#aBRmm^NF*Zj4^fCpG@=uOn8YGBafr*m#3MclNJt_QlZ2!sBRT((f|R5pHEBpo zI?|JYjASA+S;$H@vXg_HeGORG@>z0Xi77h(}I??qBU)3OFP=rfsS;dGhOIPH@ee< zp7f$OedtR+`ZIum3}P@t7|Jk)GlG$fVl-nI%Q(g}fr(6FGEEMhTBSjsY%vx1eZVl``6%R1JxfsJfpGh5ioHny{ao$O*ad)Ui9_H%%P9O5uX zILa}ObApqc;xuPC%Q?<-fs0(?GFQ0DHLi1mo800yceu+v?(=|$JmN7=c*--L^MaSW z;x%u0%RAolfscIRGhg`1H@@?OpZwxCfA|{^P$Gap1SSYU2}W>25Ry=YCJbQ-M|dI- zkw`@5AEFSIXhbIlF^NTN;t-dAiAQ`AkdQhL}7|hlwuUes1hY9MQO@VmU5J*0u`x5WvWn>YE-8N zHK|2y>QI+@)TaRrX+&e1(3EC0rv)u(MQhs7mUgtK10Cr^XS&dpZgi&yJ?TYn`p}nt z^k)DA8N^_QFqB~oX9Ob|#c0MbmT`<{0u!0UWTr5cX-sDZGnvI~<}jCe%x3`$S;S(N zu#{yiX9X)+#cI~DmUXOW0~^`IX11`EZER-;JK4o<_OO?I?B@UnImBU(aFk;l=L9D? z#c9rPmUEov0vEZ&Wv+0QYh33BH@U@a?r@iT+~)xgdBkI$@RVmf=LIi$#cSU1mUq18 z10VUsXTI>2Z+zzmKl#OP{_r;-pkx4n2uu)y5{%%4AS9s(O&G!wj_^bvB9Vy9KSUua z(TGkAViJqk#33&K5|8*KAR&oJOcIikjO6@B3R04a)TALT=}1ooGLnhRWFafr$W9J& zl8fBrAusvJPXP*2h{6=1D8(pF3Ct>4iqe#!EafOq1u9aB%2c5$)u>JlYEp~Z)S)i* zs80hL(ul@1p()L1P77Mniq^EDE$wJe2RhP;&UB$G-RMpadeV#D^r0{P=+6KKGKj$p zVJO2G&Im>_iqVW=EaMo@1ST?x$xLA?)0oZ-W-^P}%waC`n9l+hvWUejVJXX4&I(qt ziq))PE$dj%1~#&Z&1_*S+t|(ycCw4z>|rna*v|nDa)`qm;V8#A&IwL(iqo9oEay1S z1uk-l%Ut0q*SO9NZgPv;+~F?wxX%L~@`%Sg;VI8}&I?}hir2j1E$?{G2R`zN&wSx4 z-}ufCe)5ao{NZmvK&b!%5ttwZB^bd8K}bRonlOYV9N~#TL?RKHe~3a~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12KLtgTc zp8^!55QQm1QHoKV5|qTSQl%+FS;|qK3RI*Lm8n8is!^R9)T9=*sY6}rQJ)4hq!Ep2 zLQ|U2oEEgC6|HGQTiVf{4s@gwo#{eXy3w5;^rRQP=|f-o(VqbfWDtWH!cc}WoDqy< z6r&l#SjI7)2~1=XlbOO)rZJrv%w!g`nZsP>F`or2WD$#5!cvy8oE5BO6{}gpTGp|i z4Qyl+o7uuvwy~WZ>|__a*~4D;v7ZARF-b^DGLrKjDM(2wQj>-Q zWF+T5Qjn5Vq$Uk%Nk@7zkdaJeCJR}~Ms{+LlU(E`4|&N)ehN^KLKLP5MJYycN>Gwg zl*YI+WhqB_Do~M1RHh15sYZ2bP?K8JrVe$fM|~R5kVZ772~BB6b6U`nRY(34*DrVoATM}Gz|kUW_xyE&FaFbiy<_>qc$9*2~ zkVib`2~T;(b6)V0SG?v8Z+XXiKJbxGeC7*Z`NnsC@RMKs<_~`Z0?Gyuh`A@ASSVhO&sF#FY$;^0uqvl#3Ugp$w>6Q1&n z=e*!0uXxQH-tvz3eBdLW_{fVfU*Zv;1SBL8iAh3Il98PMNI^ zKt?i=nJi=_8`;T0PI8f(Jme)G`6)m_3Q?FM6r~u&DM3j}QJON8#lUjqsX#?4QJE@K zr5e?#K}~8=n>y5`9`$KJLmJVTCN!lP&1pePTG5&|w51*G=|D$1(U~rEr5oMpK~H+o zn?CfVAN?7?Kn5|GAq-_0!x_OyMlqT(jAb0-nZQIQF_|e$Wg63&!Axc`n>oy79`jki zLKd-@B`jqb%UQunR$y!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0U1Uh$eY zyyYG5`M^g$@tH4t76<6rwOiC`vJkQ-YF|qBLbFOF2v|UxA8LqB2#eN;RregPPQ$ zHg%{=J?hhdhBTrvO=wCpn$v=ow4ya_XiGcV(}9k3qBC9SN;kUGgP!!FH+|?!Kl(F( zfed0WLm0|1hBJbZjAArn7|S@uGl7XrVlq>h$~2}kgPF`?HglNEJm#~2g)Cw*OIXS> zma~GDtYS55Sj#%rvw@9lVl!LV$~LyMgPrVRH+$I2KK65fgB;>8M>xtcj&p*OoZ>WR zILkTCbAgLo;xbpb$~CTYgPYvqHg~woJ?`^>hdkmjPk72Rp7Vm2yy7))c*{H9^MQ|i z;xk|P$~V6AgP;83H-GpW5Ktk2Km;ZTK?z21LJ*QrgeDAO2}gJ$5Rphk<{zREm1smK z1~G|6Y~m1?e~CwY5|EHYBqj+-Nk(%1BLyi*MQYNJmUN^i0~yIgX0ni#Y-A?~ImtzC z@{pH&+=(3WeG z#AU83dBtnq@RoPH=K~-4#Am+nm2Z6K z2S546Z~pK%AfRFZfe1_xf)b42gdilL2u&Em5{~dhAR>{7%s)gSD$$5e3}ODP6vz-t?g_{pimC1~Q1j3}Gn47|sYrGK$fR zVJzbq&jcniiOEc1D$|(G3}!Nm+00=s^O(;97P5%NEMY0jSk4MovWnHLVJ+)e&jvQK ziOpTGEl83}hq|naM&{vXPw}QSEtG^7!YX+l$)(VP~vq!q1c zLtEO>o(^=R6P@WoSGv)i9`vLaz3D?=`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W83 z5|f$2RHiYV8O&rBvzfzO<}sfIEMyUjS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<^O7 z9qeQmyV=8D_OYJ>9OMv(Il@tnahwyJTwNFfSSgrXFqI3*}aDN0j@ zvXrAd6{tuhOs!mns#K#oHK<7~YEy^0)T2HPXhlxi$tXrMhOvxeJQJA6BqlS3sZ3)! zGnmONW;2Jm%ws+aSjZw4vxKEAV>v5W$tqT}hPA9?Jsa4_CN{H$t!!gEJJ`uCcC&}Q z>|;L%ILILmbA+QD<2WZc$tg~AhO?aGJQujgB`$M?t6bwcH@L|yZgYpb+~YnEc*r9j z^Mt27<2f&Q$tzy-hPS-qJsKlsTne)EUF0RdG42t;6l5R_m9Cj=o0 zMQFkhmT-h80uhNsWd0!vQHe%$Vi1#9#3l}L`ImUaCjkjbL}HSVlw>65KT?pARHP;i zX-P+VGLVr>WF`w)$wqc^kds{GCJ%YZM}7)WkU|uu2t_GIaY|5AZhTiM2TcCeFO>}C&p*~fkkaF9bB z<_JeQ#&J$?l2e@K3}-pVc`k5~OI+p(SGmS@Zg7)Z+~y8g@-Oj-PXZE>h{PlzDalCAf21HKsYp#4(vpt!WFRA% z$V?Wpl8x--ASb!VO&;=+kNgy%AcZJQ5sFfb;*_8yr6^4q%2JNYjOMhUC9P;p8`{#2_H>{lo#;##y3&pA^q?ob=uIE` z(vSWOU?77S%n*h$jNy!6B%>J37{)S=@l0SMlbFmDrZSD`%wQ(7n9UsKGLQKzU?GcG z%o3KejODCgC97D?8rHIo^=x1xo7l`2wz7@w>|iIm*v%gHvXA{7;2?)M%n^=qjN_c( zB&Rsd8P0N!^IYH}m$=Lou5yj*+~6j+xXm5za*z8w;31EA%oCpSjOV=IC9inR8{YDc z_k7?ZpZLrdzVeOl{NN|Q_{|^w1_V?KAP|8GLQsMcoDhU06rl-2Si%vW2t*_jk@<%x zL?s&0i9t+a5t}%~^$tANeUjK?+frA{3<<#VJ8aN>Q3Jl%*WysX#?4QJE@K#o%hysX=yOIp#IHngQ3?dd>AI?r62tnz(58u zm>~>h7{eLCNJcT5F^pv#;I&HLPVF>)F6YHnEv4Y-JnU*}+bBv70^YWgq)Fz(Edim?IqJ7{@umNltN^Go0ld z=efW|E^(PFT;&?qxxr0tahp5blYxw6A~RXYN;a~SgPi0dH+jfQ zKJrt5f)t`KMJP%!ic^A;l%h0cC`&oYQ-O+9qB2#eN;OQbUW1y{qBeD?OFin-fQB@p zF->SnGn&(amb9WZZD>n7+S7rKbfPm|=t?)b(}SM$qBni$OF#NEfPoBRFhdy1ForXN zk&I$AV;IXg#xsG5Oky%qn94M!GlQATVm5P_%RJ_@fQ2k#F-us=GM2M~m8@blYgo%V z*0X_)Y+^H8*vdAxvxA-NVmEu(%RcsVfP)<3Fh@AbF^+SBlbqr-XE@6_&U1l_T;eiU zxXLxIbAy}Q;x>1<%RTP%fQLNdF;95PGoJH;m%QRNZ+Oc)-t&QveBv`-_{ulF^MjxK z;x~Wz8xT+CMCKo&5S3^|Ck8QzMQq{_mw$;z zd=ik5L?k8&Nl8X>{v!n`NkwYXkd}0$Cj%MDL}s#(m26}u2RX?_Zt{?qeB`G91t~;f zicpkd6sH6wDMe|@P?mC(rveqJL}jW_m1q z#cl3zmwVjj0S|e^W1jGoXFTTxFL}jl-td-pyypWS`NU_w@Re_T=LbLe#c%%bHz1&9 z0D%Zh5P}kn;DjI~p$JVF!V-?~L?9xOh|E7kAu7>`P7Goai`c{=F8>mb_#_}9iAYQm zl9G(%{6`8>l8V%%AuZ`hPX;oQiOggnE7{0S4sw!<+~grI`N&TJ3Q~x|6rm`^C{77V zQi{@)p)BPnPX#JciON)=D%Ge?4a}}ti`vwoF7>ES0~*qZ#x$WR&1g;wTGEQvw4p8S zXio<^(uvM=p)1|!P7iw0i{A91Fa7Ax00uIM!3<$2!x+v8Mly=gjA1O}7|#SIGKtAd zVJg#@&J1QUi`mR!F7uer0v57}#Vlbd%UI3|Rd2<@ku~J5|NlBBqbTi`HvK& zBo(PiLt4_2o(yCp6Pd|ERP^DMC?-QJfN#q!gtoLs`mE zo(fc?5|yb!RjN^)8q~z_TD7S|UFuPv1~jA*jcGztn$esVw4@cSX+vAu(Vh-;q!XR# zLRY%cogVb07rp62U;5FX0SsgigBik5hB2HGjARs}8N*n{F`fxbWD=8^!c?X)of*tz z7PFbdT;?&K1uSF{i&?@_ma&`_tYj6dS;Jb^v7QZVWD}d&!dAAiogM6C7rWWRUiPt{ z103WKhdIJgj&Yn5oa7XzIm21bah?lYUG8z82R!5vk9opV zp7ER)yyO+HdBa=Y@tzNSYN+qP}nwr$(CZQHh!&c|F}HzJXUOcbIL zjp)Q6Cb5W39O4p>_#_}9iAYQml9G(%q#z}!NKG2jl8*FbAS0Q`Oct_|jqKzgC%MQ? z9`cfp{1l)dg(yrBic*Z?l%OP~C`}p4QjYRepdyv1Ockn9jq22(CbbZ~b{*>6Q1&n=e*!0uXxQH-tvz3eBdLW_{Ef)Sh$gd`OI5t=ZBB^=?2Ktv)DnJ7dh8qtYCOkxq6 zIK(9$@ku~J5|NlBBqbTiNkK|dk(xB5B^~L>Kt?i=nJi=_8`;T0PI8f(Jme)G`6)m_ z3Q?FM6r~u&DM3j}QJON8r5xp{Kt(E1nJQGJ8r7*mO=?ja;p^0;9`$KJLmJVTCN!lP z&1pePTG5&|w51*G=|D$1(U~rEr5oMpK~H+on?CfVAN?7?Kn5|GAq-_0!x_OyMlqT( zjAb0-nZQIQF_|e$Wg63&!Axc`n>oy79`jkiLKd-@B`jqb%UQunR$y z!A)*)n>*a)9`|{`Lmu&%Cp_gD&w0U1Uh$eYyyYG5`M^g$@tH4th2uUdZBQ#+MOE|(4frvyRGEs<1G@=uOn8YGBafnMi;*)@c zBqA|MNJ=u2lY*3_A~k79OFGh%fsAA#Gg-(=HnNk0oa7=mdB{sX@>76<6rwOiC`vJk zQ-YF|qBLbFOF7C@fr?b3GF7NbHL6pCn$)5;br8R9J?hhdhBTrvO=wCpn$v=ow4ya_ zXiGcV(}9k3qBC9SN;kUGgP!!FH+|?!Kl(F(fed0WLm0|1hBJbZjAArn7|S@uGl7Xr zVlq>h$~2}kgPF`?HglNEJm#~2g)Cw*OIXS>ma~GDtYS55Sj#%rvw@9lVl!LV$~LyM zgPrVRH+$I2KK65fgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb$~CTYgPYvqHg~wo zJ?`^>hdkmjPk72Rp7Vm2yy7))c*{H9^MQ|i;xk|P$~V6AgP;83H-GpW5Ku3GK>R~s zg77av2}W>25Ry>*M`*$jmT-h80uhNsWTFt2XhbIlF^NTN;t-d3#3um>Nkn3jkd$O3 zCj}`YE-8NHK|2y>QEO0>eZ(K4QWJUn$VPHG^YhEX+>+=(3WeG#AU83dBtnq@RoPH=K~-4#Am+nm2Z6K2S546Z~pK%AfSE#f%u2O1mRzT5{%%4 zAS9vqkI;l6Ea3=G1R@fN$V4G3(TGkAViJqk#33&6h))6%l8D44At}j7P6|?ziqxbb zE$K*41~QU~%w!=e*~m@~a*~VODP6JlYEp~Z)S)i*Frj_}8q$cyG@&WYXif`S(u&r!p)KubPX{{EiOzJPE8XZ$ z4|>vz-t?g_{pimC1~Q1j3}Gn47|sYrGK$fRVJzbq&jcniiOEc1D$|(G3}!Nm+00=s z^O(;97P5%NEMY0jSk4MovWnHLVJ+)e&jvQKiOpZ7q7j`K#3UB6i9=lC5uXGkBoT>8LQ;~EoD`%a6{$%>TGEl83}hq| znaM&{vXPw}o(^=R6P@WoSGv)i9`vLaz3D?= z`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W835|f$2RHiYV8O&rBvzfzO<}sfIEMyUj zS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<^O79qeQmyV=8D_OYJ>9OMv(Il@tnahwyJ zTwNFfSSgrXFqI3*}aDN0j@vXrAd6{tuhDpQ53RHHgIs7WnqQ-`|L zqdpC2NFy54gr+p3IW1^OD_YZrwzQ)?9q33WI@5)&bfY^x=t(bn(}%wFqdx-}$RGwY zgrN*$I3pOzC`L1ev5aFp6PU;(CNqVpOk+ATn8_?=Gl#j%V?GO5$RZZAgrzKFIV)Jn zDps?GwX9=38`#JuHnWATY-2k+*vT$-vxmLxV?PHt$RQ4MgrgkeI43yCDNb{Svz+5R z7r4kJE^~#eT;n=7xXCSUbBDX!<30~~$Ri%}gr_{?IWKt0D_--4x4h#$ANa^8KJ$gI zeB(Pm_{lGR^M}6y0gVC(#6JWk2>%k4U<4-wAqmBQgeDAO2}gJ$5RphkCJIrBMs#8j zlUT$i4snS`d=ik5L?k8&Nl8X>Qjn5Vq$Uk%Nk@7zkdaJeCJR}~Ms{+LlU(E`4|&N) zehN^KLKLP5MJYycN>Gwgl%@=2DMxuKP?1VhrV3T5Ms;dXlUmfK4t1$VeHzdZLmD-v z2~BB6b6U`nRY(34*DrVoATM}Gz|kUW_ zxyE&FaFbiy<_>qc$9*2~kVib`2~T;(b6)V0SG?v8Z+XXiKJbxGeC7*Z`NnsC@RMKs z<_~`Z0vZPph<^x75dI}7!3a(WLK2Gq2u&Em5{~dhAR>{7OcbILjp)Q6Cb5W39O4p> z_#_}9iAYQml9G(%q#z}!NKG2jl8*FbAS0Q`Oct_|jqKzgC%MQ?9`cfp{1l)dg(yrB zic*Z?l%OP~C`}p4QjYRepdyv1Ockn9jq22(Cbg(d9qLk#`ZS;+jWDHg6PnVD=Cq(C zt!Paf+R~2pbf6=h=u8*7(v9x)peMcPO&|KwkNyl`AcGjp5QZ|0;f!D;qZrK?#xjoa zOkg6Dn9LNWGL7lXU?#Je%^c=3kNGTMA&Xed5|*-z<*Z;Ot60q%*0PTEY+xgs*vuBT zvW@NRU?;oS%^vo$kNq6rAcr{25sq?<>6Q1&n=e*!0uXxQH-tvz3eBdLW_{Ef)Sh$gd`OI5t=ZBB^=?2Ktv)DnJ7dh8qtYCOkxq6IK(9$@ku~J5|NlB zBqbTiNkK|dk(xB5B^~L>Kt?i=nJi=_8`;T0PI8f(Jme)G`6)m_3Q?FM6r~u&DM3j} zQJON8r5xp{Kt(E1nJQGJ8r7*mO=?k_I@F~e^=Uvu8qpYInlz;u&1pePTG5&|w51*G z=|D$1(U~rEr5oMpK~H+on?CfVAN?7?Kn5|GAq-_0!x_OyMlqT(jAb0-nZQIQF_|e$ zWg63&!Axc`n>oy79`jkiLKd-@B`jqb%UQunR$y!A)*)n>*a)9`|{` zLmu&%Cp_gD&w0U1Uh$eYyyYG5`M^g$@tH4th2uUdZBQ#+MOE|(4frvyRGEs<1G@=uOn8YGBafnMi;*)@cBqA|MNJ=u2lY*3_ zA~k79OFGh%fsAA#Gg-(=HnNk0oa7=mdB{sX@>76<6rwOiC`vJkQ-YF|qBLbFOF7C@ zfr?b3GF7NbHL6pCn$)5;b*M`{>eGORG@>z0FsErVn$v=ow4ya_XiGcV(}9k3qBC9S zN;kUGgP!!FH+|?!Kl(F(fed0WLm0|1hBJbZjAArn7|S@uGl7XrVlq>h$~2}kgPF`? zHglNEJm#~2g)Cw*OIXS>ma~GDtYS55Sj#%rvw@9lVl!LV$~LyMgPrVRH+$I2KK65f zgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb$~CTYgPYvqHg~woJ?`^>hdkmjPk72R zp7Vm2yy7))c*{H9^MQ|i;xk|P$~V6AgP;83H-GpW5YQ}uK>R~sg77av2}W>25Ry>* zM`*$jmT-h80uhNsWTFt2XhbIlF^NTN;t-d3#3um>Nkn3jkd$O3Cj}` zYE-8NHK|2y>QI+@)TaRrX+&e1&=iB3HKzqFX+>+=(3WeG#AU83dBtnq z@RoPH=K~-4#Am+nm2Z6K2S546Z~pK%AfR~wf%u2O1mRzT5{%%4AS9vqkI;l6Ea3=G z1R@fN$V4G3(TGkAViJqk#33&6h))6%l8D44At}j7P6|?ziqxbbE$K*41~QU~%w!=e z*~m@~a*~VODP6JlYEp~Z z)S)i*s80hL(ul@1p()KUsd)=p(u&r!p)KubPX{{EiOzJPE8XZ$4|>vz-t?g_{pimC z1~Q1j3}Gn47|sYrGK$fRVJzbq&jcniiOEc1D$|(G3}!Nm+00=s^O(;97P5%NEMY0j zSk4MovWnHLVJ+)e&jvQKiOpZ7 zq7j`K#3UB6i9=lC5uXGkBoT>8LQ;~EoD`%a6{$%>TGEl83}hq|naM&{vXPw}o(^=R6P@WoSGv)i9`vLaz3D?=`q7^O3}g_48NyJ8 zF`N;MWE7(r!&t^Ko(W835|f$2RHiYV8O&rBvzfzO<}sfIEMyUjS;A75v78mGWEHDf z!&=s{o(*hd6Pww>R<^O79qeQmyV=8D_OYJ>9OMv(Il@tnahwyJTw zNFfSSgrXFqI3*}aDN0j@vXrAd6{tuhDpQ53RHHgIs7WnqQ-`|LqdpC2NFy54gr+p3 zIV~`&Wh+|KhPJe$Jss#sCpy!Gu5_b2J?Kdlxi$tXrM zhOvxeJQJA6BqlS3sZ3)!GnmONW;2Jm%ws+aSjZw4vxKEAV>v5W$tqT}hPA9?Jsa4_ zCN{H$t!!gEJJ`uCcC&}Q>|;L%ILILmbA+QD<2WZc$tg~AhO?aGJQujgB`$M?t6bwc zH@L|yZgYpb+~YnEc*r9j^Mt27<2f&Q$tzy-hPS-qJsKlsTne)EUF z0RgQ72*f`GCJ6r$lwbrW1R)8CL?#MRiAHo{5R+KMCJu3lM|={H zkVGUV2}wyta#E0zRHP;iX-P+VGLVr>WF`w)$wqc^kds{GCJ%YZM}7)WkU|uu2t_GI zaY|5AZhTiM2T zcCeFO>}C&p*~fkkaF9bB<_JeQ#&J$?l2e@K3}-pVc`k5~OI+p(SGmS@Zg7)Z+~y8< zxyOAT@Q_D5<_S-E#&cfql2^Ru4R3kJdp_`yPkiPJU-`y&e(;lD{N@jT0|HtH5Qu*W zOc4GhD8UF$2tpEy{|HSO!V-?~L?9xOh)fis5{>A@ASSVhO&sD9kN6}YA&E##5|WaP z18`{#2_H>{l zo#;##y3&pA^q?ob=uIE`(vSWOU?77S%n*h$jNy!6B%>J37{)S=@l0SMlbFmDrZSD` z%wQ(7n9UsKGLQKzU?GcG%o3KejODCgC97D?8rHIo^=x1xo7l`2wz7@w>|iIm*v%gH zvXA{7;2?)M%n^=qjN_c(B&Rsd8P0N!^IYH}m$=Lou5yj*+~6j+xXm5za*z8w;31EA z%oCpSjOV=IC9inR8{YDc_k7?ZpZLrdzVeOl{NN|Q_{|^w1_ZPTAQ1l$m>~R1P=XPh z5QHQY{}Gxnge4r|i9kdm5t%4NB^uF*K}=#1n>fTJ9`Q*)LK2afBqSvn$w@&^$tANeUjK?+frA{3<<#VJ8aN>Q3Jl%*WysX#?4 zQJE@Kr5e?#K}~8=n>y5`9`$KJLmJVTCN!lP&1pePTG1Ng+O(w|?dd>AI?r62tnz(58um>~>h7{eLCNJcT5F^pv#;I&HLPVF>)F6YHnEv4Y-JnU*}+bBv70^YWgq)Fz(Edi zm?IqJ7{@umNltN^Go0ld=efW|E^(PFT;&?qxxr0tahp5blYxw6 zA~RXYN;a~SgPi0dH+jfQKJrt5f)t`KMJP%!ic^A;l%h0cC`&oYQ-O+9qB2#eN;Rre zgPPQ$Hg%{=J?hhdhBTrvO=wCpn$v=ow4ya_Ft2Sp+S7rKbfPm|=t?)b(}SM$qBni$ zOF#NEfPoBRFhdy1ForXNk&I$AV;IXg#xsG5Oky%qn94M!GlQATVm5P_%RJ_@fQ2k# zF-us=GM2M~m8@blYgo%V*0X_)Y+^H8*vdAxvxA-NVmEu(%RcsVfP)<3Fh@AbF^+SB zlbqr-XE@6_&U1l_T;eiUxXLxIbAy}Q;x>1<%RTP%fQLNdF;95PGoJH;m%QRNZ+Oc) z-t&QveBv`-_{ulF^MjxK;x~Wz8xYVgfI$31V1n>3K?z21LJ*Qr{6}cQ5SDO+Cjt?P zL}a26m1smK1~G|6Y~m1?c*G|G2}wj^l8}^SBqs$aNkwYXkd}0$Cj%MDL}s#(m26}u z2RX?_Zt{?qeB`G91t~;ficpkd6sH6wDMe|@P?mC(rveqJL}jW_m1+=&=v#RwWk9e=|pF`(3Ngq#cl3zmwVjj0S|e^W1jGoXFTTxFL}jl-td-pyypWS`NU_w z@Re_T=LbLe#c%%bHz1&W0D<_2zy#r6f)b42gdilL_>a(pAuQntPXrP^ zDMC?-QJfN#q!gtoLs`mEo(fc?5|yb!RjN^)8q}l~wW&j0>QSEtG^7!YX+l$)(VP~v zq!q1cLtEO>9wR$+q!XR#LRY%cogVb07rp62U;5FX0SsgigBik5hB2HGjARs}8N*n{ zF`fxbWD=8^!c?X)of*tz7PFbdT;?&K1uSF{i&?@_ma&`_tYj6dS;Jb^v7QZVWD}d& z!dAAiogM6C7rWWRUiPt{103WKhdIJgj&Yn5oa7XzIm21bah?lYUG8z82R!5vk9opVp7ER)yyO+HdBa=Y@tzNS}a>$Rs8+ zg{e$qIy0EbEM_x@xy)le3s}e^7PEw-V?7(#$R;+kg{^F3J3H9P zE_Snrz3gK@2RO(f4s(Q~9OF1AILRqabB42=<2)C*$R#dwg{xfSIybn@0trU*qTMsZ3|l2VkW3}q=t zc`8tmN>ru_RjEdGYEY9})TRz~sYiVp(2zznrU^}HMsr%wl2){)4Q**hdpgh&Lpyb* z3tj0(cY4s1Ui799ed$Mk1~8C83}y&J8OCr%Fp^P>W(;E)$9N_%kx5Ku3R9WJbY?J< zS-EM^HyS;lf!u##1*W({ju$9gufkxgu73tQR7c6P9nUF>ELd)dc+ z4seh|9Oei|ImU5LaFSD;<_u>!$9XPrkxN|W3Rk(tb#8EzTioUjce%%X9`KMyJmv{c zdB$^I@RC=&<_&Lo$9q2TkxzW)3t#!hcYg4bU;O3|e**$K2M~yV2uu+EB`CoNP6$F0 zivI{r7{U^c@I)XYk%&wbq7seh#2_ZIh)o>g5|8*KAR&oJOcIikjO3&sC8HNAm8eV= zs#1;W)SxD{s7)Q}QjhvHpdpQDOcR>YjOMhUC9P;p8`{#2_H>{loiMd?7rN4o?)0E1 zz35FJ`qGd73}7IG7|alcGK}GjU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s<}#1@ zEMOsvSj-ZZvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk z%^TkGj`w`vBcJ%p7rye1@BH8=zxd4`{sshe2_O*v5SSqROHhIloDhU06#o&LFoY!> z;fX**A`zJ=L?s&0i9t+a5t}%~B_8ofKtd9cm?R`68OcdON>Y)UG^8aR>B&GwGLe}q zWF;Hf$w5wXk()f^B_H`IKtT#om?9LV7{w_;NlH=yOIp#IHngQ3?dd>AI?)+pyL6=+-RVJ3deNIc^ravD z8NfgWF_<9?Wf;R5!AM3inlX%J9OIe5L?$trDNJP=)0x3cW-*&N%w-<)S-?UTv6v++ zWf{v^!Ae%Knl-Ft9qZY^MmDjTEo@~Q+u6ZRcCnj1>}4POIlw^fMJ{ofD_rFo*SWz>ZgHDC+~pqkdB8&+@t7w({0#``8bBcaAuvJsm!JeAI3Wm0DE=cfVF*h&!V`grL?SX# zh)Oh~6N8wF-b^DGLn;ml%ygxX-G>t(vyLVWFj+J$VxV{lY^Y( zA~$)+OFr^bfPxgFFhwXzF^W@yl9Zw}WhhHI%2R=gRH8Cfs7f`eQ-hk+qBeD?OFin- zfQB@pF->SnGn&(amb9WZZD>n7+S7rKbfPm|Ft=+ry3>Q6^rAO?=u1EPGk}2%VlYD( z$}omAf{~13G-DXcIL0%9iA-WLQ<%y$rZa|!^2*vmflbAW>!;xI=z$}x^}f|H!$G-o)=InHx| zi(KL|SGdYGu5*K%+~PKOxXV56^MHpu;xSKn$}^txf|tDFHE(#!JKpnwk9^`YU--&5 zzVm~h{Ngu%_!|(=Er3A$LtujNFF^@La6%B0Q2a+|!Vs2lgeL+Ki9}?g5S3^|Ck8Qz zMQq{_mw3b{0SQS&Vv>-QWF#jADM>|Y(vX&Pq$dLz$wX$dkd z00k*TVTw?cViczYB`HN|%21Yal&1m}sYGR}P?c&_rv^2tMQ!R(mwMEv0S#$HW17&E zW;CY-Eont-+R&DEw5J0d=|pF`&=rHbb*BeC=|yk)(3gJnX8;2k#9)Rnlwk~K1S1*6 zXvQ#>ag1jI6Pd(hrZAOhOlJl&nZ<18Fqe7EX8{XY#A24Plw~Yu1uI#_YSyrpb*yIt z8`;EWwy>3LY-a~M*~M=5u$O)8=Ku#e#9@wblw%y{1SdJgY0hw#bDZY_7rDe`u5guW zT;~Qixy5bnaF=`B=K&9S#ABZDlxIBW1uuEUYu@mdcf98VANj;*zVMZAeCG#0`NePk z@HZf!djNs>hrk5kUxE^h;DjI~q4`P7Goai`c{=F7b#@ z0uqvl#3Ugp$w*ELQj&_)q#-ToNKXbbl8MY@AuHL)P7ZRCi`?WPFZsw%0SZ!x!W5w> z#VAe*N>Yl_l%Xu;C{G0{Qi;k`p(@p=P7P{Oi`vwoF7>ES0~*qZ#x$WR&1g;wTGEQv zw4p8SXio<^(uvM=p)1`mxqA~op)dXD&j1E8h`|hDD8m@e2u3oB(Trg%;~38b zCNhc1Okpb1n9dAlGK<;FVJ`ES&jJ>*h{Y^nDa%;S3Rbd;)vRGH>sZeQHnNG$Y+)*>T;VF$xXul3a*NyC z;V$>M&jTLvh{rtPDbIM$3tsYy*Sz5^?|9D#KJtmreBmqK_|6Z0@{8a6;cq}dj{pMk z4}l57zXT;1!3jY~Lh&D=2}4-I5uOM{BodK{LR6v=ofyO<7O{y#T;dU*1SBL8iAh3I zl98Mgq$CxoNkdxFk)8}>Bomp*LRPYoogCyO7rDtpUhrl%y1; zDMMMxQJxA^q!N{>LRG3!of_1n7PYBEUFuPv1~jA*jcGztn$esVw4@cSX+vAu(Vh-; zq!XR#LRY%c9iw~nq!+#ELtpyQp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4=Ok@(1nZi`2 zF`XIAWEQiT!(8Sup9L&r5sO*EQkJot6|7_xt69TZ*0G)qY-AIg*}_(~v7H_4WEZ>H z!(R5Wp937^5QjO!QI2t(6P)A}r#Zt}&T*a#T;vj$xx!Vhah)67@%3R8rl6r(sLC`l&aK$t-3w zhq=sSJ_}gLA{MiRr7UAPD_F@YR>(8$u4%YhrR4$KLthbYc*bSi~j{afwHK5|EHYBqj+-Nk(!~kdjoSCJkvxM|v`l zkxXPJ3t7oVc5;xDT;wJXdC5n93Q&+j6s8D8DMoQhP?A!VrVM2%M|mnxkxEpi3RS5_ zb!t$PTGXZvb*V>v8qknNG^PnnX-0Ee(2`cPrVVXrM|(QZkxq1`3tj0(cY4qh!+Z6n z4}IxJe+Dp+K@4UHLm9?!Mlh05jAjgD8OL}gFp)`2W(rf8#&l*dlUdAW4s)5ud={{f zMJ#3sOIgNpR)oE zPH>V_oaPK?ImdY}aFI(~<_cH2#&vFRlUv;84tKf7eID?TM?B^UPkF|3UhtAvyygvW zdB=M`@bQ24?L4gJu5bANPLU+ZJdc%9L}b=7Cdw2tMWsPVMF=HBp=gpO&3o@kWyn-! z+dO2>kSQ55%g}&Ae(&?T?(X~gIiB;z`TYAhj@Pk{_5H5(`K<4_c6%=L<4kVsZYpoAJwh6-w;7F1CiYN!Ks)P)A>K@;_%g$8JdMre#CXo_ZNjuvQ% zR%nejXp44ej}GVvZRkK3ouCJObcO*8(FI*$gl^~#WAs2zn4lMWqYwI`ANpee2Er5q zgD@CFFciZu9A+2+bBx3&SilmaF$QBX4&z~k37CjUu*PIe!BkAcbl6}9X2KSBu*WPo zz!6Sx#%#D?4(4JWTrnSRaEAvLU?DuQ2#c`6{oH}+sJ_8}WN*pCA^h(kDxBRGmRAQu;L372sN zS8)y3k%t?&iCegheB8lZ+{1l5Kmi`25RdQ}Pw*5)c!uYAftPrN*LZ`sD8@Uy#|L~w z2})6ha(u#Pd_e^&@fF|j9aZ=tk@!lWgc?wW3TmPjR8bphr~`G>g$C+D6ZN5m255*z zXpAOkie_kz7HEl9XpJ^#i*{&_4(JGN=s*{ppa*?)h5-!G1zll;Zs-nU^gvITpci_h z5Bj1X`eOhF!W067Fc?EH6vHqaW*7l;jKnBdz!IY|24gV}<6(sfn21TR#$-&vR7}Hk z*kA@`!WMS0$1FI&5l(Q%Y`94sZBi1-S6O zE3pczu?Bwd$6BnzdITU48?X^U2u27(5r$0&$7Vzz5>bdo47MN^afn9(5|M;tNFjq9 zDM&>cwjv!F$iy~m#}4d77ItAb_FymeAsac^j{`V}LpY2hIErIX;5bg;Bu?Qp&fqN0 z;XE!N7Z-5}mvIGGaShjzha0$wTeyvU+`(Pk!+ktJ0Un|dkMI~z@DxROhUa*Jmw1KO zc!Ren#yh;n2Yf^cN>PS#e8OjZK?N%D72oh3Rrn#1tdu|rHJ}U?)I=?)qBhh}2kNK` z4b+1s>O%_+&=8H#7){U=&Cnbz&=RfC8g0-P?a&?_&=K0ufi5~h5Blf~0~n$Uy21$E z&>hC;fu1lyFZ4zq^hH1P#{dk3DFg;#Fos|#hG96&FaqWniBYhCB}QWm#$p`C!wM5H z5tCqz$(Vwvn1<=F!3@lVE$m>AS#W?OoZyVvaKRkR#XPuTKHT6A4=lh!cw!M2V+p*l z6w9z2-tfT+_=1bSaurr%4gBDbwOEJs2tXhWmLIycfkcu>HMLIH&iEY@99oUI1?80vB!Cve`Hgd2Z2XGLFa2Q8$6vv>z zah$+OoWg0G!C9Qcd0ap)F5(g{;|i|g8m=P`H*gcTa2xr!gS)tg`*?r?JVYTL;W3`z zDT?q6&+!5;@d~f;25(V}cX*Ev_=pmeq73EugwObb3RL1NzTrEn@IxZu@=I1Jp$3$p zf|{rWRn&$W>OdWJp@DkPM15$X0UDwa8lwrCq8XZ_1zMsNTB8lxq8-|!13E$*I?zQY z=s_QyVE{vPL01@|8@j_7J^{M9tlW95|SZ>405C(6=~RtbYvhC+prxwuoGF>h27YLz1W9rn>gFZUL0EXy-t}sG3bcZo|peIbw3%$_?ebEp7F#rQ$3V}fwj3F3` zVHgfGjDR^tViYW3iP0E?u^5N(u)+jP#3Wc_GNxcEreQj4FatAT3p?0j798LRCpcp^ zTrdZ7F%Pbo4>!2O0}HSao>+v%SOPCB#WF01H+--HzF3J>SdBICgFn_{9o8cNf!KhJ z2tqJI5Q;EtLO3=f0+EP9G-9v?v4}%F5|D@_Btr@rg968K0w-|_r*Q^naSrEk0lBz{OSp_HxQc7Ijy&AJ zP29q5GY2l;aaV z;|nTKiLdyE@2J8LiG<58S)+s+P=*R>q83z98)~Qnb<~9h>Om9rp+yj4NQfaJhJ+Xr zVn~P~A%=t)5@JY*At8o@7!qPgh#?_{gcy>)Vl+TQG(uxEK~pqCbF@H9v_fmNL0hy# zdvriYXhR3O=mb6JqcaR(h%V>~BXmP|7^4Sz!UVn08-36h{m>r+Fc78?7=*zXf}t3O z;V{Dpm}4YH!2*^TjWHODaTpIPOu$4;f;A>%3Z`Njro#p^FcY@0gFR-!0giBjGiJjD zb1)b4;EMThgF8I101M%XMOcg_@WN6o!*Y1T2P@!2QUi6}%P23rt|IK(3XiAX{+q>w?56r>^zTak_oWMUh(V+VF33%jrz zd$1S#kc}Md#{nF~AsogL9K|sxa2zLa5~pw)XK)tha2^+si;K8~%eaE8xQ6S6(G1Pe z0xi)Bt24e_@Vi< zm<0zo!U@ip4HwM8T+D+j=EDu{@W28rgeMkZF_yp!OR)^g;SC?GfG<{J6;@*n{NRtZ zScmlpKp-|?BZ3f&5QHKOn-Gr8h(IKw5RDjYK`i1Bj|3zl3CWN`202oYiZpCRIx>)n zZP<<-*oiFc!fx!rUhG3Qaq83z98)~Qnb<~9h>Om9rp@jx$ zh(>6PCTNOgXpRXpau)2yN&<7oDI7eRPHa4ABK$VT5kz4rBB{Pne(= zdZQ2eq96KW00zPo0)sFZLogJ>FdSwW0dtJRC|JM}qcH|!F%IKlg$bC5NwCIbOu!7U=HSD9$YaWZg7VO7GNPfu?UN?1YTH*Wmpbx_+SNm zu@bAW8f)MOf2_qitVaL>u>l(qgkXdq6k*teaBM~dA`yjX#9#|z5r=prAQ4GOh7>Z$ zk%CmDVJp&+flO?}cI?1TWMLO}V-NOXAF`2y{WySwIE2GEf}=PF1&-qcPT~|!;|$K? z9M0nca&Zxta2Z!{71wYbdANa_xP{xu#~s|oJ>16w6yPBW@d%Ic1W!?fXLybmc!^hd zjW>9UV!Xq9e85MPpcG{&$0vNo7gV4UU-1p!QH3A>{>ZPaL|FsMP(e-9f+}i54RxT7 zy3jy9Xrex}&;Sk52#wJMP0x}YnJ z&<)*Tj2`F-6ZArF^g&c5C&rihGH0o!we%}j*%Dz3s_<_#$YVQVLYrb z0TVF^)|iYbn2Kqb4jatCOxVH>_Lv0+IKm0em<<=q!CcIPE9S!u?(o0@EQBW(VKJ7# z3rn#K%i#?ltbi|8Vii_n4gBDbwOEJs2tXhWmLIycfkcu>HMLIH&iEY@99oUI1?80vB!Cve`Hgd2Z2XGLFa2Q8$6vv>z zah$+OoWg0G!C9Qcd0ap)F5(g{;|i|g8m=P`H*gcTa2xr!gS)tg`*?r?JVYTL;W3`z zDT?q6&+!5;@d~f;25(V}cX*Ev_=pmeq73EugwObb3RL1NzTrEn@Z;Zq?yD$K)_^ip zP!qMFirP>^9jK!&G*Azks1GePKtnV_V>CfiG(&T=KufejYqUXIv_pGzKu2gp2fFA4 zJ?Nt|3}A>Z=n5lrLw6XX2YSK;z0ezd&=>vC9|JHDrVto}!5D&}7>406!w8sTBu2pk zmKcpO7>jWj4=YT-L`;G;CSwYwVj8By1~V`dwy=XeX2AiDaDp>t!v%9N7xUnX`EY|f zJg@)@;fY09j3w~GQY^!Ac*6%P;ER=5h1FOCKlo!U)?qyY5Qq)fh#&+b1fdASCWK=% zA`povL?Z@U5Q{j(BLRs>LNcU~L5>upA`M%SjtpdC8@6Kyb|MSAup4`@7yFQn9PGyd z9K<0U#t|IFF(_~xCvXy{a2jWD7Uyst7m$mKxP;5Nf~&ZO>&U|m+{7*1Mn3M~F7Dwz z9-sgZQHV!)j3;=CB0R%$yueGm!fU+2TNL9R-s1y4q6DQVLpeU-Grph#mH3Kp_>L<4 zkVtAupoAJwh6>nNvldiQ8)~Qnb<~9h>Om9rp@jx$h(>6PCTNOgXpR zXpau)2yN&<7oDI7eRPHa4ABK$VT5kz4rBB{Pne(=dZQ2eq96KW00zPo0)sFZLogJ> zFdSwW0dtJRC|JM}qcH|!F%IKlg$bC5NwCIbOu!7 zU=HSD9$YaWZg7VO7GNPfu?UN?1YTH*Wmpbx_+SNmu@bAW8f)MOf2_qitVaL>u>l(q zgkXdq6k*teaBM~dA`yjX#9#|z5r=prAQ4GOh7>Z$k%CmDVJp&+flO?}cI?1TWMLO} zV-NOXAF`2y{WySwIE2GEf}=PF1&-qcPT~|!;|$K?9M0nca&Zxta2Z!{71wYbdANa_ zxP{xu#~s|oJ>16w6yPBW@d%Ic1W!?fXLybmc!^hdjW>9UV!Xq9e85MPpcG{&$0vNo z7gV4UU-1p!QH388Ni7MKPy@x}YnJ&<)*Tj2`F-6ZArF^g&c5C&rihGH0o!we%}j*%Dz3s_<_#$YVQVLYrb0TVF^)|iYbn2Kqb4jatCOxVH> z_Lv0+IKm0em<<=q!CcIPE9S!u?(o0@EQBW(VKJ7#3rn#K%i#?ltbi|8Vii_n4gBDb zwOEJs2tXhWmLIycfkcu>HMLIH& ziEY@99oUI1?80vB!Cve`Hgd2Z2XGLFa2Q8$6vv>zah$+OoWg0G!C9Qcd0ap)F5(g{ z;|i|g8m=P`H*gcTa2xr!gS)tg`*?r?JVYTL;W3`zDT?q6&+!5;@d~f;25(V}cX*Ev z_=pmeq73EugwObb3RL1NzTrEn@IxX|l|TtKpbQn%L@lsWwKmjH2kNK`4b+1s>O%_+ z&=8H#7){U=&Cnbz&=RfC8g0-P?a&?_&=K0ufi5~h5Blf~0~n$Uy21$E&>hC;fu1ly zFZ4zq^hH1P#{dk3DFg;#Fos|#hG96&FaqWniBYhCB}QWm#$p`C!wM5H5tCqz$(Vwv zn1<=F!3@lVE$m>AS#W?OoZyVvaKRkR#XPuTKHT6A4=lh!cw!M2V+p*l6w9z2-tfT+ z_+lkiVKvsk5B^w-by$x81Y!d=A_&0cP z#W|eE1?1u)F5xn+;3}@+I`VJ>H*pKMk&ipLi+i|_2PnWp6ygyc;|ZRk2+!~wFYpqt z@EULM7R7jn_xOO1C_yR8P>xUdj4!A_CBEVtzM~31B$C<^D4_k)uJY`{hYAs8VDMHn_A9Gek=NJJqTG1!7w z#33FDNJJ8nA%zTbq#zY(*ot&yAQRiL9XqfSS=fc$*n_>;hiv3vKMvp^4&gA4;3$qk zf#W!VlQ@ObID@k|hx53ATwKH@T*eh##Wh?<9&X?!Zs9iaaR+yC5BKo^1$c-;Ji=o< z!BZ6B8J^<>Ug8yA;|<=T81L{NAMg<+C`B2{@d=;t1r?~oSA4^FRN;q2q9%b7YCst( zsEJxoMQzYXtq#;t7aFJsP1J`L8lWK>p)s1EDVm`va@jE5B_U?L{L8j~>vQ!x$GVS^c%30v5~9<$&8M>xS5v*Cg{n2ULE#eBHI z9UfSKh4928EXEReVJVhjIlSS674XGMtio!nfgk*_7VEGc0SLqfY(x-(5rR;JVH3i! z84-v?6rvG>Er>-N;*o$vBq146$RI}wQjvzONJj=Tu?^d?13Qt0UD%C1*o%G0Mh^Dl z01o014&w-p;usV-juSYEQ#g$?IE!;Qj|<4fMO?yVT)|ab!*%5025#aOZX+Lea2NM* z9}iG~hbY7&JjN3|MG>CiIbPr;Ug0&~;4O;r4)5^+A5nr*l%X7-@EKoFfl7SEH+)AG zen=#BBv3*PC_@D`Q46Z54K>iPjymc>1NESZ`p`lHG(;mbMiVqeGc-pFv_vbkMjNz6 zJG4g!bc8l^po>n>gFZUL0EXy-t}sG3bcZo|peIbw3%$_?ebEp7F#rQ$3V}fwj3F3` zVHgfGjDR^tViYW3iP0E?u^5N(u)+jP#3Wc_GNxcEreQj4FatAT3p?0j798LRCpcp^ zTrdZ7F%Pbo4>!2O0}HSao>+v%SOPCB#WF01H+--HzF3J>SdBICgFn_{9o8cNf!KhJ z2tqJI5Q;EtLO3=f0+EP9G-9v?v4}%F5|D@_Btr@rg968K0w-|_r*Q^naSrEk0lBz{OSp_HxQc7Ijy&AJ zP29q5GY2l;aaV z;|nTKiLdyE@2J8Li9}rjCDed2R8SMOpo-d1Lmkjqy)HCR51ObCEi^zwG(uxEK~pqC zbF@H9v_fmNL0hy#dvriYXhR3O=mb6JqcaR(h%V>~BXmP|7^4Sz!UVn08-36h{m>r+ zFc78?7=*zXf}t3O;V{Dpm}4YH!2*^TjWHODaTpIPOu$4;f;A>%3Z`Njro#p^FcY@0 zgFR-!0giBjGiJjDb1)b4;EMThgF8I101M%XMOcg_@WN6o!*Y1T2P@!2QUi6}%P23rt|IK(3XiAX{+q>w?56r>^zTak_o zWMUh(V+VF33%jrzd$1S#kc}Md#{nF~AsogL9K|sxa2zLa5~pw)XK)tha2^+si;K8~ z%eaE8xQ6SPn!58c>D`YN8fYQ5$Ng19i}$t_JEs6ZN5m z255*zXpAOkie_kz7HEl9XpJ^#i*{&_4(JGN=s*{ppa*?)h5-!G1zll;Zs-nU^gvIT zpci_h5Bj1X`eOhF!W067Fc?EH6vHqaW*7l;jKnBdz!IY|24gV}<6(sfn21TR#$-&v zR7}Hk*kA@`!WMS0$1FI&5l(Q%Y`94sZBi z1$?m*tFRht;0J%K#X77<00OZA8xe$Hgdh}Q*o1IwMg$@eg=oZJ3t|z6cqAYZNl1ni zGRTpFRHR`m(vg8oY{Pc!z)oag7j|P0_F^Bhk%Rp>fP*-M!#IMYI0gld;{;CP6i(v| z&f*--;{tMV5tncoS8x^Aa2MwXo99_hURF2mS~06XoI$BhxX`zj?jh6{oH}+sJ_8}WN*pCA^h(kDxBRGm< zP~bRD;3Q7rG|u2G&fz>RAQu;L372sNS8)y3k%t?&iCegheB8lZ+{1l5Kmi`25RdQ} zPw*5)c!uYAftPrN*LZ`sD8@Uy#|L~w2})6ha(u#Pd_e^&@fF|j9aZ=tk<^nw2{oV$ z71Ts6sG>I1PzUO$3k}e*o+j!;3k}c^jnEiP&=k$k94*iit66EG2zV2#O`f~lB>>9D~J%!DoMV2@dFfFqpXjM;F(9L&W$xMDus z;0_Ngz(ROp5f)12!TE!3aSp!mtV9 z*o+87A_~!n!4||K4)I7pB9f2{DP)i%1*u5GR-_{Xnb?Ny*nyqM!Y=H_9_+4s6ZvY;v2rB z3O^(gO$q;${xZvTUYG8F)qef&U+rn8wDQLfV*IOr4NB!D4!;O7iw0f1>|I^|E(r~c zyUcNOc6ImqKR2O4k1pyfFOdi$-AYenyF zR^z!y>0&!=dwL6z8WWj0!Agy~a`dv$WFfDAyl4BWA|W%jPOEK`E2QB`HNzq*h1B@Q zmqhqZ+C$_B-b%-ce?;MwSpJtKsCLjR>zBf5!{g@$`n4{M6lCpun_>~p9` zUJcd0E94WE65LAr2-(6-&r9+pWfMbhfrn)6Su z6bVwT)|ECpM7-yM8wYJFMZEg+aUISSig@?BW43)ACK96aA7>jq7D=9qr?qLUB$CS< z91@yN5;8YGwY2;pLaJKoKE7s%NbKA}<@~F15u4>&6!Y9$L_bN8`?mBKQR+I%i6w1B zq+@T(`inzERE^EK&o3Vn(bv~c9}#j)#70^6agwwWiE0hzXr$c`$)%6ACb&-%Nn6jK z2%la{#Gcx}((_nd5!E!YS(Ec;M0mr;yW>k0A|x`Z;JT~52->*edC~KcB4qjO(!001 zh)orldNX{(L}babD@!isi`dAfZq3|Yh@=IRroXK1FB0xvnb{=pyojl*WHM;PEfL;% zZ38up{vvR5r(?^TP86&6RGj#9_Lf-Tp6Bz_?4(#7WZX8eex3*%W!cD1^PAZ8WyP|L zE89f$)nRAU${&h^hyvXx%~>M;==tt>aZN-ofPj7hn0dmp^KRrnaOdP7vN*x(N$WJ%?U+4mzwl%z%Rr6^w!@7itb zlfJJ+ywgjgcJTv5WVVCLpz#kxaO3jL7dD+0zM`bZs0epq-)yb6b=El3t@kP>G}}@p z?7Hl4eq(rwSmE-;JlE4v1g+a~!p5|Yh_oNk<#ju25nuam?`c)JBL4P}gzN2#MU=y7 zwT+wCi%^3Y?MmIxVoe9HPUYs0gvSJz-qT-A7WNG+4js^n7w#Fm=XC$_U98?wGHg$w zj|d4Jv-h0lV-cmA@$5^A5njJby{xF~BKqOJ_kr_U ziiCs(Awok%B)xs-s(ATB#MLzqQ1)EPxHT7EN;ogVZSTA8*=Hm|^)@e?op4J8Yem#3 z^EoU+-hRHZ|f=a2KtO@TX%qnvQL<3=fe5hlcQ<-w2p`}Grzn%Bvi!Ie%Q8s z_+$}#eDCJt+jB%>r?4KD{USy3_dU;t2iy{}UDk_T?>r!Wl3lzBi$2stKOb2GAmjXS*@=rGEJSw zlo`Dj8L6k1wbD-#8HRbQ<-?YU^jo?oZ^Z_P^rY+kW;m;h^x)DtFA`c(A3fmCnz|zW zMv3N!&oYtG`IKbTgmRG~TiHWv)?AU<_rbEgm9ze4JpYsb_m1=L+iz3aeAVlF7xHbJ z{Bg{}nkuhdqqc}Aq)oM?V4 zc`nC0sn3iy4>|ty*usvDI3M38-1O7=uki=|SGn@1;|c$%9{FGOxSzHM{8ay+g+xwf|4^Rk#0D++Xdlj`OGGuj2k{|DWcoZvU&ezuI3N=TFOD#r@U(Kh0O&{#S8- zwZA&fpO(Lh`>Xwbnya_v`Kd!jyV7J<*Y*DhP4B7!=->)6e_rwD!R@n~gZe-XZU%tHIrr6Tg3$C&)t14L>^hp2AD z14K%h95xTMJo;;pv70C-e8^^RK%Xj2E&{E8WQporUb# zm6Q8#UK4UphvHVoBl-Kg&$5g9lSHci$a3GP2aH$qLY?rx##^>xZ=5mX-BtSi@oUEG zp}lqg2N77D*UzA>jtJDd^7>vw4-xn(KT4zHZV_a(Ei|LU4iWlE=T!I9mLfbZszy$J zh={DHxPRcalZYMfaV`5~l8CIdNnUk9js0u-*=)EVLd)C4e`=5|g1QuIxsG)bfzQ8g zX#VVq2-Mb9di6^V_F9*V#xo6MW$&lZ7gvfCIh zSRw)oF*EuX_Fr$kscs~hRPqs6*c zgB+LdjS;?q?OcBx%NCx)&QBV#)LXb5>2mmXNtkeKQ*X(GC2_(f-|MuApOx^m8+~21 zeY)`7GrMr-oGoI#%8#BpkK2f_A@jF?nC&Lkz3jC({-_X(ht53b7k6EBev{R`yKTH; ze*23(y68G9mg?^e3s5vyc+b%v*XZdF#nLu1f7R&)3fFQkiLz8*7^w$&%(rMJ7P~vm z>|cD0__sTK+cZ)5u2n5G>f|jt?=bG$vh@JP(q%Crms-?TtgXoZHYmbT5!9}<`PLB| z6e0bNJsCFtu_CBdxW>?q0~BjNw%*fj!V|?(+q~>b6BE(3WU9{{_v^xUx4X7dpN+!P zw1Y{)1x>~L&NgFncMVpot^C-0OXO}v*deRL>2aGC5e`?rAJ6hvM5e}$9=Y|oB4U~;)8D(H^STF&zd>*Vqb%wRKR8(IV1HNb8hz)`zNK!C`eDWVhCb!_ zy%L4zSd(boLn^{|v#aa58Ro*!aOT`3)8>k$9^(B~6=lWRPo+n<&2r*?FzK&W6`%+i zFv_#4LnG?GmbDgG6VJo4=klAhKUJ1#7$*!JlPw>YY!$v+j`q~Z4iW1<_8Ry=#a%46 z(zPo$eIX339gWk1E-L0XnzA`*d6i%6qmJSN<`6pjRbaD& z`hA4q@G&2=^LL8H6L(G@?kExK%ExLq`ubLcnS^Mq?ly_|yRVmD$`HPhr{$w$xx&-p zc0g4PAK`MerOmzpX2MacN0IqhJ)S?u!pM(m><=z=avmXkqnjOSKc|jZR~GH8I;L2J z^?9h%p-G@foBZSK(H=Gb76cRD}~Hse_5I--=77Ketp|4L&%;KxmY_p@;(o0zGG?>?{|lB_wNMpzBhX@P5+fh zn>K&3^WmQ4ss6m~Z)(^3%wOY?Pc;AQ@6Z1pzqD+7(O=tTEmRHvbGyvIsq|mlO?;dE z=XQDYwT0CEO`RP|MXK&KSrqqqN{@O+PIgEY@&%zCi}NgntZ3epzFY@c$f6h4mNS`O zA|#dWuGAe959lvt|KM(g)(dE_UvP7FbCF_fTy#7nf%7r!_TxLV{}q4omz=-y%O`C8 z@t^snyDI}VoAt8KU+twgvj5uu-^V9kFzYsTe^al!X3Sp}vz~?t=CgjC z9U6r(zs(wM+<6M~U4h-oh|bJ^Yn8S59#po_YD0NITgLl#MfS1%j5qt?@b-U=_wXmX zSgu!(<}JGT4CMIt>-AdmnE2J_`S;8Jo6i&fTfRSyTiyOYKd=06@&B$}b(}vf|1RF| zZvWGK)$M;b{@=B$j`OGG-^Kgg?SGoDy8Z9Q|GRe8asIUYyLi95{ZI2%xBuPvf7h-$ z&YzZl7w>ns|7pJJ_P-nd@7h(z`P1_6;{ERSKh0O&{&(a5s$F%w-z|R?@BeoH?~dc= zcKo9E|t|1@89zn|m% zZoRtyKP`VZ&(H1tX};=yKgavsdUgMQTK;aHpWFS@eAWGaj`zFu>i++<{M|f1xBI90 zs{8#M?|19f{r_qCyLovQpdd+6N*fN)Z5!tLCJJ>Yo>?_ujg+KSWHH`ITkr}G3rm)^DW6Eo- zldL~`k(@p1%wOxhEVgbZ-k`w;MtnKSdbQ(I52W`cPmQVOFTBZ9tD?cpZ1OaC_S7Vn zJcmc<#NQ^5?b^T&apXz7Fv#yMd6xRTuQDZ%_mZ%2J;)Qf{b)s3@?5#_a_TA}*Z&d~ zQtv8x3_QP`d_taWulHz_h}6dqYQA2fAyO6;c-1**FXUFwKdic(MV?@{GwM3z={9-S zI!E%j<;#6PlgE7O^)x{ycezxr7(@?5rWa{e57YCM!*Q6|s2 z?VHmlkZ036xswlhg3h-N+e4mBzDiMx$kTJY<+5TSy?j$PY4Bb0Xr;!F?<1r`U!Svg za}d%Q?_PXrF`PU#-&t8p$urXL>+;*=SvG6evYo7x+gq9LdV)NrW|i_aBK1*K=ND;R zMT$qU(bfrSLO%ZG(oze)SMu<$ld-WTdD`|f?Qly-U8Y)^P5&!T_pCM%ugTMUTvEIK zLb~5ddE#b6AsZLx9+^}wGcM|mXksB`?m8FRd8rBM#hkP5oDZq<>mQ?iCkyG|6VEMs^cB+Sx&HbN%Y`)i z?V6`;o(b95!2#Y4CJK3{^@n;bV_o6E2QGCAby;^AZkG5uSELrmYbvWNiIn+uU;k(< zgnab7DF&_D3z_RY_q>s|LVEtqn=M(~caE*I|`6rQ@V*A;-%wMG5?R)27P92frQa@U77NBa)39obN%9^JZ8`%4p%Vo~o-%A~&BFLueNZ7v9z z*StmcWut`sa zTxn6kmx;=2!Pef=h+n*Cn+Do+&2uluSRBy|;1m5YT(%q|P5-Adyjnk|L&`*}U5O)rG( zZo4D*+c^k%*&wB@k#j_Y$YK=&)B?2GLO%q89>)v*koJCTla#5DbF_AoDyWW|lCxo*) zOQ#r-FxqqG*_Llb{CC^iIT!1TgaL)aZ;o*li5fcoBg7YxmlG@E!?#ZV(a%T3+P9RsJO~#t7t5bc za$6^&Z_TS6)%1agUKuy$y82lWox7;ch$-eGCMQIG>b#+d9ikERR;R0opJx$TJpGeM z>b|SBT4@6zb(p&4qQMcK*Y$=P7i;jI=+jgC!$#iglEIH%Ie%8G&%My*y>l@8T1D3>(S8r^oLj2s^`Vl;z!;91kif<6V zR&?hv2E&}y&W@V(Inz~O|KbWpZJNX6O#86 ze@8$sBXi=L#Xmm7@8D@FJ7P?x5rRQ0tjC_a%(Chj^T5@XVHTV9i9dYFs-*G6pQ6@A`w;U<`EyO$SS%J*9E-ahHq@wZ(Z+6n2L<0t*N zpQKlusuGkEnU5mt)y|tB{*dA;D+U+SC+i5mslMv zSi$@I-V(zX%o{nMufNyMXC7(xZ1y8N<`u(4&+j~!E>?{ClXMsMm%8 zf_ZlQj8?ZBxHC^R>|W8D`$yKzxtaO{kt5nFxNWKY{wCxj2bZ^+c7*xDd*J?VMj|z`op+9< zt4J{@J~ib`oRBxp?;jAy?@$9*9WkHnC8Y9wI*Y2fo+AsU2DR)Yq(*tljZbs`PpoP* z%DWZU|73oAh?S7d7}s^4sV?uI?H(!Dbw!G8qt^usGDNCh+qV|GzloG)Zw*2nFY`Wj zd2?Dz#{0Q+g`#6^Aq}26xdrbPsqsE#i>y!~ZRS+ZO`G@K!0b<&Yxuk(*EBtQeF4XN z@65@$ z8_c{=*x}gM)graE!J)&)p9^`$_ybS6bKeAhUQjqyCZyZy2j?c63u)bP&iT_5Me_eg z(Ur$j)kRT6Bo$>IB9t-7Tx2UlGE_<>A@fwGBJ-4a9x{7)=J%dNk`SIGDJ2O>2uVay zlreq#`)mEK;oN)AJ$vo7&pCUad#~k3uT2B-4zFupODzx^n9?(O@OubNy?Zc)_SX5; zqHX(CD5_D@qdV>Z#Y49(TvLjmB;`Tty+|(1uV~7l5Aj7Flv-}U{j!C0y1Qui+XK;} z%q1^>9~7)dmG3eahJq&!j`>crKxEo>yGC^dh#u)4v_H6@aPJsh#3euEW!;!49vA!$ z18H6LM7B3vTlV2JuiJ zX&uIz@?muc>J9c&X#Ukare=979l zvOrn>+{*SD?JG?s=*R)Q{zJHWmoErPlcs52#gqeOarGX%_Z29O(pN~RwE@bH6RkhF zQRjO-iaS#`43x>eYQqk(=-=tu6AxGd<=w`iqYd|wq`*|ly1kb zTw9>nj65~iG6}^#>LsL8yMg>B{&h7&E%MF@j`Bnu+(+!{sTN|6c0Nu_+EIb|Fa_EH zf=-yPWB-wxgyS{C@m2olIn37)NoJy=-(j!F_~X)!`8x9YkFDQeK8^fJh%D+J`Rr!Z zVRal&(aKC4+NiILWZK<(vE43PzxqyWH|oB682Sh0(`qA+SFznQZf;N3vE6M??Anm8 z*i%Z56yg08cp~WEqdlha-eu}XT`eDaM7?1e+jZ|W@kzvXRYgByUQdZ)(P$tc0^2ov z^nD5KT6v#E^@-Ei?mor+zBJg*Q2nt*HEh@VvP=yp?$7@gD@0F(!aH+G!)D3Yu5qlD zKk^!z&hDP~9@y^g)fj%%?TW@ctResBEp3ze;n|IOLNCRb=ro}){kcg=_YZ70_>`v| z<}a~tbrv%Y$99vHnr@-LzLWZ0(?^@I0PjM^}1}M zk*GgyejXzr&nXEIEu)dw(m67E($T-jzr2=UgK@^5vx!=&=r84l60g77j`>XEgcs#p z*sjqBzZ7X~_jLCghaqfN(n({#Jg#d8@0W8xd*k5o<;y@mROsljB4pt6)LQA()L}a| zj5&rsp^)wC;q8M)s8?^^c@dlqg(;yr2RVO1k?e+JtnVKv-nF&tanma(kzCXl-LS>| z4Rj1!>YSl?ccg4>ix%FW3j(XMpfLIO;+X3#CZdWPS1F#3wz!0%+kzwiy? z!LhTZJX8@6NqmaO>=Av5#~4GedZ&jF#1H%y&h7q8FMP@UH> zf96Z;5?d-1Xw+$ceqIE`T#Gj<3C>VBoLO)&eH^ipsr^c{b_TwVi&DS=il5-l+gtX|)R>_c|d*jDOa>jm^Nd+e{==yKGg1Tu^#e^Yk%0c5{!2@O&bl!*zRai+;uN(H=9F9^BA^! zu;uCp?4MN6p6$av*e>a^U^>RPd&Fv6Bc5Wr$?<7f_`Yd9%(XtN*sf#mXgV9Vd+Bt_ z!Zfx!E!{u(7u&7#Rc-3Wc3o{Hb^qrlTF$f#acozo**F>fvz)Kv1wq8!D_*ZQ(H`Wj zQb~h2j?)T1XS6k8yK37OAKk-trCk^d*05b_s|xPtERlA!54?>0z{+QTE8qbX9j2VT zf%>j6<-7C~mao|EUh%!;0Bo0#_vo<(w!2khpyM63t1DIb%nFJWC)fInen2tj2R2I& zFKpLCN?jS_6{*)t@^4NfA9){nS%l+Qb~E987V>wB>OT-OME-Ir8M|qRd^Yvtpd9)m zIiuXI!&S(48P!eC=CECrwlQxFY*#_*9s2PS#r}Fv!cpY4jKN8r<50Zwko3O>oOd}y zKI8HZ=MR!T&b<~4fkIijU&?Rr`B($LvY;O?l>Jt6$T$uANr@p`fDiq}M7*u9A{4WK zGu+Lz6G{~Fu5GhuL0)4X>KHGE;_XF>PiOBTpZ%LQ7T<;Xa<93dO(_%})CiGZT7tqI z4cT$_cpn+bopg03CXE`Ak`Nwh_;~(^!;={M;q6?rfmOJv*v?UZt zeIRcNn<39iznLuOL;ofgJh8D1B|ObnV&ZT<uNHZY zJuhPLCGwn^OVlw66fqeI)P6{WLWe`v*8*rz2Yd7n4!QwxD&pRfhBoq~Ufa2#K8&YM z8#cF~&StUZJlq|MJo}{c*%vt|VV!keWjl<#MtDalYJ{TJ^}2@_g`jXW^!(lD$ZM(# zoeh@rKpYZMnaN{B-TRMQkV^o0(lF5KBKDIyXF-c6I}}c|Z+%ldg*+>Cy^$N+o8@sg z?sy8tS;NONwoE|L&D&D?TRNaHesZ&e-VC2_NydqB2N1&#Ys8rC2cqo`PD=4^pKiD)^6eNZ*#3Yz`R{CzD*}N zA0U_v9A?lu4F%%*UQ!MkP$3u;aMiFL@g~ng92cU+#r)PXM8!qM`;t(xcZx=y?L4AZ zws*h|sNny#+A^;Q6}*RYQ@37)3U+Pg50$o1vF-NBPb+&+M^9gB{-KU~_i5?PkLQ6B zURrMEI|by~-SOY}YJk+B;32bf0rMtpLhqC15KZik_S+z8?K8Xd8j=5@JssxP{p-Ga z2o4|~){J2N0+hd>(^*)WfwC^JdC$TLD8FfMEM52ulvySj?qf4R85*BTG}#W6I-0Ml zM={^cNjX7QeFu==opkfIutxn{YSxvh1QoRLDt<&~#L)fK795Dz7nRtv5Vc8#vTAt$ z<*~8_d&DcJ>=|C+{aNdYk4=HHVP)~8^aI8L&Rwi74}dav<6!lzDWD7=l@sZD36w{= z1Ml*l1I776okx8Wko(VXOXW@lQbpV+#F8y|tZLyzu{YY3E6S@@M_IWa%6aK7d{2{ElIRO=ZQccwr%dAL2*DbU$|el{u|0xISpu#&&USXT}*KtkPR#%K5sZ8 zYKx~l5JKG3t=s7bWc?a0-m8&7)|;oc3FZL#lzmvEl@^e7lo_ty{t9G>%I#070P^9s zxuvmwAoEnxwrqV1q`9Z#3V+0al$eq&7HkgXz4wjXuEj#xl?l7@6PlQR*mhED=%A+4}Gr4~rvx!MwrVt(nD1-*$I z{Xlx3&l+|26OgFB&!s0#fs}eh?)M}ekPd}MgsI9y`Ss7y93~P_I>YFD^Na%KdzM)2 z_<{FpO0U!Nwm|e-jd;?EsPjwY;w~UP{xrAiUkc(LTD>cEXa_!v!3^=37kd2t-7}b{ zTNV9bZ0|N86-88kW5D~w@v4nAiY&9PL%9qmn?wXN&MQTq;a@kw zaebU{`69kANp9SkDvroao7B_*r1H-X?;_uj$^*nA_vits?B2oSn59lCW&JLxgZ)_8 zMiaIA07$u)MqKt=@k?dSEFR z!&?ueYSA+!_XC(`n)1<;i2Y2s_)cm>9!L=%vr{>VKsuND^Yk%eDF5N|a5$g|$|Yjc zINqFr(t@bYlfucEKifNL|Jwzzz0gf$0Fgo{amMHV>b>rX^HQX*dmb~D_5o?iz&Os% z14xq%?@f%yfi&(Gc8r-HNJDY7Jj?hzUGv4 zLb>gBvzKnlQ2JTk-Stfm=F9Fse@H19kt_4CKmw4DZbpAszmNF3b1SPUq6<9ebO7>^ z%H!Ny+kmVhdZKbg6vzsL@?E~tK$a0T^%y~W6MAg-Oy>=dncl8)d2R*Lh`+de1P73U z??cx#j^}5SXK5;aLfQEc*A0bJn6I1H;P__+G5P*&!&XF}IZ?W;hNx_*c1IXVhFL(%yx@CVv>rXj0)nB zH}@iYfpQ{gfU6RJeq7Pt8hS7fJMiS5$_}8YtXwSY;{l4ylkuNzT0r3w=FBJE1M))n z$w>K|K+ZRgxlpeFq}8=8YXK8bUi0Yp>ICwk=GlqZpR9;l_eZ!(5M{imm4=90@Vhv z&-;6(Ze#;F?;3gEoDz^$%9*bnw}$fS(wMZ9$ahug>y;E1#OOJOLȹ^BM8{C-s@ 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

p;<=lu&{ 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 z

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 lI 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%0AJ1s8J%g(56_+NNE+`dJ zNRN7K1ZC`PSz!$ap)yoIJbuG6lFkkYOO+} zdVTE8ccW0Pnd|)=>%%vV?&K;x)B)AJ|8@HuZ-R!)Vl;drve2X(9x>vU4E4j}8@6oP z3so16ajp2MLfyQWREg~pG@aP>RpM|j)DPM37>uKWs_NzXbfZBad~T!8tVU2dPba#_ zP7QU{f~1D$g8~ zxiYH=)u)HvolO>kS~*Y6+1wr|wP&5#&a4jAtRovQjtW7g%ILe*KqaVUNKtsS-2}>7 z@71TU?S~4b#_K|wv{3!^eOuH`eJEYlmD(|=29*=VRwo67pki)h^iB;=u^XZB*MzRS4K*~MIrnSw`U7ZGzL>hG z!v@tQe{FgeuR%j_(|On8ozP4z=>ObD9U2B&oczOP5I4@7uy}PslR{r!Hb*T~y*-Uz#c zuEa#BsbdrU*=h%M{^vf0qd%dX#)(yU7Q?pGq?}DnO<`casvrxBm&wXy|G*s}$ zQ8(|t4^=x}hR;N^L*0h$!QO?IP=1%*P%7~}RC}$`EU<5bsxqCL9Xk@BrN2~TbIlKE zQaT*d=0SnlsIT4q@^_#`X1U^QR4vqQG}-=4SQ?r(QKqv?a6kQ=&G!5@4@4sIb&&cl zsL2+Ly=#yJjg<~{4VpWk+2OIkZLR;H(frLC4bxAkx%|5NNG=mJRh`r7(jI_nH#b?q z7sk-oH}?L^?KY^pv#iETlL%E*KSagUgQ1cC`H`nDtf0wd-1N?8HmIMU*|o(NpTDH3 z_5NSoQ2SwNf!1?3)O#DTPvxA3ilZt^`U@6N&vgD=YZMFAoNcH(MUj98KY6XmG8(Ad zn`1znO`$pk+(SeIp#G`cxO-?HRAli}l+IZ~%^TgUxWPrJk<96T^1vOQh^FQD(Hw>* z6X91z3_GBX*(xMbZVFm#_2kdzTS2YC_`Xf`jnJemRUXkg4J~>R{53(6K;j{=H?4mHxfY}Sy?_U5jpZI|yCgzmKcmd3iy~A}?@*XVdur8Nmzoo=28Ta?a&M0hJkpoCQ!DBT(fhAFS1^@?_}j*N1^>Q; zG#)nTVc7sk+{O3mg=+ysJn3{kwYLqD7_0=?FMo#Ud;I14J^LVKTaEauABETtX3N^Z zXRK$;9j$op*D$2rt3Nk+?joeOeiq$j$cOUiblNZ%_8&+Y%Qa8L`ob=n@8Yd!ATw*p zCQaBFQifz1MHl`+mcAEDPBE4@ixSl{Er{<*I28c^V^%w0K+bwgCl73o-&py0xxH%=}Fkb7D08`rOL z{G6XVlLt_)6x$>d7q0`wy$S-s0=ZB|b9#_#!3GK`4OHyvtWdBpc+>q&1e7=x7dZUB z0Qu^dZ(W-C0hCYlb=`jsLos`rNI>l;DAIkVA2E3v%9K=-n0aZS)M@a+HJxiv@uEuh za@Gt`z8$!7OKTqAe~wQgZ4#i|DlGDpMhFylJsQ4ei|;}G!$p@4L_+DVR2jCI4^VQT zh>p6#7%HiBmm9QqK{@3V=Upl~s8)Ggp_3^CrPYC<#nz2b7R~zXR^9=qVm0Jn9q0EZmHAh(xR4IVfcE&KMy!_F2w^Fp5jbS=M|5xnlaM4Mha)X94U6$#EldC8qt`F+fY zbLWpLI<-R8!l{emEqVApm{1yv@Wb~*O?7#dJ-&|`dMu?ANxdTSwB<<=g9y*NYOTB+On3oUx zEI+bye<>42;#Xf?Gb)xKsmcFQyB0H%IJ+kb%-@cYsPLw~N&ojGET4Y|Q}99ZxMAa2 z@0v&0KU%$JQ^_1jR8NX*P`4pbk550hG&Uv?+~vLXIfx_k2CV!g`$)2uexEPP1rh_J z+cIOZ?p!N}brjmX~W}uaCavO`|Ryoy{DfXTyWNA2 z1GGqlP9fu9;dT=A=iU}x^9l0M?_d0@}`J-2eY={rp8D*3L_7aL_*Hd}G)z^&uhr%fcyuDW>1m*H*s}Fq7zm>qFn&GDf zTo=IUyrh1%=o1KjHyyziauR%RQZYoZc3{4zGye*m6$Hdaq1)*vggduTPf26H<4@^9 zJK66-LJpN?fxQi+m8fy)C}6$xF&D=IlrJNTx=L!An;~gMR^ljc0>pIh;orj%0x8{g z*?*oFKzx5iwVmb!JYL+vQ{(Im=^G5+uW8IcMhc_RmDlo+`>|b6`nVosbQ<3DXSRh@ z1-e!)zZ%H8*r1kGUjeBjFWEi^%tN+L)5Z@axQ;d9%@TM)rXGKi*&Y_iJ7FO$uw({# zD+{itlPEyBIDB~YLpJ1z)abZ;SAy)$-&W`4(ci55_Nj0Yfoun6122y&P-wF4<-B15 zE`53^y{ma6#FMbF~=kKOS~0O=FUic=pY43D{7>L zTO^>8OZB{wK`)eC80RNS?NH+3G}sxh0p;xi$AvayT!7)>Yn&5&P*z60tIHVs$^|~t zj2BeG^|J>`j`893C##M}pk7JQRubDQg!oZlD^EfB{%umhixexoZbNmpy$DnttGva~ z+6<*!#Pr#hM8uJe^D0_| zDX9IiMNU9q4dvjjt3t!KQ2w1-ct6XG@^R6Jt7nQ({ta@S>extfIK=+`JJ3UNxZD%J zmERy~m)KmkRAD`)@{2uV5gH`t`t4hjRNW-)w^klq8T!vAnYHxF6-h$b6~;AFeUd46 zDww*Gg=G32)uH}oPBJ&j*SO)$P2qaiywUb9Nv_&|l4(yCN%Q}D=~$LD$%YS$G!$2o zsyvZ>Y8yYvJo8{N|Fa3n+ME+Sm4P_6Uwr(gzcxvC$i89>*GR@ezy9SrcSz#+D{1a` zcS+iP&fw*#4J74b*VY)_Hze^~oO?{aAW8c#_ZAcL5fbmQ7&JapOQIz!zDgXZB9DTf zteuOGCnSQ=g@aNpwmmohX$vi5O}rJGQ%z#I-xRh=?_iN1wG-D&jCc z@HRtcX2^LGn0zYSjhBDzV9)Pk zXxZIKoa%4Kz3}>_IGJR4e&a13!qY6_Qr6Q1P8!Voip7V?Ce2XBf#>ev(2}RE%g6(6 z)}I=S+crT^vG?+cf(*3l3w*mcj`<7IrxhQ&Uj*myYxCbvG(*U1cCThmS@2u1h<5nq z2a*5AO+I8_gTOu$iy!BuA>y&D%K4ks5aa!~JCD8?5*s-f{ll@JflS~Iv($D-&fKy0 z+Wu1z6)@L4a4-!X58QFuYi12`C-zsmU)F+DH~*#3mzN>opJOI%IuoQEII!@d65~8> zhI3Nb^C5G8--x^TXCBV^W}yX<{G3{u-aOa6LU3R&aLqYZvckk)1;cjehI zwH)zbow&7e`#tKXbEoGXu&~RyVC>AE7+8#wF5UgnIkrqjac7dCKK@7b`Q` zH=M=nEDfOQInS-JR!y`oHSs(db#w9Oz(1JBAd!*>kkl z)a+2^G2uhI%%Xymej3^(3U>KO#GpMQkgAHR6zvsl0l$J#50-l>8hPm^DRgUy6xlpT ziY#`hNf)}2Y|-bZmLoBLtEjp>sRQFFhKBqkKZ=r^fAN9bp1mZe-N{6Su8^cFs2uif zpC@^p_d2%m_mg}m*pjNIL-MmC=!ch7NT#%JOXFVjpZ>Lt58E+^IJR8!D(M|5dT1kH z*pN@Mvg$uB4WU2sZoDL+{X+_tUCZesi!o0un0=4TagsMDb@;V=1j+O6zf3cQ`54QZ z?MdIANv_AXl$FF3l5LRSk~FkP(yP6^Z4T}wx%`LoWKtYSdXL#V+2CI!?XGNZ7Uc*@ z(%@mU$jcyEH>qXB{7gw^#?9@s_pM3FmmEREEjvkyUvYT9Qa(vP#ui;F*+m|6yx=G? zuO?|lc`5pL&XI&CBBD7@uFnB5{5PKX-xB@q&|yPdHZ4WUa4V4@X2HkQR_}@9tG(Rc zIJEHkmOXlkb!02k6#f!5SJ|h8N zvkfPw?_&QyL+#tbKYl`J*oJEiN`E2X((=Os9#4oOCf$#F&p^;blU{OZ3Phgh`a40} zh<%0fE5$D8LXxC!97}RMq&r-(Sm^DBlq;cIBQyUKPnhgvA z`?f&pRM)GwY;Pg4)m2X1nFiO#>=!5<#_QGQJdS7}o^_p96h-+e!C5>xi3jniF1}F> z>)=kcg-+Bhpr4~M_R_(BkS_LCysEMjaY^^cbbvNwvOn@Q(uhI)Gj7vo!LB*>wwokV zvG485;HudvF_f>;k6o4HM|n%^6qjct;-L2K-s(iev#IKVuWE>AHh1T47^0jdYUveJ zhIj_A4+eUnJlEa1X{Q~^ceVFD=&-JSuiy`BzDuaz?GHBf!nj1;cU=NX=*PPL_vc($ z6Ut`^U%J5&0>;OAmbd9_`29zI<_+ zK>KNt_<+YFw5Rs|+F4wVdL>Pzj;b%}hY#6r9P&f`uw{&*C53j>L4O^ZeAExKLw&{C zF@AJQiB(1z+MnCinr*RfT;#*mm_wpy?+%fP{tt2MY4v#9HT18L2HPjY8_@oGXUw0M z2Y=Vog?oNKpgd()U{S*i+FxBac^Iid`ObY`J&SG7etzSEI1Sp%!lYuib`+(g&^9=e_pX<=!be;YRl_Zg=ioCGplfE74657G`l(j&^~M@rhhbql&FT; z9lP_ClhTFpoC&I=jPXQW~{Aar?L`DXC06mh`=mAc+q=$14UwGRr;eFqa+Bg0X&0>o+DIOI(f0Fxr$}!2 zXl-m_6Xuoud$2$+ObQHd%y@LgW8R6C5i4gc$+|pqea-@LX({0Mi9mjmd%Z09b?!fs zF+C+sXN`GsGvB3ks<=o-;X{x4wi%L6Ly38D=nF{}i}8Q2I6<ySU^4sNfL zHuFv&1jj{_m;sAh#O1T^_^teO#rIs=In}H_WEWfafcN}MaJhV;<25Cdu+cj-`KfDy z%N=sCi3=cviB%Z-5o?ENVOd4ri3J`b^^6f)USj=t-^>`bn2IAJAn+ z`A)P|ItJ@;C%5=q=W0ZKku&y-M;7Xj+`T+Ooha97{4IoOl+PT^4si~md}e9-TYoF+ zjnB!n)H2FvJ>l?23H4LuM)C9fsIML~*&A^T?Oog!)I zJ3mWr|3iJ#@sl%;FzTBdkMEE_jdrVK>FUL9)He^=zuba-FDHk0wK`xN`YRg!ps*D5 z=Ot4!rbk0*^RTir?=d71u zFGqjav&Yify-;**lkTtA-0S|vCD6m`yn|l5(4ZgWWN#@~P9N%7W>I%StI^MCX6^W( z75#h~sLY@o^G((?)WO%C1KoG$)kBmRlWjUZliv$HB!7Gmo&TG9kx(w2U1a)rkL1&&+4kL>#qpq^@vkV?IYh}PYWb&HcU)=n;Wm6DjU^TwzYk;q_yOMd@ZkksYJzAI}oB>93z zrM3PR5+6+?BjR8{qW{xV{etzA5~sdw66ux3^_;#o}xz9XJ>yb8iRHn*;G zehYl=#CaE=USr!cyzXwSenuAweRe+Vyo4+XjQBfpu&e-aX;ftA9js3t8>jp24Xzhi z-61h#O5EBQ9|}g4lCAE%nrHR)f!omOfejg{;P`jLymH+Y;_|7JSt8m~abzn)-go|T zvP%E;G(~haa(3LVLQ^Ybx>{*<+*b0oER-|v*HaXs)5YC=)~V z)f6I{=5qeQ1q6&S~UI zcJD>Vmzmi8{iiF&CuptY+5zM)%!j?Zx&?~=W}gdN8pZg8vuY(--+;2GGl{yG7b@N^ z_R^X&V%!PSqr+&Ysxfu&tS()J(nr5s|0=XX>5r8ib(c#pj^cWNpTRwhpU}t-miUSB z74q)G-``{W#9NEBx93PjQNy03SK6e?zD+vdgBdA#u{~_zdmSm26q25~n?MC8zw%@{}^lXD2-&`1}xiME_7y67;X{0(o+!clL zkZIsQnJ7}F<*D}DDTP$rua$QcdO=E*ysfU*FOZ7AxqNlkib%QKLyPN7JcRPs^=y9m z0IBG1JzJ>~MoQgX`@0<;k}|~*Qu!a&Q@HbIZMBn`lo{Xj{T8u>lv@&=rk`n~c${jI zj`=1jk+m4Lo2@6Mq8#>PM4c3UJeJFb`Q~M&SBK@*W(Y-l`nR}{0HL@DynOnVljPN_ zu5pxxk&;`bX1_K1Ny#+B*=@hD?m<-QnxCQuDeRX$v~3Xc8(3S9D1GuGd8YdMKen5)o9OfBq-jTwAFVVFw-XzC7XvM$~ zal0sh2s&I5~NaX8A#?XU#9vtU&OzoE=HY#h=;GF+t1xV z`K)w%R=zdLSMdg|YXK;4UGF<)?t(a|CKNo6^(!yLtln$(Mm*!Y%5uF6<*Y9ELy_3e zW}50tJ<&&b?hCVRRXmAtr`r6O_X7!9{BSa3)|$8(GTu&$H6)JxI>-J0<3_nIe6&8a zpM*Z7Te@VePXcDu#8-Y95|^zXJdb&al3?KzMs2qDiDQ@Y!Y^MvygusG4>@kKh5viq zv9<+pvuI?plQ0GcGOI_)QYS7f42nj3M0-NKh;i2k_M=Fpx_2zP3Jzwq-mIGv(@y1#G_ zg!I}b{ImZHesgs{cL@B2$U;vi-hXKj`0A*S5e)?%RU69*Jv4`C%eJqZcAG=|tuxmD z)^0+YO^)0**-l8>af0E@H5rIxp@=v+-G!uYm({4S#!O5X?foQ4El6>`3u_)fF|KdF zORz^fBnl`^Bp>91v>my85!<~W?aO`fXK(~^I?5T$l`|oI*T{+AWeSkO7A&27pE<5J%IddQ>ADb?AyuXI`L# zPgg_}t8LSY^3}eVRG&eCQXOMf!XPXck}#PqL$vYn)wC9!V!)gDsnu_-x+We;iILJjy_Evo@ucE7&kp8os?(r3c3ggl3Hp>@2-4FQkDEJ@EH36QYOFSaz)@GskVAmCVTV(sSIrR zMI*sTN}F3APBm>N)k^1GtY#TVdHLR<)ZsN!v36y7%vp$(C>}ca``!~$;j-yg{mCt) zibeVUvrjij$-5MDH3b_|7Ju=Lthfp(x01Jiv#^Df7)2btyii0cIh7X~XRnjeTCZ)R zea}dl>oH@Cjm)H2@^8({m%OB`>e6@e2J!cq;*kxqL4;x+@AtJZmy|p#_x1X{OiIIi ziuEI~PJ`qMvyOq>aC;!0jT|~p{1A`A1G$YUh);4`pPik>>xwhEIDS*;zRFYS zIADVER{I~eY%0V-f#mr-FT}IS_gfgO5YOBn&O6>mIZJ@ysN{CUGqsp%-XfIecH1x< zt3dhA=TbtVHtL%}IY)0qqQ3a{r*h0L)F1y76q~qWmE-$Z@$*N0r$A+)!Zy$q?}Nup<5 z41ZQ~lfYC5ro&Q?iK|0?+Vd-&#DRV6-ey@{64|*wNJRA>3F(eCcxE=P~ZOG4EDl>{m&OU zh*JYgtxIRLVt4%D!i^h)gm-3J+ec9)a5@vtoPY5T*-ZUcyX}fQJSaK1rK`3RT>Rb- z7s>@fz=3^y3H`hfy)PzObEqF4T~&ED`6~t-x5rssRuG2Zw};%X9T^5+lcFQrZFwM~ z*@kNO@?i*wjP^R$u?k^LDNnkRQXs0iS68m90OE`b?9YqlLF%NJ-Je&lA>rZUcMk_e zAmV5mZI8bmByBkCbuz~qqOHI5$=rMg$*Jn5pZmhG4z0m~!0R&*-;-t+uq+L!k274V zhb*w(?W~7e4%)Z2uSluzra{_q?glNs6iB9SY{)%=eNr|`b?;Eph7{V0X#b~IAagIn zgAP6cNOQaRn%`>$vSL}bOIbQY(Zj3DkN;7i;B%`}Qgj@~B}*0R?>!Cqd;MrQW|Sb$ z<-xr{4k4iYlc(e+zC?MhznSq2+TA%7bPuvtK%s-l)(Aa*QnOv4wZA@$)Kw(9-`oO@_c=1c$upf)E&nlnpy5qw<+S%a-)uJT2=$w)p@F6lLX_oor5)v@==d>lY3y`R$F3*Swu_0Acth+QD1Q^Qsz zmRzLj$oul;FBeFSwxeP13kgzYmwr$}?+~d-bXW|i3@4R(E1{PXN^$+`5zeJFy#5U5 z<*OWsXTtyaKaEE`I?}WAwq zxPy3hpyX@zU&OQU9eT$RKW}B+u2i{!c;>7uvoR3mxsm#e2ft9hb9`Pt6oL9?xW_*I z+o&%p+J$JSlRV`qgFE`mDA!&2GARFtluZ46cy*xyJ~{pn$0nRkt(3@PsUx4{eTXObxzQ&) z6Mt|JyN44@LHIclZ;hDJyuwNF(D%3xBfp4mFMa7O1?4f%p{;R^|42Y*dad$zIb!EF zS4-s`L|lRtd-^ml5k}lTUeXre;_b#E<6nsJ8sf&fSDz3^kN*@cbL1PFB^FoCWKfa+ z23Az#3xk9fvEdM z9idkT;Bj_?j;Raw+Z(8P((|+(QulvuvKnxQY!I(H`Q`&;F?bB{-yMX)yC$-hlbn$G zaAJp+Fver-sgUT|dfe~c(w{$U}N zT2BjIwDypCp^bx`p_!ysepKh~{TpbXTBB3wtHa+#RmiyPi#R#|;F6dw;?bQ&%9C`& zCzlvXmpT59^i@=Y}%u3ml9)v$&* zs~}w_!G&_)^B)nmt0-S7N$nG`LV2s4M|xToaaI4&%FA5Dv)f&)Pa_e}Vu!w7(jpbk zzx+ayIuXx43f3NNMZ8(gUO_)rHH)*1?{~DbsT}yK`U%%{=WIN2ssQyzbN+;@oOnN} zmMx`(Q9cuMdbaZ~%4eZ`rYXBoZ`3-q?@cGlXF{{@6gp7vy=_+JOpkhSM*L&#d9=&1 zxXfQ-Mf;amhkmp^DSY-$y}x=G_1;w3xKzY#%k(dSKdMOa`=MtWsyxvSmj6zL7UepT zHFmj$7_{TLZAyt1N4uWp(!?6p=gVVq*?2Jz?fEexy3y`v-&g(-pdgHPyiI&^)TL-Y z+a#th9Z&L&SyT5pxT9TP&z1ISINHyy@Et4JgMNt-#HX63Q>~=H!|$)q>k{+_{ML*?|3lVIdD>7@te1!SLWl7_ z^s`2UPxiN<-*xH}W3ng4fsDxThmMl89h&(XTo*{9cGS6F7k8tdwU48F#sK}B!#PQB zv5(-Fe>vy&VZJS2MLB0CC;B(-uJ&#CLK4c0*<1d{(RIi5_v5PY@qJFy2j`1fh>c9{xtXa?cUEJG7h=Sl2+G ze(eS&l;AZ8Tx!pXhFg%b-PD8k?2${v2+=y zgjRxU#?5cR?57FgMi#V`*Q5xKjJGE^-qI0b0zZoGa$F&V45+^}Vp$<1a>-~9+VK)H zH5w%kR>Tt03uJ4JI_e1dYTptksk{l9$Fx)a1)d|M^4~Gz5~3jFx@KMV7_`UuKmC29 zeJq3=+xMYcBzr>E$C1zXj$VZ(JN*>8sVZoBTT3ua?}mD+eHodG6Zn_OqwjbhUhnIF zE_oesYDHG~C=KFKuHv=^C*qTLezUp{Je|!vFP&0=e+#}J@xB2qXLir^YqUUJx=N1l zt5b+eZg!`2$>FJKxS_<#0JO@)wYvG^zG|{SU3`qEi_`5M*M8r z*ftT{S%+)To0x?yVES;{*>3L{528xp^|fZUi`p)>4UTX`K{o(kH=mF z&;6UoZBxh`Zs2+^Fl%I=1nxuK>#{NjalO|%5aWmTu8{_6k$Z4|dy!mIrUT<`e|_%DQQCrWHTxgzj=0{M|I;@? zONH?{nq`fc|1e%xm)2K`IFrOwCaw^TILvg;|3Uy^E5uv zs)O;kr^H>sh@UT_CNhQESNSn6Y&g$iQ>c^Zc9}j(A?`sXlly6wgcV zZTT!-M;^zxMOt(?o|iTRk#k;yLjEI^N;l3SKg28M>u@Ua)k>aQYGpu?IYn2su^#f& zy7`HFZXpk(r{};SYvg~d|ElgQME=KrJJ}scGwU?I%dWvN?YW86aNu-{FRguMn;5lh=KG z2r{rzLBoa!q-mr)vdEN$_$;5-LyPAi=4D}}OPV?)%`d;p|KSMHtUY&V^glqnsQen^ z!2=NTb1Ed6U;>`kJsNeI9|7V|&*9iUh{?F`oXu?t;rF}y8@VX4zGx+DKSd|<(<+%= z^LIfgmF~*5_Hb~jeY2r>=>vEYB-NNq)Pb(5cZPWG9Kn+=m+#h$FI&*1>;jpw<#h)ZeS`F?##KpURwRm=W?5X{j`6y<$Dh%y@u+nfbL zMAf{gO6+q&a+|l@2q~5j^YS&lSiLXdu|!nAUZ^@D@zEcj&)q_VCx&W+&WgBCB&Z)& z|5rnZGdq}H(180V{|n}qk5)lz?dqZ@#T?>88o`~m9r1xkw6;S9an?={e9^kLbB{|+?&{7Sa?)*M91BL78F0Ns?2q?aMZ9XWR{kD@cx58CO#Wxc+((c`$AY*IyLzFRdTr`s=;jVO+;F$-YlWd43$@ zSvF(r*Y4qdlI2jLSU5CBFWByl!F8L7Y@*SzkGP*y75J0=3FBG4#h#sPxSyPH=^u8) z{Uop9t|Cd?PwxL%Fd>5R`O{ko9XS3qs$^yb&R~4Zgfv~(gz@=6voOX77#};xQT?+W z<74}DOgCaNKA$`Nd3g`U#~5gRp%>$0jk9X+S}{IWa>D-y#_z|DQF%lO;d!HSwvfn9 zyuZ$Vmk8ohS;W3=k`c!HjmbivJivJW&A^!=COmKKI%6Dp1>^l5Heo`aFy0^1@bZHN z#`_&|)9-yj{zRyI`vM916FJP4xwLqGX?d99;REDPxO}_IAB5+ZDHCRQa3878Y-7N* z2l*3chaWjN;Q8f&Qc5z6D~kDhp0>8f^Glwrt2^hUK|Y7R(>5U=Y=L7f%?zsIrY5`? z7?2Nkfi;e(fP4%mk$WFcLB;ldwF55@X98D$`uNx(ALCNWwahx?V`#`Gwdx`t!|AWm z>{%#O&=9g*Mg3i+tKGBWsK?`QIsR{^2J&0u21By0A-^nIkB5Z1p+D}Q@jXV5{MNtH zx6QpFcR72-{_7^{D&0ufz@tr{w-Am%-<6&tT0BtFi4F1CX4E@LluzQ5G) z#MNz<0fHbwHFYXien*Ggzm!XiuVwMj>VZGkTwxz~=z%+J)!-*%>#a5r+_IWdRUD;O z4{pkehA*~3W_@^mR2T)e1D$(`uIYiPE8ud4xg*qw{KP_;(z6Bj3o z>ry4S{^51xr4=Ul-28e%)A1s~g*^Ghq30C@uR@ODrJlnC56-tOGQCFdlzRQ%RhMRH zlgOaiJERP4jvIZ7mki|y=wF$rkASRKHlAq~&V zd*>c6cVgiq^*cfT90BwGG}Z^_0Q3F2EI&Czi=xAmSBHJ!`QMa2_RVEzEFAvRY~~J_ z_c!xfE)rVmJT@)41n{{tn?3ci@jbRw30F1$|C|GGZRfcYK4ZORe9p&B`J(uIGAa$) zTKK$SZ3-fS_~~fF|9qnl=kfWRrZ;bxLc=kB@dt;=pmls^S49{jw5UEyeq!(u zcJeeSe=`8)XP(Twbpx75?JO%7lHj>I;{ee$4;rfGjk?bq0nF3XJG%P@Jd0TLmV5LV z>LQyJ`Tb7Ls7ct#gH8EQ5itMNKg9>}VBN{U|JfdB)i-)i#;pqV zdJh`k^v1$7LjhR@s_)SBGq7!6@(|Qy3KtJs@ImvyEK|K>3_RU!XMCAl9Cq@IIc)0y z^NTzEUkO7)k?xoM0%YS^9d7(+dt3Ll;FEkDW8-+c42UYq`v|Kcn z(3q2I&$NFCFpr(&9{&b*^0=E9Y60`NdDmnx9zW-*z;Im^npF0uUgPA3Y7cG04XM}A zkP_s6^Qb1&tIxY!rjZ6xfQV{=^*5-aIQ=*07{;motZ>hWFu_iq{DN5y?hDN)5)+G{ zY6!I4ZH_|y_&}5p;T=@c2kAe}T!h-#BIaYc*P!P1?ZX0;F;Lt;ZaH(i0IF!LC!49C z0O~L(O7s^3>JVrj^ezC@AHbB{MIcU^p4^&SgPMIsm(H{|L0Ku~X!||ni=8^T+8w^gYjFYUJk(1$V*M{!D+Tw?&}=VUxS13S7Tb+lgq zbu{K38SsEsURqvT+IAFM=gR?(d7S9Eb=JBd};J(o$$9ewR z2ZDcvUB%B6p@gW_!vvf5ID&hz`Jb=~D%8Kp`)BB}Nbp&bu;{gnD29&=iT+dJQb;$n0>eqS@H>av&kJzo2qVG70XAugY}abV|r*t+TO z$M2ya9L}bJ{co5?auwqZG@3HA<5SrG=3X&DfSn=&qp?daC~rCX5}~I_+XS@VttR}<4?uFCdW>H z)>?Qrv(ulIZJQQxe3Y|tByM1T4)&NY{|#j&8!|t7qp&{}wGh<{IcM8|d`{(WJ2Di*ebfA(^$ zivP!}yS58Ecva<{_W|+G`k>aS4aBRSfW`<-#H*$I$(IIp@ahJS;|^YV95rI*-ofWt z3Qs-6=gD%x(u+IzeAi>I(*NCW3bcuIAsv>fr2 zfBCV13gW3ZJ>8Q@oR4b1HJrqGru@y>h*d{>>_)s_n4Q$N+QECB0#AL!`}wc=LL2{|$2MiY?aX7Zs-jhP=CAqj_Z~QZ zjk5oHX7T^|%ivcX&R^bljjb~=l6``dr#Bh|F7WET^j{k^PMm+`Y z@uZ=a9i4^DoL-~<>kOQXtta67h|(IW5SmA&#=Yi)z3EVDtPghk6a--`b}PQ2!(S&uK?))B`y)d~S4%t-gGcQ9gN4?+^=MJbTWps9P#}J$hV^Z z9Y=kY#DQ34e?ntUkKnkqCIS1u=xz(tw|GlSwdci?9sQBZuf0BC{zZP}m%2}cCY3Af zSs!#!XC!6j_H~^d9g;VhG=+qEbqVurJ_Z8G`^#_3&-fe^mnhDo4iSz|7!Ehz(Rm>p zRJli}oVtVaP;}CjHC}>S9KbOL}qfgI12vzfwuJgmoJzi3dkL9c4U_S&G4JuuHnxRK?XMw6QLNcO3U<6xLJV z`=P%_2S^JXx%sj!Kq|i%+tkGaMDtJY_S^kNd#?Winw)^7R$fVCRgL!nF62(T&L}0+PDy^p`KFU%L7t|7pwtw7+l6PMpT} zmQ`K(QJ=5LaDv^u42Tw~3EEL|*xo3Wz911u{>y%?+!&WxJ2=|ZFNp2ERo{E?1CSQ` zsMm7O0Et){X~h2=?>p!^S!#*)cRkc!WB^G+b7OxP{$78hUQ;3ujvmT4j477P{sQUIiN^xnEI|Axs+p}q4iz*---9uNVpS19{ z0?B}uQ-lX~5eE)ZO}BprVqjb0SIvGPGVZP9vvdYhZe3Z4C=-y_9+I1>nnJ~an&lZK z{7WOFJYXaWq*pE0-;6PC=V?JaPY3`~%4VE=924@*l+j`r@HqXhYH5DM@$&U zA$i~3^ojQe($Nk}E-{|{4F^39Dk86r?hCuQh>8 zJm?UW!Bz)ls5mdgeN_zk-8|pqCG)xQy!mbVRCEAT2#9ZZbWQ>3+2y|OUu{rv`_yIL z-}z8MtG(wPC$`UZE$q9zJ5-21Uy-AU2a@fbc8Nt3s2F@QbK}=js0dJzzkGHDDrVs! zUkWc&9=U$dhaAtfDw6+*Z{c_R^l^l~2;;Po#VfblN}z%ivdQw)7%CLbU!2|?fQonN z#xufnP+{dP92fizDn9RhCPW&5NYQqi)Vd6) zj$89QnOz1o=~oV{jhREW>bq7-N8~wiUp-M?fN`X4uI6FR-%vgA+5dnK@>kd>#EQGx_k_3nJ!A~ z!jcnp8boL7(<)HgTJfT1i2>?1*eIp_&7qE3B>hN?AlALQa{Ck~E7rYQcDViyad?el z`b*4f#IZw{M+wD1>^e4O6?_Bjgy_QjlCTbqmtk@u@(2EY6nvwM^Ml&5+}VD_<6wh= zzfZ={u1~@db(_luul~yHJc#~+r(T(1eI50JgzUGtPwWcmI{R-1?V@_LT`vPMWcN3Y zdelcIGu=)!^PTMYPkn_j_avh@o`MPlH&|j{0xuPkavz(TL`F9RDG~-ZmNOQ0~(By&*Rl z%7&fTO_QY&mmf`(owq`K{p1|;UJi&o-`>(71GL<^?R*Z}VcYluARqeEcI6 z&xwh#=U*N@(+K4;w!fu*;_vtES1nf@@`%}t*!1{r;P~Ta=E8nOoW44%NcackVbwPk zWTk;v*!+%L@G8a`ZF0+RB0k^oTsHmN0mRI(C7AAla?+{&Q{_ESzH7I-EPEgjr6%s1 z>}NrIdr+=Thx6X1F5RSIER<*6XFkE}55!K#Tbg;Sh@S`k`?Bv2;+@a@chy25HthSL z8-E7Mzi)HAi9mmX>kJP+W1S-xx}2^TWsg*kZ4WU zDb8CXJ}Sk2V_HHyD`8|fg}?i^u#BTBCxK|jnfa=w2!BT@T}EpTAkMKei~M&VD#QX! z=h-lhkb1Y()^k7BN$O(D6PCpJPI@0r$$vns_~NZZej6(G4mV$E!g=vBpU?9G0+6&y zXia|%15xxfPczR&Abq2?w+cc$Y!&7Uus}Yv(H6|_)vcW^Z$UgNruEoHyt3T3 zxGbE9b(Z?WFm;Pak_N=?>nTg>06sQYfRt4tWG?#&gr9g9J{ zq^Gs-lZUGBQt|GW6`_WE(=zR&22|C_7ENk;L8WJn5cj$3P_5z=61I&v_Kn-HFv&>I-^|_2P#wnHC;LMx z3ws>r>ScS&22dZ~|4~XI!3gc-q?f5#@Or41p~n>{J4E;AlENhVvzcZ?J(aQm&aj*N zXVLES+)KpOa`TPAYn_4U@9i>{OoMU_fw$rhgwWrN%Io*IPUX!NHfXIwe?M&PFs@#9 z=#T8*@hB)&VSW0AVgSkl8P7U?-oXC&Gwjzxtp9hXd8YFe<`W+BP2z~e`!u;)v%h}A zc9YG%t^Y>5`*Ox=3)oJ81C9$VaumxOXH1_8DNYixJBWr7$EME>9M=JzY0{0h6134s^NIP~2v-B*Fq z%NttmdJa$)S~w8YhwCm8_RPn$=b+s3Y^JctF(^A0!Egfk5#_qyEf1_=9q8b0+Anz& zKoq9wtf-lVa_vo3){9uDnb$$ALF^KgUg4b5?8UmOPmZiRCf4IPy=|g{{9_z543M!@UzSiT(RBw-K!IQqEM#v zBX7?eHYg7r82!=Jf^`;qsGK^GSE3(Wot*0kgw{p%KnFdkesMsIF>4&Nh$B5zv>zemwt zUdmG%P_}CQ{#$nklz!z*Owp=_a$C8MsCis3iqXliZzAsS$EyqGEJ0bT{fN~X;-8YL zvg9cel#9Ex?K{bdcte$RI`AG4cT+7V@1lb8fickXW5)0GHjD8SuIu&J%dPPJDmZSJ zYi29}afx?&4m2jhloTlg)OOPUK7LH>n0B$Uw37;-7`p zGORE6;o7jtLFDr!I(??4g;Jk!o*IKJv`gQ;qCpO&sdtqGaegRCe4g-RSp@Bz;ZZpIO7R$^a92dUQ6I>*U!L9`rX6eA0FrN|J?N{<67- z_&}=|vYCbceq0v4--hkRea?8&1Epy%4!ob^Mt|U7C2frDM(MFAF5~qp+kF$9P-0Z{ zVDVKy6kpwEM48M4B`Gt@lOdRQ6SyMyWF!Yl{WUez+7Dp6gX#%4{y}L*gqZXT545AX zKI?H5?RH5PAZX6f=HP=uVru5Ol zw$K(wD7mh&KI($!fH@qSffx@jNlX13nrQ%KK{Iy0tq~uy^jUA*;e!%$_YwOu7Eo+_ zH2+W{{!aO#aVhv}FQWYr4e*QG?J?3YJ z*9z!eL-p1CTK7}$}$(^8UJbPh_&7|u$Zi$@%h-xpZh4_Ix0Z~UbMlspzzd@An-#V!w-TW`le zNiQFf?S~tbwRotLP9H(u#`CQkF<8Ien~PmS1?$oe>bo?(Mt`jl93_0Eh$C3e#U1Mv zb}&zc`D42+G6@l$`B0p;J#r*D8A>S>N38E2!FtnjR}wam-#^CI%OlDPC3&mo=#V#8 zwwJwoOfeNoX4f05q>y(uu_r+)P7g{KOETn~a317d5lO-CQ2hBzO5qzhD0Ps0nT>pq za`&&n=ls{9O!8>Zt(<*OvREY<{~-^`e224KDwUyB#zVC(KLpCp5=LJ}0|U;L-;VgG*r(TsQx%9l#Tt_mK83c2qT z;TRt$-cB~z8>s?i^=_j-{=+y9-R0_M$MccjXIoBJs|zHj`_xx?gMcU`(!90N0TsIZ znpB&(p8ufmpG!N&Yf8E+l5Pw_)%np5O4M7cD0Ull`%?uZ#$>K$1?2Cj`O{KSUj`nh%i_@Q=n9J7kl$a;l zjoJDsJcDA_(pJY5f3#zH1q@+mcROsEDG9Gf`sQoRK#_z|eY@^y^q0&TC!B(I3D;`t zcl`a)`&(Ct{@UV=9*UzKUq_?=A{4u^(p@e?T^GV_+plgWXxFqU;&cK1eY`WpeHDr% zk4%0&{R|4pc}`9X{)8e0li)*Zr=Z02zdfpcW>Cy+9<}%MY4q3Bt#=;#wcG4!fL|B- zTbsXU5QKIXBH3vac-@!GB4G`Rq|&~9cT$AH-4a3k+-Rrxo#wCUdnhqWsbF})2E{xD zGc+^W*zWkuy+I!+_6X~nJ%11FxI073cjLHi7#GgLdOGfnGZLSYphz}xlb-e?6jJJb zx?DO8MHk5XZ8=z=#NwoN6MG62^9m2h1)w6h%%O)K3XD+f-7DQI;|fLRoo!DmI3r$| zM&6k>f?_YBz%hAyd_TYW!QK2&NE2qD&~Xv#a7f1Qd*lEmHcEnz*QTIY=={mCcR^5e zF7nql&oC4}GIDG(#^2@A5uGhZ{GIRD*LJ#eLa{%Sfu>U!6sc=*N2jY`{vW%=UrH({ z(vNH2dmnMY;~|YIkr#?39|w|OvVtO&JDaX$dr&XJ$*mw1^K`T=Z8X<1p~TVXn54>S zD1Q8DVB4%4^>gB#SfZz(kXs{l|7`~-vZu4<`5}t)NlCrF4fYo`)AkcpGT6?u-!T$+ zUs=)f9O5kAHpRMnO zlDFn_H@@QU@8q*fF)jIJdhTtzZoHt)cJRZ7>dG1CbT#1iy{h8*gSLug%>1{c# zsq_xY54ioPIyMER@3MZ`$Liz$@6d_e=UJeXRZVj|a~+7fe%}S`Fb+HA6Dzp<0f;t6 z3PnmuQ0CFWEFg~Y!NKtS@&rpLYtwnv=Aa6s4=2}q4{qT)cqM3q2jj5ZG_0ykp@EF2COsdy0yNMgm!jk2`!sY@H2S0-m($x4$u)Y$Ih=3du@NVE$U;O|UAyH8#W$;eCAdtv4GU>fbJC*SK2;C)}?PFz?( zJ0smNK^%v#NsPr=XYqP{t*rs_Y#PJ8nyFu-zlf*I{+}T~Kr*jTxC9Ej%Enn8K0txK zPGPP$9ok9iYjPAp!CcPwgUMXzZ}RIs4^FhZSQbawi`Op@jxK~k{?m_FIO+T#&&11Z zp9vY{2ga`Lb3%S%kK)JGqux+pU{@cZRfcwwUu;A3p$yIpQl zUnD`nyvfb4FIOS|S&&c0fDq)}G(6Ua>-qd(P1j=|MWFDl-QR8BuTWrA`dO)U6!M!- zf4#Y&hxsC8Zk|;7kpE~&I-yhv3g3*(d0Y{Pg2nK{6pt9lZ|e~H`Wf?2Zqv@$rSL<3 zcsoz0JrfiTy<^rEUV?&~0*jg7_d|XwA5F=c3lyvlztbcAf&4I<{J7?JDD2NYvKF=u z1G z9pY*Lv${budoy90%Xwi1q1;_sXjA8N^~0EG*5CFiJZp>V$% zt(U`PD4;#q7<@As@)9QA?0SdaapbSb-HmZ55(>KM<~<1onL;hgAKD=Q&(D@2TYD(H ztgu*@{s8h{@CT7cquv9v==_71Sf5>-WuRLL^RTavz!>I3=km$L>0P1VbdKQM$74`f=+fIYa})|F=u5O!o1n;)*@bj#6bfC|gjX7H zp4pY2H6<+v`RCm=BM+KE!Fyk0=AL6vd{=L8<@5>^dLNJsX~FMI^f6)>MEut?2ro#> zfdc=0kq1S}P_%XCRrWo6?yZT7Wh1#zq%^hoqZaF}@vSHF6c$5~@J&0;zN3gc*Nj;e zdZ4Iitf=k&87R!=w>e|L4#iJ7E^uAKc03e@Z}2^b66vGdU-XerK*8{H#t_$KuXP<2 zltZC#iSL+u7&(-TZ_Eo3Uf_OG(EOm~9Vn&rn6OSzgW^D$y3)8UTu&0L1@&EUUewOa!w0lI(ULoatwpKo?E}p{X>5OC&S6Dve94NC2{1-=aIh){4&OXb|Fz~ zi~?v!GxliLFkbhSiqtv;IrF>;Nfd05ZJo$v>edQ5wwnRcF^?ecOc=O>h>XR%w=rYICLbk2Y?qFL% z%n#F!VM+Rg{WtiwQ>rcG3hxdd@Wgf&)E$Rx&kU?Vx>#fO&j5PV4)7S@C^`S*$v09zw3@*r@5V-;ndG{;Qv= z3*^xeRpY)VLe9eixz|$akT;-JC~isyc{DsW^a0q;=GKSnFQ*{eCGE(&u2snKQBQm8 zn+tg#4?T~b$cJ3%QdRLg9+0!={AV!a zx`#l2JUwLh%Ds6>kp;PA>K1Pr+#%mn?8e@ELXcayDiojp5_0ujpCwDuL0+!euOy9oAJmqf;|; z^)lq~*0S>hj*~W~lroy5kS|-(`n1*va+O~dY?-Mcj^@~F$zvYj{1fG3Q-J*A?BvnI zAMiWt3>~?867s4=%uIEV|C49#)XrxH`6oMjYCF>*4~uzQNnC=02WR^;2UH>N_^&dV zr?pV$lttQ8|{jA<()Sx)*!2cXDKM|Hrkmx8}NL@`te)#lBlPY)xktY zLq{@i}dA9nmG_KZ3qaDLHk~urxXK6*E z$V7iH7d>ZV&`w(B?!qO!evz2c;|G~_mtTleB}1AEb){#-7xcH{d0Z4Pb zn&SRW95Rkiss)y9mmb%B|thKqq82?;+E*r-C&1ZwEECUqc3W>1jJZ#1q&1iw@FHAk#!nR)0bO zGM^sX@*cH;tgd5PdmK3+gYzZ0vy$PsRup~EEeKh!_mi%&QA6g70_oOJa!B)~wP!8W zfeb;VABt}~Alqwy1Fd~CWZn+QKIx_jnK0OPI8+$2dX2shaNUOtUbo{NjQ>HlJBZFP z^+HyU9Ea=OP{`~Ly2n5ofwV9JyWWR5$dJ9Cw^kbJQvJtFU3TI0sq%31R07RUvcHZsqr-W001?tEPu_;xh~; zX>3=kAv-C9XieV)nPI{&B+OYM^P>Q56!NCBzV@x$w*Cnjm!Gg}fI4JH>6tz``3kb8 z%nQffxIoqcZO7jCSVyv>p({>=4l)w+?mMbseaB~4H%gT7`J2-n<5!ViNcDyZi+$ueh4m?^hO6>WaPh4+Q7jO0mJF3vsq!Evah?C{(MZh0R_WiR-Ur!( zxl{wHxUSnLeM48t3~~q9&%YA+3%RFKS3HhmKK1##A4eRiAphE&VApM2UpJEdLY!ogs1Zqv$5J z0ooDInrgm7UH;*@r)w!_=e3~!LIqNb7v)~R@Wty5i#GInkbF$Ujb^LPJExWeGyU=9gTyIOjob1P=x^g$MNcNA#3=uHpeBlTuUvuzYtT-uxyPXwukT$- z$hm|5mIIgr;~>6*UZA1z5+ux3YNyW}htyL0+zl}|^w$~Nvd;?bo~-e!N@E_f-l-JNzcQv?a6vM+?+-sM zc8ISgKS+A33<mEqX$dx(edwERzDv zw;}QJHS^WScOmWAi*!#0c1RLxXuoK-1<7|B%>&#IK*~0yR=i$6B#H$Fe4c;Q#?o8gnn~+dYkg#A>2uasO zlMe>FL3)J1)cVKU*pI2aQ}|;bMTYcn?+I;46An)M5;_fu%QZQ-#1|o*DZcsOl|e{t z^?6I3cLvfZv;2aIjgXk!wR}Lb7Lr@*Y`KWakm+m_e86!PQVcJ=$xI+Xs^;3$lJ%u>`9^9UWX4u3ESm;FZW^Cm`wctDQM3_f+@yh+Q>V0q zufBkYvy6+G&YTeWzH<8d!)1sgr&JSm`w7we$9yB}1JUjf&qIY7h?S&ieEVV#+C_fh zEFXtBvUzHO+sY6tu}rok+>UlGL(7F@=+EW_ztk{9j*6d`+E7J*#@r4I@{TbdHQrU<8ele>`A4fY;sVlk`cwOv?PGC61h)}`SkP$@49np|DSqG70 z!X6%rH4wL(f-Q!T3H`aKdGd~_$d9|9^g7c)9M#t8 zR~+^b%``zPqsRa;VzR2+3W5+To0Mdc`5MiLKslf*8s2 zpvpJR5OKkp{ngP1h@5@t;3j4dar9SmWA!jk;2*jet+`;!-DW(+= zeZ)KK)kPoc;!O8*R)}JotudjHfH=W8QwHSmMf1nfOxED9QU~?U5Om zVR{B}9P5L5^bHWJOB+y`j?ee-`?E(6hae(4*Wv3*9Yh&8=)$Ba#9iy${f2V@qR*fG zE6%(KF=n;GQQmnF8$2hR-6#Z6QtPQR)J_nmaI`l>19d(eJicF&M1M_rN$$En5HWp@ zO^I$AqF(Wo4yL|`IHG*a5)T2QJ(%cg3sWE_*_7j1@p*_H5KmYd<$$R8yWw&t$sx|~ zr;N>ZHN;j~CS~Q-L9F7u#XE^V5E(Tf^yy=4*TUYEL`m=^}x?Uy3 zY%$NDFD!#NQ59!Cr(8NJ%Ko;mxj)pt`MghU%RDz8>0G~+~opB z;K^0?yxEh^kO0b_cVc$KlV^K!dt}%kwxhT|&J=a&!WiP#Rrw+Mo5hQa<4%x3pItM) zyBXsCo}DpuL0mI440EA2hbN~*Pqi@4;`jT<;C2}2`!K`aL-s`wYsDhrVNC(?SBVF< z0#qS!#jxyBGbO~R=ZGI^S%D<3e_EzAYLL)0SS_NW3b75=w43JXkTAgTvVh11N$#7g zt*^Hr{zA*$ewv$*cEiDxGV>dxSl5?MpZN_zyJhw$1`@%`d62mz&JTRZh7?GGWs z8aHn-<%2J0!o`;|vuMYWdRm?uf~EJea$V6xJ4W%l#(iifc7byIIs{Ao8nB7}5A9+Y z%1#x6my77>e4j$JtNCYbErE8mj3?TzqrdI~*WI_!?oPP#`x5kL<0!Ln673wb*;2;Q z&QJQhr7vDTcY%1~DFjgvIQ}@EKz~zOe|!hQXLrRI*^gKVIpxRqLv#gvxx{bH$M&PY z*`&UA77#2Wut!nvG}?*(kP@6myTeEKxD}(n?v``K!Vp9m?-W@u3tnzgCB%d}@S!Zw z($_r!A)@RxO)1pqZ)+;p(+J!BuBNm%7=mT9U7dN3fDc7!d|9S3gotR^4&3pJ@PV6)BC~8z4^;t)jjEsDLA4}#By z*8S@-2OsLxDvlvf2ob9>q4d}X!E$WxO%qxnXs`cxM-eS}`58yh^Q?jo3L%odU$NRB1S_~bsHZ6d zq|(*Ieso4%oX+Gw7_ai-7(Bnf?mC2A*xobPGXuV-Y6+rveip=(l%La{2*Fp5cEQ47 z@L|7NBzo%(gb*h8UyYxE;LBQDq(NB-687=>OKAySdBw}dBIr-CBjT9bHiX>d*H}QF zm+!f|nr2~J5X2?)egx~O2V11Z*d^qFkLZ|827fn%=$zWiU3wpajU}w-gMLDgajyJO zVjp<*J`49|`v^WhPidj$9E8M$&FLMh0^e(&)n4{rhoB4h3a_~Q2f>m3teq1L;BzZ> zH1Y&~57%Y?N50_@?7`vRM12^7D(V#zX-dJH)4%WtM*{eKuRT#W#|xpm4qfb3*#zHc z#;xj|-#K`M|Abr?1Wz}=we_t;omx$vT)Gtq>3;IXyWtN6SB1ybvO7SqzJNnqnl^a% zDyg=WD1z@jRGFc_1ffIkGqRp9f$zTzxn3mtDKD ze!-RO_5tj#XBumdt{;JrCybig#8U93Uh)hZ#k{clD;5JMIpDEZmF*eMbKv*ZUR$RI z``wbd!fcN>gi&t^U%R0UzAKe0`P3&NtmGI|x~Lz78eRxjzW);*AD-guiT??Hn&&u0 zr1n67dBngIaU#xldHr<*4CV~Z{csgD5wMx0_7ZUUxDLy zZ>+ET1+?3Hfbeh~>^0bAes1mtMzPA_zY!H^Cwge>tpwOPxdfL~i=y3~Yhv~s)!2HJA_%ZZ%LcaD@8nEXOpHVm@gS{s2t~J3$U=&3Xpuh^)^altq zM)`xC%iVy?Q;oo$Yx0frR~NRMnf{Q)9qgR#9_1}AgUxW>T+oFE;8+^EsO@wU*fZZ! zedQSgd#wxn+7=tYDB{g?xp@$5hPdB5;Jjt$Au>Z>HxKODI*#PuJi-2o)S26i&S2-J z@2Fg|1U3_V!r6Mf!10SwxAU7Y;1O_*;^HT;ziRV0;HexiD(?RmVf_qjM&%^${L%uu z0K21oM5xmx&2T08E|Z!y&5lP4D3;J=fVWI z!Tx&x?cR%5fYI#c`8QPu!RCv0c7K&2*u~|QG(FS+_QV^ivzSkAZ(z=uOMMUQ!r$|q zqS^(vf)`&Ku~`Dg8mZ;uGZL`7nJUQreG2wA=P6QH5`htniGn0bu-zwK8u2b2>}m== z&^;9a_5kYi{g{VoZ=OASa7q;H@{hcD9P$xty;&b`8;AnOGb-xf|CWJ0mhihQatiFD zliDng{{lv;^iyrLPGD;)7dz0v2zGxhZ^dR%VE_9U$zOi~?7ehMb$kAT-8kQ?U^W%7 zU9wP)a%}{TB(e_@$U9|csaaLoz;-A0y?(_M35?k+jW*7_VB5qcq5JO`*z=}eFpIN? z!y>uDfrm`Nz9H=N_4DpvPwyx{^pg_o-V7xLFWvzT3pMhFv1DK!xUxCr)dddsIa!6{ z#ehlF@T83D64*UBG|ORU2KK2RwANkx;c$B0+V{>CaNr%)To#l8`-C~1$4|Y3g!FR8Wfsu@W^bY%f;ON<~U(~Ds$2|KP?;9B6 zarP_V^7I{WNP>c7UIt*a^Ne>qUJ4GI>Q^4^IDi97zMjXjG&tVxlGQ1+29`?^_ICuC|y4S}8MMLvfU5!8B5VD$cs$~qEqBwqA@%g~d-SIkhPDl&m*Wkc660N6qh4&D<@&i9%@Cm{~lIifm-&8kf;i*zcS`E z`vL2CJKAjoo6v{jUd0}O@4-dy*O&e{hV9%Z8j0wj_FC7>eB5dDqujlz)*}tIa!hGo z%G06thLOd8E3K#tbP4~iUXMEGlnbnf`=IvxvE(5?^l4CEKGAUKF6xH(>U=Vmp_cD! zY33c=U)R0G-f~1jEd#*~nnF>iRp=UiwC#`EEoEEMjPr1vXeyDB#Pv9%7rEe#y6hLn z+xXG1Ls#9rD7}XMmUo{E#5ke$;)6)rZ@aiYJ7I^CFpq@Yfb9zEUu)Gd;KUp2l}U*I z%u=DR#r^%*2lU}ciA?3k^WdgIlR zM)Od6NkUWK_zTn;TJR=Y1mj=VhW-~OI6h6KE>{q0)h@_9Ji-RGs>c5=mQ~~D`L?Yz z_8IaSy`$fmMj=P`U0!!A>bt#0-$%be|B0R}i5zzf>Md0kOHsE`8*(LiG#Izh-!6zbo_6IiIGLOor;{8-a7s3-C(Z_4k2`tT6CLD^-fdq?=ioRkH5aYlqT&bXZA zV|@W%odQwH`OpeZc%YRN<}G&0WT%5WpEX(c!8_i!{c z(K!{Xe|QWHb$10g@p)$Bh2t!T>5$LqCv*5FP&{7b!Da2t2HL^VvyEEv^`ch7KMq#bwP}BD- zMO6&nb1QzjTXY=fTV^%*Zv>aqQ?bpRc@b)K*fs7-;k?^NW83fJetB%CD>A?8fUw%|c9? z6(erHp`eb*DbzV1*k&=QR6)&@zKuaBj*INHvpB;5wT!aqaeb0dlgB(oN<@zH?5KR8 zL*Jl>r)&*NG+q}g`{>EI&ok0j?suf| zeD*d!_K5H+)Xp`tEYA?4?#S}@`>Kz~S4;^}!RLSVesbkC_`IzyGfwyOz%9&cBKMLN zsfRjUuf5mC520@I+{hqR71Sk6$1feSf<}Fj@SJK+XyTKYxa=a$)^Ob?V*3CxG~!bIT}?pz zOLq&ZzD*rtZ4E-dR-}S(pUV} zodxw_TOW@-I0V&0ZyqgCpl_DqxzpcRedJ5JX9!f9L)G`Ct>jqLdkj`t7L1{Pq0Id0 zI0O0(eqIVPPeT3JI}`DWEpPNQF|IV5p}(nm^v>$zRpheK)wKIMpg)UAr{7Njsw;~< zVrY1vYNvN`^uPnEr!wnvSy6Y-FndqKX%VVhvgS)QPe9eCXTc;D4^&Sami(@Oe%uD( zzBJ=@+<(W%YCTZTzjoN*PV!->=B&IO`rQKepNb#xU0m)Vhd5g?+%F4dmXo76-*cZq znLQ<_=IhzxvABo&*sslHU*e%!a(W>rXP zK3DOAIxendv`5B-h_d(762&}c8vEZF`C>f7}6R7r-Q;p^hd8H$HcFR!>m5K#*aXRY}RG_BF+ zM8|d8Ulf|d)sp3tNT8|b(|U|kFtku+SieI*akH|G_DnVE&PkGM{h6Ynibp6=@L3I1 za;rI>&_w?ksfGHPyW`mJTr%c)9s8-LWuJv$y9~vVG!dvIrT^$Ehkg>CX9Urz5;(4L zi{&cj29bUzub%6~abw+H7xDPuaerw<>VoYhmET!WFMgOxccjb!s(6REzc8SFpT|Q$ zOjHo64*v*!b4VBGjZ5Qn^}~L-B;k7GY#p|~C2k)MmE=U*?c}Hz;Qv+HsI&%^e548{ z`RGF;-@MU5_5v!&$j`}r2t(i8r*E(8&^JT&(^U2e`gkaQ*KM?zLY3gnVBdeJBfr3X zUakf8OH>pNgf8e`I`U6T$0!o2E}l$D=aPr2qX!fB!3-+tx1` ze$?u4K^24U$(!b)P)Yq;kPUtHRYH~3EdTdm(h9&xP7qXb?&ULWWbCrdek+DNKjdjwHSvEYk3zpw zoMy1BP!3c@ZeJ-_K_8dd*dF0?C#Z_eI`z`_JNl<`zJ;E%M!(`I>+K64pjyE@+;{~2 zIQvzlOSAmwhcs+mFGZh57YXIcJYE<6-7C95g}Sd%<*JOh4m_`|4m&U4_mgwpvtP&X z^PQM2k|{#I01N#I*%E-NfUZ`T1w3D8@*jATaYA*vMAt$)-v3c8x}HtJ@0k@lVyz?i zJ(yU(F~9#2@82Z6d1VTrhN3)(RvYgNHNQL29^mhiV^(x=lj#4wIQOSRW(@r|=@;K- zb)z4d-=C!&{l&xW9?KK5Pgv>JEgV*$iDQe(OiCCU4OL=X zjy;5?vAlQMKiKhpi9s^p1#-ZP=kj%FiclXsQl-I>3uUiuGfw%Sf8;BN9}jXk%Zgv5 z?C_%wj;yA>1^=nCIKjXN8)FhK%I4+HyegbvhCCvQt z5?R1`HwNM~Y^OFYYh8e{@}}uEYb5zlzH%}B1c4BgRlJ!A zW7_y%AgQ9_sdg5lSiyGq%2f{+o}&Q|_pHT`XKXYL(^MsY$$Q}-fh@LhB( zYeF6MSc0#T%O;dM5|MuU;(_jElh~wtzA36R(KfIw5g{jQVV3%<;3DE=479&X!-<9?TQlA*3+{C>OBN-U0BVrE(5!S*O|$DJ`K zp1gZ*)H@zZAD?MykR?MMT2I*VPHQMtEiL(3kNVt+=$#AR*Pzr{{JNd}Z75ZFTRJwQ z55-f_jb|4z-`uU|q;qp5`b@MH_M56PH;MYIRu(<#b+>Hyk>643vh_V-UlB^x^?UNq z;d;!I&sPi$L8%{$PwaivS04@vIjZykO7%A9PCN+0e3C)h`Z)BBc)6T?kMC7WwFA5f ziaAja&Qwn?kqM>ILnPb3k%LQn+Ie=10!l63KfL^25{kdYM>G{HLuttUZ(-8vP-?hj zdMyt9G~|YTDbz_&T3&po+2uTxoSWFsF~sc)7@A3Zjym(dmqSOEoEtlvJ#Y-_fy!vh&p~o_)8V#4&J~*!~&%d8!v5*ZhRi z&6ZfJaV04AB4kXQK0KRD_`NK5x(j3+5~Lhmt0SV~+ESz#Lj1yspT5^#sx;LWO~)p6H|q zl+RSxL`q$Ss+4VW!cjkb9wL@>5%rvvW!hGpNAUj2c0^tjb^X*a z`ShV+;BU!f)?FyNc_Ps>3-y*c1Tz6G=Gag2iA*=8EyCm3& zTLh@8i6K|2(E~9>?SG{m~ZAw@x{+UkL?;VsXbMq@c)!YVF+aFDMvh z>hf~_1w~4wLV2bEP>?_6YNdY?ikw|`$VVxmNRf}E8FgRus{eilx zSQ(@IQ7F==I@z=pgZfsY`={uNG0#VFoUm~k^{nNuZO=$ULE|3lSKSOK3ezenv_`$y zbaBh?`{=uvdXX!W2t~SGchhS>;eJTiwS623MR{+12QHaG z!A~Wd+fz4iy~Ejw=~|%R`3>Kr4Cr%6N?pom6o4XYd8b|Fbtu@i{rpj!6N<*{58OM& zppd>RKcdhbib^>mmfzVx!F;m($;3p6?J>t%ygt|*qS1*<1%waGExz1`($B5@ zs@nhe6`b$e&U}H_Emn$OdEasU>YLJg@jO0wc7#wj5K2Nn37!o#fHGTh(h@TC*}G_2 zGzX$ju5z4q(GK~10lrP|*94&C$99k6_8OE|9Df>gg9^VlYZ}7}@}a6x^&R;!^qadK zZ!MU>-y@Xrjz6nN@%JI*&orY>kIsSD$vhVFsdZIDP)C+4)$(K{d>eIz$5z)KF=D^L zptLtH_DiPgjlY1r`9C(VUcJWl)<27ywb))U)qaBl$8E5WHzB9+i(ysb%Q);$qOF|f zz<&RvQR>s-A_BP#LA31sxHIVf zwat2=zID-Ks`v)#JXtO;?q8(Cyn`2?#XnU;uENWyh|W#OTj|Ri8AYA#iIpJFw}z0< zL`~n8e6@(COUXd8AQ*MR0x&u!#*T1q|0kwxCGPeyOt%_hjdR>a1k`51B)nLlsf z@4$TZO2%#Gvygx4O{8U0A>`&-EpwBefc%$%ZEK(YLhe(ee?iXwL4M@&VLp{z%oEJw z($Yd5W@6aPak6d5H~FggDGon>!Ad`0>2N6UVr3ZldkJ-)B&Mq!RZzgmWFHia>%G{W zHE>273fTM}x98+Q{)A7^>OItzT6Xu#bNoQve*U*4U*vFJPp&)YX@Wvq(~940GLSdC zp7bgYeGDQdE<{gmK|x=a`)%~$7mnYme=f#?exX3iHd+rTl$AA8uED(5Q)T)M`FLGU ze>0jlbrp);qQuf-UZT&(WN`ZdEtHzKd}Mp(4kcPKGka<1Croo`EvTwUpY2No%i5f@tuQA%QGfC7QNWtB1gTJgZ-@((>t-)P9Vzvixg7B zqyztJ_yn0ej{6p#5O0C)>bY zFzSuNB@c45Aa!9*^5$YHWLhUGCH#)ZdH;*7ru_$*-Ck0KQLK>pAk~^oKm}4`BxB=# ze}T+_w@U;kT_AO-aKi}SZ)QG6G1j3zJ}O@7&?=&Xy>f1J3^ZHKXIBWG06PJ&?dkX3aK;tE2_gTki{cQS$shiGW%<1CuYJS z&1hEJ{*D)9ed^9!?OTSl+?!E_x@REEY_r}f{~V<8&T7cEvOreSfM&krQ^-2QWae+y z59!KJkNRs>Lk_9>-!_^xNH?Zkd5JpUYzq-i)51td>s8GZYe|4?N83NAeGGB_uzUR@ zCn1yJ&#V4WBFL@dDL>1?02$x6a$nl=K&}X<^nGt1$hh%(_W5(XE-_y_CgP5|!$*?U zGa}xogO^k&y;T7PjAbg-ny7mx`NU@)M-2IfjX%OK{(-DtMoQWzF?an-TIWG07v$aY z^(wv+1^JcoMb<}RA@6OfMl|MH6@?zaE3+q17@x@a>az#LhOKi1z*$IKqH5bWZG+hN zK__47UxCELbI0BI4`KfduV>vlBra|_o2WZuJC%AF>Q-aJ#W?5qQO~zzA7|DxgX3QG zDU0@Df556r%TerSI9>PnC-zHVFs~A}YZI8P2VwhA#OzQEB!0WJruNYiV#lsk<^)JX zVv=z3?fUQ7|3uGlpA*N8z(@6b95?ggZQ~z^joAEM(vG^e?;XZY5AH$iIH#>uD(3Aa z7cHCCMPk3vOPQ`6oOkEk=e*B2-%rVV^tmn)LR=$2Izu>o! zSV0h$q$LQkDLHqC<60nbSJ9+H4*wPj&h>uig4mj*@xkxrki@v9&F77JwGHcl8>3{9 z_%hFkX3+~`i@sf#j9Y@FqpEs&)~t}&LKCc(8G!p;m;Q0m6G&1@3of6cggAP!(!Q^) zxV>qu@;*}#`_kaD3uhZ733^#F%Ns!Age`U3-C~Gip1WXSRSQW??KZw-z7VIaXyhzt z2T8Z~y`4AkbNIa@Ycum1lKc~71n+->B!-$Z&CMquu1;i&heIEdqu#S!Y`Xw)<4Xg@ zM*<<4I9|3bml@*jm9cJEXhHHR;+A>MR!GX$qx!fZ1@UXex3jT45c9X*_SK-*-b!_o74W~^m5b>-*tWAR0WB9 zw{DYSUR!$6-P5ZZypVYL!Yj!S?;!n90tl^WLK;nP$iSaBkS2Xp$ji4GQjbLK(T|#@={@nSO>xk&005eJHT(Z#@^zLID{^-YE@s;!u}^!8GAX{ zFFQuiFb|=N2ihS;UD*DGKenz9+o!y8+%s_8O8z2K5sr(DvGB~r{-@hQQ^&ABm$^TR z7u&Tqj@syf;0M{YM`D>WPLh}t9-5(`h&l4(d1427zo!lN#A*&3I5&}D+*1fA?&$vd>#K%oJrF=3|Kt2Y1cax&kfrYX0RDCbn{fs4 z5I)1k%XYyN!a4q^J=8!w7ex(``r-qKve$aObA22F$va-IjQ)d2XaBDUPl6!8baJoo z7ac@e^phwy=Rw4ioAKtmL=cp5-{4yp9mGz&eK{EK0YN-Do`;n2I(UXAneN{Sc%pSV zZn9YnVq#BF2R~wgXaj|)^H1CRJ)LD~>clkp7E7C<0A zJ8}@c3=Tvz;-r*1;@0HXv!kUo!M@FMnSZ7m``1gtZOOoaaBrG4q8Qt6fA2C}!S?KD zp2w|loYCyL%jdd9Z<&p`s2f-Pq7~qZfNpizX(-wt~9ns9_-_JPaw{r@g1IE z`@u0)y%cfl!+*$PBIm%qUG`1z&i}_5hF-FMjQuq`qTQ&IYTI+^SbBxCzOBtC(Chs|QpjS1{8IPRe@2M)y9T|FUUIN#*mVCDfJ5WAF_6Uzb) zhr2gU3p}d`J9JP+?w!M!1&5_uzy+g-|P@>zlgNxrP5|_IHL2@n;;eJpEIji-f9B^vlv?1 z?JjU&yk7La>cg{K4?j`D-3hQC`h2oNm>&r4KH6ofJq8Z6Y;o-EnPA@+>NY223IrU= zdxG_K;J{BgtYZ)$9-;0Uhk{A4Uo3Ka-HO|<=b0l$nE?)`?8c>;@pG68biQkB354pA zOB9C)!9h3qp*r2XcvH;q{m@_?a5(;8vpQc32(Bhmnrmo-gA^@;mRSLA=b~O+~jL)u;F313>o^a9!>%ZVg^6=Nfxngh#T@=wT zseAS>j`!hZ= zp(R|N`I_1;CKz>Gkeb%w$K{0z8UE$M7GX2+s$*PPf}K~{S>czy$i4%WfAwp_Z7CSGuy7*x4`?+ z!z5BQdSGZ>5WdUK3qJeqhoL|RsJxExb_Sx3Q{KJfh^z_tafr$=8fV~o?w2S=r~pG- z@#NG^QLrtfxCL+D$K`Dpd|!S7b|!cy^PFhoA$~y3N zV5mJ8dl49#I)gSO&w($2+M8$3(t*nT@a22@-C%z!<(=#&UDUh3f6IHK6l~iwN@7}x zfT6|M*Uzp8>@4-V%^1&v&%q-)Ue(`VuMqZyMCt+9nR`BY|7Zc&h&ow~duhP-WzIh? z3rW=HN6FqW-~oo(8=SG$6R0z1G#gH31gZq@!~jlK)cduO4z8hIn(K;Nc%>lNLS_6d z{}=eBMl;OHL_r+r5Nno3S*kjasr#AY_RoNQg}q| zKin+b1K#Nx3rQnKfk8NxA6KIe#&2RmlgbOCm&0t z>3~PF-PemvZQ%H#*wfd&gkU!x-eG5hK8QOq!dm@{VDF|BMcgV0c8CBXCUXbYqc)p` zfz0q|lD)#<>IV2Q-h34SB5=IH+ceNW27G4)_r>0Z16615bs75yU_X}Tc=}E__(cV# z>?4=(QCVIt$II(*+?MHN-4AN8XHCgE@4NuMPq+74%+G;+%v?@oc;ol2AGNB4o@tec%jP9xZ7N#*(DdwM^X%Qdnk_NqbkpC#%Xczmw&}S5gH2ABTIh^`@|v8a9FUvHyX%_HlC`w%7Sxa zC;5*Xe&SlRdaCGK*i9W}D z2+}Y5{Yjb>Tz2W3IbKM^W4FMzpzN~{^lxBJc5oe{t~o`J<9n3o@wqy8mJ|r({m~Zx z0R2Z)(_h4N-(y|9n}A?6gj`8&q1CFzx~EM?-DI$CIQ!BuK5X}Stovaaf)37%>&~KX z|Jv~Fgj;VQdcv4;IvamC@ZEm2?}j;l$7p$y=BjbNoqMV}n6GtZmtw>`5$iZ+%V%t` zjy+L+{r~gzeO^bNVbH(^lY&Z%FiCX%&3O*xiv)}uKe^W1EM5KiPL)9&8YN$g^*G5$C(czqoF)f&M`qWj}}CxZEGpc`w}{#82t~j`X68EpkGIGK0BZd{Xd0#U6k4oOiurc`e8UkNe%V}H|9e0*NvXB`Vk1d zrXn(P8GlzFXL>3euYi6XTQ_&jE(nqM{!%UC7DUf8@lHuUMIQ%y!M6?$^zjhe9L}SM zU^=PiVK%f7rM%i@ioC$+|FW*R%WXiYOzKWYZY9K?^llvdYXHGi=TaXkqK`(YbIYn z&E$Ys?u@jH1Yr=&>f2Vi$_yc<&UYSvcn>io))kA4xLmc5D}(}%=XWdmj&x?L z@&o4~Dl(;G%S#VpZom8$!#s#Sls5#wU9Ul`)Qlq4Q3nW?DsJl@b%Ky^srm05sStCe z;AMMVCWN}sh%1l1f)H1dSz5)j5L}ks^rXlQqUM-ORcIeWOxL;BzY6hp-M=nN+ncEn z>%MtPz?BPv{d!u%3~@irULTFKw}hBz=~G-cJ0P@QAZk*V079x`q7$N-AVhP7kmvjw zM29T;GQAywSbZtoN;fVD8}+|k{wxq;7w);}-NWORz@Scp825j&i%94CC4jgNrMKtU z-$KZW?zd95EeIzf9xncxgwIL7P$z8shVT;WnZR*V2vfTx_nk`)A{ef~g8oa0zOx2(dRR~_V$lR7exLxc%b->2;!AEE39>2Koqw^ zCY`MbM0lNS4jzq%gr<#Z%SV?W`JItaAyXwp<#?TWL9`7?vOJC?U5_B{^fUcL6Bmft z@OtFDU=Q*9ZF8p=^C7AF6ho{@6D0r0Nu=h-=PLwU5;LmR$Oqt%^<%NXx}v7sX7o{B z`M^WfdmHP5@)O7kv5xXjMQ8-JcR5@cybST@iHtSBpf3@FLVS@2p8Vrqm%U0k)_Jl> zTtzZWl5&JCfiKdENnEZqn`$64c>EB=DMP9hh>fVE)c16=*^Ams?w zvB!Dg_hrJ>J&|h^<;WXwbnf?-!{rWLe?CEo?M8>r%dVqe_|v09b@Gr@H%&lT{}Gbc zX&h$w)Y0F|X6dZG2PyL@mNxy$=ojuTv6M1GAFmZrzko7w39`$i5A&d}c)-*%UlM)9 zg4up-o)9l2+&mbD&!d{U7x|}aA$fZ`VvML55|7%^`XPrZWy!GX`Lk+>zf7^k|KvU- zh>HyI$sm_tb7z1cxf>G62D)@RCLlp<%=zsg`mJwN-mv0A-oVqmd(})8kV2?>F+86h z5|4l8d>f|@DeG6QHOZtQUc~jE=-F40Aio)%?OG4Xe+wit(mp~Wb>SWQX53yGruSWg zwh*tz!hQXU3?vQZH2JalL&}NA$6F(6Adz?EPP}6S@&WD(bSxY|{7n`I)ti)%aIfym zhx!gkp(08fsn)v=Ag{^j*3-egWbgeMgQ(c0kg~6^Y((X-JW;JQY3v9{s(? zpQd@>djtMKVFSXW5O2&{X|kCG2|=Dg$7j*cFYv@m=syQYl&}bI8aodOc6$XYg-hYtH%h%J(#sVq1gbEyw(a&6cIEGC58TwT(7v@-GKzs`OfAzov3Gc1K7OI{> z%HvbM1C*U1y#3LrxN^!9OeG7Cs9avn*{riE0kfsLB(hmd4gUG%Tc z71Ed&u3O!rh4{ZAgADA7GJzdroqr!v+32fy#K zPfqTQh(APbh!NN4CFHT_JkJm1qs6+x3yVkbIc6NurzB0}4xMaXx44Ws>17gsOyjOW zdhFM^Jh3F?EvOjn2Sww2jZgK0T#-AZJ;$dfjdkM_Yku#LPsAN@HjEVOm}}2A_ThXE z-yH3wu#VC8pOOyNW%zu%as}H(zXX1cMs5hLL(5DT%isn^jSM#_$SqL!LVu ze|(Pf{fhA6Rm1sezTbU*fE>%VuB>cD4g3n>H*>1#D zGwveSq+Eu_o&($2)8;Jkb3L8?YWYVe@`)s@e#_s4?9=-nh%9maY9&wJJbVLk^s`zi ztUQq~ax&oBKJrge)UMMnMj@Yw@vhX#-;hyl&5#jn20+7+L z!J_PB4C(1*R^4}RLfREyUdhw=9xW_s``C6pWQ(*`%4_i=UxfSO>Y+-=v3vLH2yZ&1 zU2v1zx>^Y76}Dr&T1?0%x)|VeN*6Moz4JJ&HV5g2b(Ga3c$_NRDV96(L1xx}gSO$` z$S2}^KP>2nd=Zf|o=0y%PFO_`2bC72NnY#bl=p@7o^VmdmI26CShv$rxPyEVjd5Xj z8Axwkf4I@l18H7foJF%d_`Wd9jb?#F_PRD#r*H1o3GyA=A z$$J9Q{}BsCPsc#E%kHy#*F%vnLh+&R1|g)+OLHoDuR+>}zYnh-3Pe89@5?9FWgzFM zCI8tI_;xIc%oyu2sxYPT~p)YkQHHf@gNQ$*JCScQH%o8g(qJr`1l}S zgrc~-odS6wdAYNrk06W2pk(%-3HPJQo2#ECAd|TKqasLnFXE}f5u6U$ z-&9hJ6s{njC_3JZK@ai=Mui`VBY&tQfhS*975PN`K|<{@kmc-oq^9CIa+Ie3l;Qc6 z_ue34@Eg9zuQ@O8tXBj%53C0VFFZj$(WU3tovn~hWMINsD24CGSqcqTm!Pn$182L!DfnQ^SS5h7@e?H4mtf#kvV$);4jRPweUrW%Ki@Lo1>Y}+Q7Qog?#=ealVq*w1ubx zuvN71#p^+yv%YYl+&s3MzIoJ*?^9bkZ`Jmq9^;`Mecp%P$UOv8IuAkQmJQv!tWk%& z#nH)WV_d)H9{&HxkVn?r?30qEfOWiDE;GwmCz3}Y`~urAa*pBe@SKilb#9&l?JW&a?jtw?#r?Im)|MhBA*kVk0u-Jz}-xn(Zf zw24zr$kFQNN>MdNz8QZJZGhqh3iMDgQ_MXXKmR zqfU%3LcSSwt86>+44te*2xyv-Z{{p~EQ%6xU$2*mqdqj}-BEv=9n?Fxx{pSu6G6W3 zvGOkw&V>8L-@J_+{Y1I% zRFoVUe?!jCSs(jf!^lTuKG~z>hkV4uUowC?l~gTmBga-KkYD{s9GL|ptbsGmb^-F0FWggaL_J)9+wh2aBow-SdXw*(j=I!4oWz}a$Tw?<%uC9E65ju= zU+7OqzF9Lyc>PAc8N&q;Z`8kySd&=grX$~sdahm?_w&0ied(`)p~Rc+PFRpC@)19s zk3pVck#+&a{NE|$Bf51(W^f|kEUWh;Zzl51a;@(tbRw6OENAM6J@T1f-#*!yiTb)j zRw*C5pzt-lN<#WgL#wy4dQ&=zs?ziVY{MLwl1D$Yc!|Fy^bTF z`SID;G|1o)oMDe>)uqkpqA}_wr=NNn`a$6+#oza# zr=XB*t(zcF6#1$Pt=~g%zgP!<>+QBeK69wET>C5(&W&->S;ixu`EUYUSVz99aVkY8 z@>-9lf3*v7Lq0Q|TH>Ax@>O-yXk>zsuNpSaGSrKF)xPo%Qyj==4jNevx`KRWu2<=o zkyE;z%Il?WiF{_8Vcx$Fk*`{>q4yD>kmo>ZL-r2xnf2eioQXlcYJKoadM-R4ruVsj zTOeO`XvLym5(<;YHJ;pvKtA(eIkC`fC_1I!LO;3<#W}b1BhPUlUse8ZZW|jEqP!wv z3;EP9|8816bbz9xhczP<1(C1HCD2!h-=FSDf3_xH?*WPjvkzgpkjCzm}r{b)u>iN|V7M$X9*bQ%!sx_v5g` z87(}oWzy7rP@z!#@x%mh21D_c8>d`v7D0(GkIspm_fYU+R_Mz^)RT!WzND#Ah2lVS zm%raDkgpnd`IIyd6#i5vs#KnVBDQP`7V<#kGdJ5mp(;cUHHF`QokYl2WhmlK3Pk-j zEvR(eM*YpO;AGlaD0WbO%k=LJp4Wx4ep*kEFMUVkfi7|jM-5Wz3SS^!wXy3*J1O#+ zIr-?gF^^?>gJZJ_b5Np_{V8gk&_`g+A3JaTxX1Yh3wWSDqrDS@M^#AoA{+ zc-(pjjghaa?eX>j`Wn3bey?~8qEGekje4Ma8es*W1VBh^s+A$ zuNeLP_T~bVif^SA`y*Go|J1j;WDMAT^UH0u*I4%@{^KF!r4tlQeo}vk^SSUIc{+r3 zg$1TpY;e9%4I}j-tZR`})_aEIo_Ffl&taX6wBl$D);U}a6w$!;*y)@ce9mS1 zgt~o!+0vwL%ul#sNcR8h-+&$2X(sf^oZ(fYQ})3+5tOB(ZhzH_f$8U2obSV{FlQmG zBOiNNY>Vw|53bb`q26|(Iri8-ln_ZvRi>kVL8|}TqH6_|3=*G^S1y1u&W9C02=F@4 zE~?B#kK@+X$`_-6i{C!#UG;B4S7_ajrM)}K*$xtdg z4QCCIr|UHhtRqG-;5%Z3}pxqtUf}% zyZOAVrU9N8{Z)S$-=QBM<@5u*UoKT*$m3Z>?)q3lX#Z^j%!eRnWj$;SMbG)X+m4Gv z@lNge)mx)bD*sn`t-S;J?&f~Kke64y)y)y@bu}t%b}+;CZ+o`XlPk zMJW2bsg(4T6H3n96X&7E&)05s?V7$O>NWkv&SQKa(AEoKi~cOsV#Ek@XPjfWr$;5Ngm<7-S5a_=VxI| z97cZdV`I7*YW&{VK0=~$4UZ3ny>EsLu}~VS-1X%<>Zoa*g!TQ(tkA93%cCB$dpIn2>>bAcj-(AX=E7=}OkFXNDU1G<4h|}vKRp@WBH0D3-)d}VH zMpACIqflJKSh5v`eh?kW^-pH#XE3M#o^0y_rTb?B$bk~|-E1k=O}HMi)B;3pu~2r* ztoOD$KjxZ|Mw4hwq3??Fhdl)+RJJ>&)+UTF9m70JZ6%D&)Jnn|qF-k3KRlV)4)k%w;(u;q8n1b4{}S9!Yo12^sLD(LMp? zhRO=Jo0{-CQ||KS&~?n0S(~KULSKkmY*=Fh=JljhblA}+VBPtP!l^jk&FPkdA^MAi z9-V&Z>Vos#jYvqt{!}qppDztq_w1i02j)8Y9Tu#|`}R_y>jGPQ(l~B!oX=bg>j-E2 z@HuU{VNii4=5&;~^<4Z#f%9DzP-1Xh#QFYx+Ne~m7Fkmi)ZcC(?OCH#D^)$0BHISFN2XU#r8 zN8erg@aZX;Rm_($Gbep9f%<%wvJPfEp057VB)W`wE}nLUy^iv@+|5uYW6UEl4v5Tr zjK`5jcGJmK^wo$~IB4bTV?I?N&ph2p%%{3>c|bl8%FTaWuK9EhDxQ4hb&tW^9g*{2 zPv2t3e3=F&)jM^VPZi9k+1&=^X1vPx)DG}EPjf#UbNfmqlOA~(Hef!LP^(qLLntp| zR@e~2?XabwRqw;^hj5?kfif$YFO&a}iw^fwkc7wS`bo^Es@O~a`4#hJ{G-z%2cgV= zM~3eK=D{eN-dWdrjd>^KPiWtbV?Nb{8*w&ZzKq1p-DM4^NE#GYRP?)M&wbLFGJCy!Jv-$GM?|ba&=KRe#F9sV-fSI*y4{ow!nOumWK+B zzL-z-G2~a`JG>9SEv>yU59PQ1MOsICK!xx}=D*y5=nwU3n~q$Ea=Kk5k*9r_FH<#h z_BtMK?h0MUMs+ZsidgX6cg$tuKeJ2qdJ!sr$(3DQlYp{Yi4h#gcc`HBYTu&`fr{z> z95(N}VZMw}!+BGjuiBC{y^a7XXt`Gd@I7!v##|5AuOCpgzEySRb2#Rk#)-`d;CXLm z9#Xft1m*WA4tO0gKPxMfzvQnt=2J=3eJ~Wmd>OW0C_W7pZ@2!o#bN%{vS5|b3CzWs zyZ7kLNA%;C4;dQ%jfC3S$90N1__xevcWN#l^JS*}N^UV=zD#t;pGqCfr%J1nQ9XtE zGDljB@7iO&%w{IB#w*OH%1x125ypI~LgI(Wf2%c4y*y0t67#9@RmSPjm;R#v!IwGo zyT{eO`QU&#K)T~TlTBULIfkHVu_eh(i?FZejhW!!9Q14>wOPF*=JmRC={1`fp)A+W$B@?|7>IKaNvI z8HJ3Ll&y%Y%zPpuD>z?QP`O2y#1k%8H5)@4k9jSo2+eduLnPFTpH6AxZ?oVggT`qgb#|(J0eDW0Z zYfr~HABXJ=?pbdTT7Y~^7VA0>$P+U884y!g2mPl1z4Eb#zS7`T+Q}T4FKB2tS&a?y z?NXlXKJLa9W(OYamcaR-armC1(Q{lCk;%_=>lNhNl|&Pk)}g8f zLB8F=yzaQOkhj==UFj+GnTNJ0i$yy^zMX0_mv1iIPm<@X{=o6LeD3eHr*ItN8II4` zJ%xO`+cL6(kb~=VY&FFM?q|2IqEMT9Tv;yvUt${Ux0tJUD8@H&RdmFGZ`z@_vbc!1 zl*}UIL{-Xz>5C2KpG`&6n^6m73 zb!pOYb<#)t5k5y&_$u6?6}budc5GHI_hJ7Ma8cX?3erz~e-{H>**(~*OACF+?WcJw zgs35BZ)~@3O&Ibqf5kx(A>`XhNQ*c@fA90#O8S@K{$BLmc7G}p_ydZ{FL{FRU|dR5 zMF{rG#J7qQiO}D@Z0=#>{ufvB6dzY6e8iOt^3A5drJ#TR2fg9`HpsWDY96P23;CD> zzr8}0p-;N`@ys&h_xYQv$A1E!g7{bC`XC+1x0B&y99V?@f8W>rgiT!e^X=pxt`s<) zdxBLJp^x6^+vHpv_%}Se&TpDPuG6niK{B7=z84XF_n$4~*BP5RGXJ`QtEaDiKX}6( zSO1k#lidO@z)vybfDK_>9WdYXR2lpwFXWj{ALs|K)YsMg6mIZYofs^5a2oP42Z!fr zpbxpZd|hB2Vi5W=a+74RF#3eWA}!Bw{*zw6dITauy_Lbc4sxe+mnF@D139;7U{&G zH1O6~GP7mF_sew|X9BJ@O+Y@Tjf=%k9rzrw7_F@bxw`}XULS{;A>S@k-a2^=^6jK= ze{hBU&rTGi58n@Y+Vo;fGlsZ&W7lA>urcJ^p3jb{guLWl%ICD?)KK?O-VXktYOR84 zZMeRwH^wu+ewKqe4qLO%4H);=oqG#Dh9d%}nCXUKKKr_T7N)p*Gf;Q0y*AW6KW?FU z5$1EOy{ID&^L;zX(CdJ!wYduA_g#m&^KbWR!SNLcGQ0l|atgI(lvR)hIMGBb!6;I$QoaqTtOVocbVWFH-`Zm%$e6WXP{Q zy3V`dCkUV4sCIV>ws7^o02{h;B{=_vTrcy6K)x=6Mj?S0@^xJ*c6Rb`)q4}qOPjyI z!{UAZ+j%-n5ZRo_6jj57*V}K6a^b$mS*HA=yaHG2Pb+J!DuV~Yr@QKzD<%kk-4iUa zhO6~{bMf^Z$5jH+H}$gXaMi~}EuvgETy=r=9M$?OTpjU( zg^~xZJ3)p-HZ$=57=>S;+x`!(=fKqaCRuP@E}bUpjK$T$YJ5p#pE1E>GHBBZ_Di`* zu+tr3$ieZhGYSKa$K=%Ymk_Y=?K@f`4eZKQ4gzAFh6!e%1Pfd zP>U&#@?QgA&3+fb(vO(1_dNaR>I+=`?mw@zi{K{`Q|LHVM8w1|9@R3s=W)&P>>r`P zjn$mBdSyd*5#GnTv+6d$yCs@*Y#MdkpnMQ#M^hu ze;{`^Vs+&6=_y?EgKAV>6!PT6Jx(?0rr=r{XXiqyN$?1rxg}FEhim-EV&kc@=xZS5bE|vb;P!E4lhFsTA^ccbT5kFXL)AOAVP=xE?m!#SV6KV8Xgj z8ddC1Ow^*@72yC6Nww*Zdvak=cYdW?1wQA5J&=yxO@%t6Z~M-GcR_RdS7ZlxqQb6* zkXM1%#clp*e;$0!_{(=D>Faq+*r0CBGB^kGC25^uh=%$4?7WiUbDLXH{hl-lOb91? zKDGz^N9!HsdfaoQHoGH!e~Bz=TbfiI3phB5Ie( zJ!YN2L_+Rj_U98&XQ7k%VFVK*sF#ruR2RdqNQtVmSMqPDH|auUg?{2>X{( zzml^Nd}!2N)mNI0FwwMcCmo%{#MTRX6V>oJ#LwL?A{?%>RO1P`03A%+o4o%lHEh4J zR~DzZJ|-ldXTO|!8CNIxL@sHWV*=x`+SDm-OgtRW+OG?KItPZculDj|;)^+M4~9{R<{C@UqktAIC(iyZQFe*Gk9@U%PHNjH`*V7A?ob;C?W$?XyUR ziL#60IXiNg7^@Pb`NkR(XWo8a0RyO!B&pe~-h5aj_wX|@>4ZKtz4GMt^BDM?1?0y69BK>%k!rewpyhL3R z(sUV)Pmp7YKlryCQvXUhJ;OD@7UuR<;JJMIP$DtL9@o^g6(;|H^W?+W)$kNW@K{Qn zcU^=3Bb17iqJ=$ijhDKln#6y&X3y|{hbh5V7jMt!NDb>b)PGc8%f_{#n-iZJC2;M> zE3{c+BH;6Rm|r9co~xrvO7G6?;98llS2Cu>aV`0K+Gw&*xK^hq+d+dJ*R%u_RNp>~ z>ui1v5lTD2pJm3dp5KV;3u?$u9@~Q(c>Yu>#FXNCjXvSI3T0gD{ix57igtSZB}Vg4h zcz6w|P>y$8z+<-Dd;dq~W%&Kr6({|0xUO}c3G)1gad{tI>VvR;SL2Od1Rji9nlLT! zEv`}-eVcvf-bc_T~+?&+H6y$F6ZNuA6ya9{JbcWaY??Xy>D z7*^f~{=#~jr{#>8XxVEm#SZVUMFXR!)*pkPG?+tB1@2Etb`gcHT5x>@{-c`^0S{}s zdhnBFxQ?v9aG$Wign9P`A)43VH|($;xt@;+-3of=AH((xTaq8X@Cy8=VTa$4gWs+8 zkybl=pFy;utD%AKjcdZScUS&7Vcn6DPZEP&5<`eakz$%T~ZGmX3d-TOiUm2z+bw4+AQ4{*9wY=@4J$R z>y$nJy%+^wYWc>zrWm}>HR`7_Z}mW24E6>Am)yOfHoA3;JK0 z*kwo5x}jb`i^tm<>h@`mJp|8o6Q!I&tqjcPevnFc7M6$f#m+39E8Ql3xS9)IdlkBE{;K+s^4*{w`X7RfwAQ|7+{!dgC?J{d&yF`V-b$JN)dN3C#D}`t1Ql zn6J&oB=-=ESGAv{;%?tby)!zzj~4nWl@71PJwI2vCYC7;-f?G2jYZjN=&Sr^eBOli zd;3n>-Q3`nAn-;XJ2^fJ{Cj@&fePhy3k3K|1ASwN==uw|6-!T^{>ak5>fOL7y4Z zDdCeBqOeo9Mp;FFdi%~LMb+%IR_y=$#mC=VJ?#bm-5&CL4Es-5&%hG?pAR^!H#)nK z*1lsIv45MN8r_OK^sU)#KF)H+PNRKIQ%tYgcTqxrOdIss{z%~2 zo0+3nH$TF6t6)ENHa^Zo+u4Bwy?s3@`HyoN84i$GZxOs>q*(l~n#lgv2|E+!iFcttD8R?EE&}?p z_k>`TITly71e^8>b*G#YRq8Aa_aVTbm=&ysV0U4p*D*QfqS+Q92OMVNN17h@O7 z562YZm#}ld*_eN8#P+|*1ipQLlyMO4m0q^T2hJrNXsxq~aE5+3sibv1N$3N8$Wy>7 z(*EyZ553By3U)pGw|R1M5C@t|b~VHQVXhFPZCH^q4P=ER>==kZQ6I59xK=xFBS*w5`Ns@wM96rB1!sy8c%gtUoQ;_zXBQNw>ucf3&*1>u+HVNnDpwsYVKcuPF_Jqd@e{`Y3!zAbnHxHKmQJ)mD&d10`x6o>!( zXLkrZZ*iG}ee@fbpkF%X&7S*xz`wt6{rh1UN05(MTy9+jPr!*%Ypr(Zm(JatX$ipL ze@oMO?^WYC!qUz)@b*MxY+jw9k^@h`??*0@7C3^_?@uh`1;!Oyzc`@+^G3ZKS+z#X`UIRV$Mx zoH#;emu_Qp9>=q1U%Z+wf+Mg0zV0~Y2A+T%>Q!^-|8D=JA;1Nmfc2{^zaAJvzx3A| zH1w=EBE)leY>EQMHyhu%tMwH6rS-(D85wc>Xj?lgHpP*dp$@0%!f?E)r$Qa)B=k$8 z(d7f9IFc*blv&{scmm38&rBYGe(CT=9tKaGF!lM=$QCE`OEVu9j+z6$`a|gNC12>5 zemm6oTmeVz3T|D-Uzp@HSpa@Ofqju-^21Ukt4P)uw0pyu8;-Ro6{oapT}tt&41K8=fPtk zWtJWH2)r=CE;5dmu-=Q$N)sEfT+@d;(ntMs$EzA?lvo*|K2pV?24o zl?^#>b29-P4&c>Dky2LuM-El_pg)wUT6KRN(mdVn4Sb@9GA{z_l6vAnRh5do>{b|zf zR1W!rY4E~)o3f`}!bugWW4~2D;{R`?vJAN(o%Tizc07;N01yudG0JIeR#5acA%2J3YGVZ=#IQ63K5aQrqjUW)iQ zfFGlOQC0UecwtsPkhgZ?r0s~XbLBseX2Fj!WHn&5?*qKH1E0DcTwf}9q3Y?e7`H_1%EkCEK&OMC!+3}@O?(0^M{ zrEV$^3VEG_A(@NSQ{czY>AOG<9PYcksZY+n;OkP=lrc>J-_b`E>kq({Dz&)lvMuAR zJKa6gN0VT=*is-*1uSpnl+y*z(4E43S|Mi`k2!YA82IH*%elR0=V857hMR_F;5|}t zX=E*c<+hSy*WmX~t|X~&cNnMS)MN)Pl=-L-IXt(?>T=SL*o^@XnB~tcEAalTaGKq$KKPK%a2gEn z0}q(V1?R&};6ox7wNg}r4@ttsnoJ8kVEeeK?S#RHd$Yn2U^q2TYc)kDLd5NNs;N{=odYXRbw`1`a*cW~+w_ z_{kFm9=C|_dgFf-{djZ0homm_>eXp<-B&lSt;WShX!Fk-;lXtM)3=0YyGPc5RU{8SO|C5FJ+vy;PKaS z-+$l%<2&-5ZyaZzR2|IhvIHN}`P(`#1aV$Ixw%JQ9r%iVtp#>=f(MM*=9r%r&bIy# z=iU#;!KXm!!jCkZopP|k;^rUlAt}qBnPSHI;%)Xbp}%l0^~G!Z=^p?enKK-$2mG}4 z?=x}Y2EaK76=@u#!8y)<&u@3_$Jw8V5_`CPaDh#>1GRw$_>itYo?ZeTQ=vq=#SYFt z+2(tTsRF=>#_Bw|3^|NPxH#UoVelb+)#3g09z0;Owsm{N!G~1Asy;~t9x&CD=8BWJ z;AT$lpSTL}fVGTjYyodOn~^-kdk%a^w|^A2JA((T#l`tq8hF4WziNsv;o=A~YptTa zz+;79U|$AaE$63W#b4lS8I1Y2b`FB~aoeW!g#>u+=0<716~Xe+o`VYDU1LykX?HjZ z&U?J>@iLz$m?Y!Bes}u!+6mB z1`)_j&)2(31K&p#FqOX1^EbfYeS9~*&j9>)2V>RM`N8{Guo5>2-Z{n{MZ;X+#pj$> zr8PxxVG(2U{*BYPfW_#_D;eNrU$Y0F9@_{0yEqQ(>R#|Z*1FS}!s{K{O*m+J7UzGy z{BHE`26!I}h8t3K!GG8BkP+<%?_>Pl4Z$|>-(^3#6Y?4tmb`Z;*?vm$-+fDGx(WU} zw&ZIf!1p%19gTc|z<(EY=Vt?ObQ4)FQln`&e{D+E$I}YDkEr0+vDdiZ1b2L$MkV;~ z9(``3gyYa>N3D6d0sMDuN$XB(Lq!Uyo*=^eV` z`WY9Dq};f82z<338%fUZ_5)Yh(oui53V0*$REsI_-`%Ut`EMWuc(C^6&T36uB=gs@ z_cak0zA!doFbl@z_jW|KPBQ{e6--B$UWUQ@STh2gXen1_zY%zwOTW#p1*QV$>KXI> z=oK~a-(9}*xmN_dkC(NWzL10Wk+toO);7t1_euGx7H|x@Ll4n!T=MSj6$&5leL8V@ zy?O>5<#ufM4<#4yn*MAZ;Ln8RI?uk`G=k++Vef7*!}!Q?mlp6?z8efIya*mor;xW& z7JMYnZ|T#av*0Jysk~OR3(K?b>Q4g~>7-vm9$yIK$0eBUUg46FjO@v9;5MDLPiEx; zr@9kVH$cV-eo`8zW$<8>j7Y_uw@!uizW9701CQv%s)u}KM{voQ7$t{-1uk~^R31}( z1$gQg9CC@Y;5!Yb-v4C|Jik_Nyk~%Kbz!wl=7;T9dm+EA5{*m7t+JyxfRFV!nA%yc zOY;0q9C*bFzEfXUrCIoU-}mVmWPs1r?S5War5^ZB!9epl0GCWpy5Zmah;jrtRl6A9=fKSdjt?}b0`F~a1k_)Se8l4IasovoaX{sGRBc8@*96pXxg6r$q=F4BvYXOA~n3n-UCkMP)`3H2IntO0JQR0P6L%}{gVWsm&GLb( zdAVN6H9w8Zw1vfXMAO0Z+d9|A3B2B}iYpy>WJ|*oIU?GkaCPc;+3x+|!}c&(Xb8*3 z;Q5_u2ft2bpnHRPCU60xCVljeDu63uRqxeV2H$D!)JwrKlIOS5=FS>?uiQ8ks7A`A zQY&lu4&URydM5VudjojeAEo)ajbQLw2S43?gUkCIDAKjR09P6P>Tc=@!u%7$!#Fjs-*SCkQyabkSI-ScXhxJx@j_nVD zJK(9-?Bsl&4ck@5pn7E-I6_ww#hNmo3#cnm0UA~d2_tN6oCJ9SxEh? zaSFyQCw~3)18@8L`Evgi@LTgr-E8Z@;B}9_tPC8Pj=#1u)mNDJ4~wq|_^I6#TLmgE z!~QJOjH<~4ueU_M!fqV(xswh& zW&8P_^apUf_HZOQz;;yBG$gJYfY-g?A{!(4wF8@os$1~)zm@KnnXtlTS@piwi*SCq z@5f(K9O3fDM2)BRGrRD7*QP(O zEgzoa$J29onnJF}bq1w6U&xcn^9v6nhuj?P$7?Yz&q;o30!5JuD$w{c}rtk_yYOoHD5e{%K#${$O)X82|9~(aBL5Uoo?+J%b_7;NgGq z!LVMVtRFQKu9$aYeijP63T3_ei1!pMXS}4n4gBl8bXO%e3$CL2Hks0EPRcX*Y556w zfs+s13mB&$x4)s3`Bc?JP#p1`LH zQN@(?mEnp-Wu*$uJ-CYcGvR042r18?#kUH$nT0D(i;BPp(T!X7 zf-XU|!MI|HCO1&L8*)6xr`r_EfUCWay$kvwAw>|&0(uIWwJjZ z$0JB=PaSYiVAm3%bi!2(?|RA7fgfWwcaIO|!4*Fzb)C-20k1Gdu(`nwc?Jc#0gM8; zO3B4_3G!zu_cD|TDR2XqF?QifCGf5%?lF`Vs^W@&hC8AsJb>d7@AIVu-cDVNimgTl zSDDgLW;3Wmo&j6#jXS4+Zy*chQU$(HW{;dOC2(O(Ny}On@_`E@m|3F*;5A<|Zfd~% z@s{hck=3~J=F8g|Z^Ceu6)o@z<>P9BrXIx) zW4L;ZW6kb+JFa>oaka~L4stvOhG!4zLY~3NfHyh)xXM^K#fTE}{peTCUK_#lqniSc z_~iOAF{#zBkLfDp86?@$>p=b%4U2NOC~(P2s}12k*^pdct{NL3`R(1KIguY*Tn zxz~owCE!!2!b6B0z*jB8BPX$5$ftQ_mbY*R6KIdny)l6N7wZ1oUIsC+T=x5jEIj8u zrP{}sMFHcQJW}9Wtp57m`;_1@;6|1|dgW7*a+@-reItYXn&G3tDZpuc=}*321=}n1 zi8Ds!EUw-+hh;RlK+gw|U$g(@LEv{Fw<&N}qyX}3WDXEC-au}X`Q?4*wMh9j zvt#drAisvO{B@@+@H^`*T#CR)Xx>rTd@7F#y!mRL9RawSf0b@RU=?_wtFZ@^^B}(_ z@14_K*bdGF@xGf3m>@(r!p)3;f6E#3+XEcS`C)GVPI6qW9^`fZs5&Mbxh|fn+X4K~ zrlo>Da68hC?p3|>klW;Ui^H=K@@vke`tic^^9RRYo`vr*tE1D$Cua>XLC4@*&^Vk& zaV1hGV&VAQjU>h|_ya#NJxwel|qG#zcig3+7m#Y1>Z!ys|puXoaJck_dyt>0=g^5RB9kgr%9zHm>yN z`ayopW8VY+oq)WX^>Dtl3Q}%U!RsnB$ZeXSN!K1B<=4zc3u!=p4f8>-sXR^cd{tGPwy?4|q=?4kmjul52o7YP(ji33*%^eM^6$fy)>?>=F>jgb7u#UeAjLFwu~1p=1=c zbG)Ez*~SC-MMv8+WHXr19BEf(4$rIg!c#}uHZkOtnI_*4!-RUS{wCcD*bkx}Ouq?` zSH^Kdg~4&j%zh@!7~sOADCLZI!Xg49%G59Uzk15Z7o{Oh6o z3gnepoqBns9&-8~aAxvXL0(x=jJgGEPp!oJ+qXI(uWV+_8*(p*jCzzae869duXv@r z1x^M0+a0>okkc1wrLJ}b6T1$|@yo;cd7y#MtymNjD}IL!Zh8SdL7riI4k1p z0`(bF?|LGeAg3=m=EekYVfXqdCOUw(^0u?EFJOVZGWEYKyZ3Po|Cc8hExd5;kHD6{ znrpyY93^+gHzB7lDCGW&N4PeuBj6UX1lL}jIpVBf4|!$u8E(HI&uMkLiiSBGa{8pC zwHcI2d1cS&9lRi?&zrI&Vjl9!X6UJ2dO%L!Nbp?5LsDLu^s!-1;J)aKo|=1;a{5#z zdAuN}@AnNE!V^+nnd^x466BTHNG$GLg7+Wl1%YJX0cI=cGWJ?w$g>?V*$e!{Q#%)~ zD#%}>`@KKd0nYQ;fc3eL|6p9j{ExjPtfv>kbJr3R=aBBTyTGM!8hv5*g5RHR$pwBO zEf;R$^9NpH_BY{y^dT6pAGvY?=BJ;f-MW&3A)oTy5TPE{d->W3I5J|#5x3x7Ls*`n z9{Ullzqz4AHaf_Md=_OCwA2mxRn$?h*MJ9EXn*L`TmbxCWyG``4IC$vUOFOhF$df= zKl1{Y^f^(STLNCUQ|`F>s3`CbSLZqyK48eFRHo`lCgsh>sNUv=@*>9{Z?G1 zDLo53h-UW_N_9+p<$0r_6z*HcuUULyg8fDjUt5+9{GPB+#T$CyuI2(cM`(wE%cwkA zX~P6uk^SV(rEic=scUj74Elq_Rr{_e@!}dbiT&nJ;XIO07q9Gw^M+zOBq}ls^6vWl zR$PD|qOVfP-vStT{D&Ktw_sa$s+? zFIR-X@8>1WK0CquQ`_!agK)lTMn69N9oIbECNwKG!+m#{n!*C|YF#dQ2lZ1x&gANW zP{})xPkHT?q(?sFQ!4KN2|Q5kxebA|2{qsqi4&on!;tT~Pk`*}UdX2u3rKS)f?U@~ z8m;G%kWZ=4chLlLiyt$sl?dlUp6fT+y>}i!KBZ($le948xE_+*MUl8pWXZa>t5DB(JAWo&yn2HSlrhB1|yfNS0h z7qyK5f7Z^!C)5e~jKo^VTU~5t1;W_@PCug87U?TS6oXy zCwcLRG%2rl&uu0N$mb35V{z*x?o?@9-3{)G2m=M{@)MNG=s zT?u6bPW@j?8!H??$kAP(8-pC(=o6jBClGKrH53%12soVUSBs62zfWJunMeWT7{=sR z>Yao9>bHMJ`uu{reL9-;s>sQ0^mFvB15np|*GpI*IfgFLu*sf<@y;|Y0XwL(*HbJr zh51%uDzyiYzb|X0rltnWmv{5S4_@Tga5rd$KLhGi{qqeokdr%)=-F6tnD3Y1ldq4U z&cyMV)Ge5AJ963+whuU*tFO)>;BefB<=0`pN*V$cyl!}NbeNa}@@tg$&Q#8W`PyuH z!&cdAs1sTfJJwpf`3H(lv)oTcjQA;%cDPE}PH_hhUSeb0iN=~=%A4a6bfaO^A^gpq&f(DH=?9LO=XnN}#_J@R|{ zqxEYI{2jpI81w2OCtt0X8!^eqKR9mmif%S?OpG{Q)S`f#{wr8mZC^#sY!`c(BqUJ4 zzR9R>RPefSvRSU33COW*(qOnQ9Qh3t5fal(kTa9?OTu*-FDRyuCcj5cFJ(-N)J2eg%bq!H-6`a_ z@|$T>1h(&qt!>Uk405iqV|yG;g#vsggDm1FPymw*v)H#G?kS&61t%99O|IGhh}1yIobM6Ts2Z4~&uU_Q#K9=YsoaOVtQK>-gxTQs_vA>eR` zOp=4hWy+mmt2_qPU-Hv`f|wS98bbg6)FTA&LK%_PXru}fs(Z$3h|GP zE`;mN&EV?5B`RhVq*BT3%tVKP!!e-F8bt2yl1}YS&rz_nK!b@wEpip6X&V?GaD0WoRl&+f&0p}yiPM(UwyS*9ky=Hjbwi(*Q zG!!;p+ml3>kHWjMi(V~tAmD!JQxCxMF{*1GVxLjmf5ol!Wzs0@OFQrF3PBY6!I7P2 zZ65;u=d98fW)%K%M-QTO| z_?xqp-%s4WzOcWQw5NFm-jl$Nv**Ve=q3}_}+GF||MP$;1w$7xWxRv?T(8~QN zE?d&Jaa#<9vohUe%)E%=_R5?|2wg=HQA_?`GtE%=Kk3rSok0|rX!+92jTMFOn`o4; z%SPefk5@l7c0dsyPKJ*57om7&_mrl@H5B)3hdhC87=>$Hs}mc1g5r*iOFdbK^QzV4 zp64ES6d`JMrIvXL#SwF^Jvx09g`Y81lhN))5zKk29xU@H($uW@xu6t^H{AEY+Bi4~0~zUXRVfX)hvNKP2b;6*5|izyjhxtFlrU{7>lUSh5UeYL1(ol_*L$zfY_$hlnC=XMBn6r7P%R@wc4!o4Y7c>v4Lp7!@M%OIueoQ5=h< z(I$UCO5)ucA-XVxqJJ{-w6)TqhbZ;7Y3L~gT+^ou6Fw-VZQsdr(>{pAHGP)*fl_yA zpwoW~#naOc&c1U)2~;YF=J$yq65n*dg&C3frhrqwQJTm36HgaxQR4XDYrONyD7B?P zqmFwY0?uhJc_$ks1w24HmXuJ(?GdW$1$8rDB<*g%_$^EJ??y16EBQrpOPFtj+v)_g z@Oco9>nbRq#0lL|nJHbE@7KaxA~)12vsBnBzI4V2p2 z#y!9m3a`7F>eX$Hl7jxJc^!F&(mXBhZN)aC#K~e?mh&qxeqq~N9_p6fo8=f&Are1z zHOv^LdDmoonk`3(Q(I-;te;WplM`mziB}PDRH;u6yhll)pZuTwe1p;+tj)Gd>!HL? zC1;tV4x^+Hd&^@X`Y36Y-!16ZHX?CV4*YjeT2P^zKxQ9G{A{8@uLZ~P*)of(0wp5x zRrhI{QBrg>d(&rIl;(dr<;Ha}lsH>G75X?1B}MeLN@V(?q}`Vy9(UML+Qy6VE}0~h z7N6g{RWyncm%m=*UU+~~`^Kcn^FmP4re>GU5k8cZmU>9*K`Kg%%sm*;a2O?iOM56t zOhQQsWzR!sa!~SNx{QS3Rg}(fn5*CDJ4z#5JuY*D1|?Dcd^zUx1*J|gjdS%jqGZ~D zQq`;9P*ROv>9G8Jl$QIs_oc@{l=$!ToX~azN-7E{&UiG2k~Mp!=X+aFI{LlvTkbwe z`)pmWUw;iHow;FD`J)`AQQL}#R1TnIvG|e%=Qk*6ytTuC(1g-@r&dnuo1vs5pY-1L z96(9W75JGBW}xII+ulC7FQ(^R)=Z-JLg_kO`KA=}us`PS?tU9VX$Aw5wR$jLfQMVE zzXwV_8?oW7gi-q8j~YDi`bnmDraPJDQ8J~6c0)NcN_ptV`$wz^W!&0T=G}V=Wytw| z+cB&{$qGX)?=#F%+FH%A?(rCu!mW~0f9@1YUQ4;CVQzxb8y(A#G+fuS8&ZGAuA}7W zb7TPmN+?ZPbW>j7JIeg3W&Y@xC(5DbL|I%}ud5uW?SF^|-l-ng<@I65q zr8^kOa~fSkS#1iC{1}c%99YjCJ(Q7Z@?7m0Gs>PmU>Zbr5v5Uh^M46=iPHCkue^7o zLnJJ0UwxaCb>l|gVl?XVo3zs|j z5s4GK?C~7s(PUT;Jao!m~WBzYy3F>lQN3ay4T=DBt#xa^u$Cb#Z zdj@4)bxjS7eFk;ymR9-%sJqSoW%31#OCD7}t%HCoyK=>e8IicMU#Fc=9<9^ktd}e( zGbEzWulzE~mEb-0fj121`X%3^zu$$Gb+g2!7vVOaZ;Q#{eOwVg_17#UoKXGVXf%$eP ze;VFJnW1iF+4|Q}mXV#jmdIa3;?QUlVZQ-~mNi?5@(#SA_f2Un^D9ik=CPlmn%9<-{3oxNXdAiEe_gr#O9!Kztr4`t|d}`07l6;h_N&hg> zd7^tG*Ns$AX1nh2J$*WqYx!08(tAUc_4{8mMQA?CO7_%Xdai@=_@2D)GE_sEMBNjQ zu6;vUA+o!H%JZK-*uin34E zW_YIPqO1{lKEbz_;QSKe_qlF?GRK`KLI`laG}Y3+&h5Cso0|5H)C`noJF5HcRX56Uu|mGm zbtuOuuStCA5z6~$<$0Gc3T6Fx9~@PmfwBj$3B+BfMtL<`3h$R0P=SK4iR=ysD!6&z z^kL^Al&g24b+^nI<;$z(ET{URyd#$7zM@?y@67y@H<^b}ewT8z1fML*xwch2nbU=G zuM55AIDZI{IJzcdIYi>A^Of90cU5UnM;OB zb+#{k?%9V5=r0MNjS05sAZ# zEbNE*?mhZjSd8*51bnBS)1tz|6x@dcW1%k4{@(6MSns<-s=h7Moquh4=nB-4e?&2t zVZ8f4vaUQt;`0tmAeis9jbvyIDoi`#JXtRdb&oSt?L%NbKN{cHGf+oH43El1`QuUd z-|IYw`8t!AgdCvGIXaOYwsTy;RYvbHB5`|CD^&=%y^#}PI;b%H{_`Ih(k$ArE#ny<# z^JVH?L4{ee0xt&JQT`q2zw!$asPL#+&DxQ@h{W|V_U}jepEUkql?hasF?RpD)N7P) zb%27d{~yZ#NOMBA_cJOu()B}6FAf3cM{y%r85QRDqD_%nlz(@&?aoj=Dm*S1K5Scp zNW5RB*KL$PXZn)*$yHRCyN5@}FCFFE#FpLlZ9)0dL%F9PxS#^QT&b*^e^BAXladF- z`>3#LYp_s72j#m77wqP7ph5xaPwzW75paNe6VJi%{ZW2v;K>LoEVULD&67g;j$zRP zF>rjp_{jSvTtfwNLk3ZtIi7_t2M0xIlGkY1Z*M){%9YvrHd{5f0H-hJ)`DiB>| zMz3a3!QT99?Xs}{T9k~1sm2cB&R|FUSCvz9bI8Wg&(?)4VHgF`Dw(m$QEN% z!0sXMx+aJUI(&9)hw4z#t%5lDLuIJwa!!<5_8iJzw|ed-3FlGD@R7jG6R03*et0F_ z2o(f(UaGOoLPcCL6#-ZV<-a*UvwDga6IVd%A~x+~!M-<8A*UtvWEBtmyrkQv%!-PNy%)du`=J7rAAOrl{gq)jJEFuz*_$!jU(U{r#ke8QI*RyMJKNlDr@*)zmQpk%BOw`7_7A+;1(a87M4Z8 zEj~B6wS!6qirDeR1yt1PGAS1Z;}^{`UYehWI;!xCF+r$UF}vLRDks#1`@bNZhq`Ma zxuOg(9!vp!Ku{O*HaJxh=9?+~TR((KUenlJzbFcI{gqV;r(wQwg=$0&b^0a7)6KBn zR@>A(E6g{l9CI-W>T%=g7tI6@Z{qm~zxW=EmUG5w*mJ=F2h2zJ8$LD!zGa-|~@|F|6yg-HBk z2;&4Qd1F^wJEn$;+CB;R44p(J>V|Fq84N=mtL>LP-l$kf{B!6@j7kRc6dw6|LY;^@ zYyz1in_1d({jyMg|wWSp~! zAwvrlbxS|3Hd;U>ms$G+7#<)JH~ClTB`VgC%H;WOi%Ld6b?#x!K}8+T_`tb;s8~(> znAYQq@cv;iwZ3YKN|_Gy*lR)EqL@@nLNzKHRHs#D_eLeg3geo>uTXK|#|v?>EU4Jf z>`>mwRa7!v`R%o)DJtsiu&W`!a$U{eNh?mMIRD*d>(gyiDv-tK;&BH4Zu`*xuDwM? zpLsM&t>L`5oAceavI!L@$BDZ|`J!USBPHTb?NG@dy&3hyhp1?rPghL|t_O?mfGFy7 zsQBHzj4tU!RI0BhJDJ*tN~N2bSgyf-XQWhG`1cu=#A>SMvk0Q%)>@bOSP6K2-YjGL zNmR=5X(_#_1r_}*K*HpgQE|Alon^lbDpATmKW$QhN-G`S3TeMarTH>nszgFi@jbHl zLJ7;LTfv&gdN>4o#ow$b)@6)Jw)z-cdh8kHWW zTf#IhsLbqWJ^$WFROa%2s82r&mGBHNImp2FIyOpjAFMznHI=Qcv4W_i!^r$c2R$mI zy5hjY0_Vre^j{t^1XN<)@|*klEGnB87rDjx1(m;igYExIL>0$r_7-2YMx`ksE=CIuBxY2eEzfzm$_aGi_4 zs7@i^I;Z_A(ouB+&xLN{6sickXDZewiYhjmI!{g?Lcn)kidr~=D!t7M;%%x?qRRLwJvGyZ`(%67_m8>l;TDf@Fgj9*Z>y+{Z1xi4oc<-&Y@dzd3#pe}7s!NLyI z)$5;s!2$F6bw5o=f;xrPREq*w@747!smoAjW}Db`3F`b_*al)4Px(h*2+M&NZ7IqA zA4TUKkL4Eya0#VF8t7LlGo+M}j824vR8mSv+1X`f%PxEGJ>PAUkrhhFsO*X;tCCR} z`5k}xIP1O7z31NNzR&YL_k|5!^qf5UXS(*>w?exrkJGBJ#-LyyH>Z7m8pit?M_Ay3 zeC6zip_8Z3j(M7%kd1a64KG_gQ7-jWDeOFKaHLY*_hEx0RsX~f1=&gy#xK4=Ud>*q z+H`Fw*l)~z?6VsnPg?n>+6(ekwC1)>VZUS<41L)j4|&y>Bz#K`;kddLwoPI?kuPPq zQve%$X^EB)6y%LI_l<6WygEfKflJsA9J8)xMlmmtGv$h7f_$}F(X7oeP>{R#X4=&y z$g3qOKU`RWd{yS~cT01S@AY4!*&fs*cY3T#5(=oN>1=lgLSA#hey3+LP{75QpVV;- zHu%%qRyvTcnZ+=mHUkC3pl8qg>>;o5vDaQ^CCI-b`sTunJmiPgFs+~32?e9RFaBvA zhJu=}!KbYmA+N`B*Z4d9|JYS=>b(p=F176T^OKNo;Q#6bwGj%+A|XQ93-a2xp57j1 z1^Kt*xkObxAfG@O$@0bVUvA2F=(z+1gC@T5?HQ0ala#F$jQJ?XZ@VM(I3TZjTSwpt zwlmg2GFKeOk1%0&=_=%X{P{ov-;d;5XJ>@|mj(Ib;S@VY2OtP9?f~5%K-eF@vaWFp z@(&dZYl&w_&7TVRX10kg0acg-Ha{?e=jNe(0>35qFHdA;{(!N zc9wgqT|oMN{M?J{kAZwgx;mkj3Pd_H9{EoZKrGv7T+!49M7=L`?8N&(tmPXZtNjP0 zd-~?yT5qwR^0-th9f8mnGGy4Z88-OX_C#^m;A5-73213b1{KoMK+%i1@|eNw*D=B zd<6)aXS}NoGJ*KW*XMerINH&eb_A=Fc!k7ApAFY)hS6^KCB_&YAbfIK{}6l!?Nt5? zvWi7J+ux2`DJYl8G@;Xj4es`+>?YXYZogAL0g2vg_K}Pj5UvM@u=QC3(LVaW^uuWw zuj5?)ksu&^HmOsPA)+0_J~NE~wENHfsA3Gp`(d!-%VyZ%akWNp9EI_G+Hcc9VsQL5 zU&;W48`t(2(w70z;dkX>DQqWlxiUNV0%1(~jqlMhAZ>R2Ddv0-2wK)}rDr37FnY7u z@I(u2aJrAO!(fBc{W)w8q^*|jqp#ls;nqk*uDt>fo$HOVaQ}h4?(Z-1cYyGfm0m(_ z2uMtJ6&5f91a0CU;(de2VfI?)R0VACyV}dTKw`C$d^mOy2zOWezjk6A z58YmoP_#piS98}5Abc;A+u!{PNINV$4T%##(6vin30(%l)L6(Bx`RMGmSnHhT?Qn1 zXFJgW9G4?Di8}b=fMBiO;yiE!h(Qz+@%dFC9KLoy?!%2_}Xb^a=2isR;Xk{YHTkNaXu58+!F5T7yExW}~sDZ;g?$g&Yg z-aBS#Qb&Q%prxh0wBs$ldaD*F7^J z%B*@GY&I3_mx&7kaVjv0WCV%&v1!9M6irkGA zAoeM0x<7mlq}rFP1|Hjiu#!t-)XfEAysLk({~VA7e1zUA7y$Xhr?#4rLZEDZc~FCR z4*StGWsjXGkiNJU)XSs*DJivle1|%a+NQYE-}M67{k}6(e=86P?%xt~e*x)w)@sFc z5K!-G-{DP*1#0xSn5Nw4K-+PwH(f^+$jh91SByh|a+{eNNq7L13zyGwI5z^NyjxC} z?>bPo#B^=mPY2}fln19Hbb$Pvo%o)M4v;fWRhMM|%wB zSD_p^ z-pUj0EIv$p(?ofWs&w8h*x;AD6!*afzr32U1myACxf6ddPn^ZR$hzguBBwvX2H#whT>)gqxks<7M}a(HQXZJS1SIF!IqhrtKxUYIz}brJ zL*Drj;|ByGg6nO(0K3 zF47z+Kyr0cnb;Ny zgZtuv!uZ7K_T@c5ijLR0ZQKoHyOpqavH?I=$o~0xRRhR8``L>hD*<_Ryk(;QI*@_~ zF1bGP1@eJ1S)LzKK(;E?|Lpw=DDqr}nhdvqa!kzYa{qfE70aCZ5o818r;dUN1=w$Q z*1Gyy9{^dg;l$Paqj)_7E$lbSfs~a}>|P}TWU*mV!KO_>E){m|tX~9*%ZZV>Fk_%t zvj`s^c>|=Mb&m7|VIWueY&WUv1af#CUv;rOkb^Gm&UD0lP_2IM-og%~uCQ%GTr?n? zlq|R083u|9x8@5|R-nudSuz_(0cAcxTYVemug%WAd~b4r!u4xgNgww2zo!RY>1qLG zZ-_pg!74pSXWJP~TH_RWLRHjcG_L=zIZC zY&5U0?7{o|#F(63{uQ7M+cp@K?FA|)-ycff5uiRfY$GjC1@iacgIDZkffB2Fuk&IR z(5C-2UwJDDv=6Hioj$Tq$Q!~A>-T|nCbi^d(-P2RMVY31_<*Lll(YHiC!od7B)d5b z0WETO+j&+?pjyc|`IcJ%ZI{odSHpI=Ur1DX=(HP<*EZiBmkY&K725T~51|NNcRcpP zb*1a*FTo`b*x>xk`qa3VS_^HPtlT`CQwM-{p@p75g^Z4*vcO$a9Y$o>GR=m*#9d5u8wR`Fc%T!Zs+~?b78?pAX1&@7K701~$0v_1-$5 zDjX_M8jc0ZA?lvnD))g>FS&5Hoek~E4GW!2fRdF{s85>$s{C)chJl$;A912;dTom9_g0?tFO3Qf(49mt2Tifw`oK3vhV z1ov?(&*uDjfO7N_Ndun~Q<~`0AF@`%1}9E@j@OlEAtm~V2dIjlBIWk80Og26!KGUk zK*`k>V>G6R4Q@R72S03ZCsg%xM|5TG-&qzvM&$r6l^uzdeaS)mTt-bjEog7}4y#NdxDDFh!2K6DZ$#5~x9# zcRp`ahE5m&)j096?PL>B&Yf)hUTgrA0T&*srz}vuR8EgNz5z<}%?An|vq04icEumW z1d7DGzv-10pw!rRKUVhy>h7*YB>&A6)35z`0Mr<~^(NJ~J`e>Oh*V-zS0;lJ*S z;{9mdtuf)d98jj%e-y|Of$G$wJN5AsP&D?~aveDZls+Mq_-ucm>Rouo=*b7vq1NTa z`dpy)EFBvE59fKhR=hkuFQFc5-*s8l7^sr3{Jsrv098z4>Y64UP$_=b1D;*oJ$ z!BiHgyU3RoLiK_AcX#>lQV`ID2#-!k;5{zy1ikyYhd@j0Z{kgPfcNp@7%g%g(3&Mi zbYwVz_FskIeZ40@J8gJoA@~B&)S@T9Tz(5Q%f`|qzfqvMX;r9}*8-KcZ6$EL5@`G} znrvO&P&oX^Lc+8L3X|(6jdY$v;cWdwXN7Di6!BRYBcYtB>@gia_b8M}_x2YHhr)mZ zMxEiNPIdlnib_P?nj)3~xp-y# z?IS2-&39+%{SL^*I|ORqfwH$Pp9e?;C=HD9aF{TIGBu9J>s&a`#t1tZ;_tx*AMc~_ z4);@AZEDnTTrZ3p+{vp4YR+Ki^#?L&=lw^KWdNwP0%seY0chJ7!g&wj`f%Zesze&* zXDuD?)stPY!Oh2KDPuhC$usI57*BJbJmm?_KfCspJzId9t7>>_S_9)PP&!h2(XWE- zg4hkT6H)MVXFxmQxZQe&D7VSod;`aO-1I#QD?i3-?R42|igshf$SD<^_kRCCVjQS> zhj)1-WZ>uaL|yMM1L}+SR?@EceQ-zOrw8ho2Z}2bn|Ym3ei3RvD8dG3-^$$u$k{*L z8tjhi_*OM}7qq)baaQL^18ROV<30Ivu)*6~B)DOI?Pp4HHNpIHSb1<-8>q^OGD;-8 z?z*M3(<^u#$lqJ5e1Hx9{$T}XVA@*p#YV%|553fFl=!6NfLOy&1vt% z8NGqVax%Wewi~FI`mI)BhNUcFAhs=SQ5L{2!_5Ngs$N_cqj4{)@T%d81p0x4A z@O0FP;w8@Hh29?&^`+^fp6`-9v@b1j57eLcF&%a{Z z3N-D2gF4?akJ>kT+4SMQdh5b(>3!G_LPrwBN`C-NF!yhhle-K*g|6nv4XmKBSmi=&EXTA@*kc0DHB!8YcaR<=QQr>C>XeJs`Wh1D! zOGtdEiu(a~exc8=q=B|=A5+eCTn8?*X7&EL28E|bUi7auL*d>p6xZrLD3rUq(_a?9 zcT{KSlJ0bb_YviQ zn>b$z-vZm6qyZ>YllbuV^B5FHGW@-@u}=_&A@`>9P{KZ%SxMgtC3E$=%8vIz$~E|?I7Ds1Jm`Ey@Ge9E{!$QJ0{zM!SPvq;comfX99 z_*k^{2Yk*Y@lrGvxnSydrB3xzTXBB;3(z@8!t0d3HN1@TL#46PddUXoDRCiR_ZHq) zUG44b=yBZ+yumJy{eyKEH=J-ED>`!HIz6r*XRnp0_x%Ry!rGtj76m{%@#OV?a#282 zXX+_4W&qmN)4PH%r(-)$z57MNb%e1{^Xv(BTz9NU+Byq>bsByrYYp(abr=Rji-C6D ztmf`*J)mupN~mkX`-Mc}S#<`!$Nm%jT2HL9(lXW({U-(wGBuk0{&3;j5Vv!AK)cW2? zY`L{(-=oxjM{XsD9^9R*ATs-jk0gan< zl#0&}!r99R%0L^hniX0!ghF8!#=8adxKD`NRj&{Rh5M_khYPiU)}da&dh{z4ZZS)_ z;VKLp^(PknyP!x$+b=UP8H%#$Z&ixYh0naiOGE^Nn9KJ zoKObEkzviJniB!*SPr?EUxHFLwQUlYQlNO+f-2c|8j7tH7u!!)LvcHqIje&nDvWE4 zY%7mIx$vL28V~58LT&R{Xo5JDw+ZtMV)vKHLq=dx zvMi=hsQ_+wg->$bNd>FnM|E+)4jv-2pQ5ikL;Z*PWzl~qzj9fqUmpEpnR@$wfkmlP zU9-+v^n3bJeY-g7|2jQvy@~qkiz6#U)JrWh1l6FtESYh0Ie46mkNiC03>IY;-OeXZ zgPXy5m!t{>uo_w4pV8}tdUo|e0}1q-dzGeGigLG$+cZqT<5ZHuB5x{KRA^+`r#%3- zdpX?<$F;!f^OnKN|K5RzXu{OAAGWhxPkPBz1FSx6ek|fF03H%y=W>w?u&8=*W~c01 za5H+)bL04Cuo~ZC0+@%)4~kEUpZ!eSvmPu}K27uMSwI|NV$#^Jv4_;uK28%bDw!fY*gVj>D^S?O~cvv^S{xLNNmixCJ z-Lo|c+(LgmwKZA*>!U^P>F0ldhu-fzW}X_bSo$@{XEY4ftVN0kEl^H*?Kx6C50($T zd#GWu;P$+0)Y$(ISR1R{RO37k9-)`^*03&vrG^=)n=uHiRo@=`ueB9CIW6dSZM6W) z$xqv>+6%y)m0_RhfHGLO2sGBG>w(97LuKza8d#Rh{7LWr53GY$9n)O`z>CxESlr=T z*ni}_Tm>(1Z`eP(U#$gf+7&#n#tMMv)Xw@K>M7Vra{vC>p$y(T&iaN1 z-@^JKe+uoLKX~qb&MPLV0k&UcCS)9Dus$a6wEZO#SZ6G%Nm*-xt-NJ)Cqt^5_u+=f1o%xvd2J zUw3Yi7t2L`cB1BL4(i{UnVN1xdCA3-@2w#8f$EhQo3G&aNU=v-q7s7hc(%Llq67c7 zQ^NO7=b@fi?56=U>e>0KdSg*e$9YYRA3`lI9sXyckMbo8(X}_|_l{?*z8m#(lJRql z==ZAp)ie+4Q_>VU8&Mu1y0-g0gjy+@71FJPpTmu+jw*c!E)X-w+i4B{?Kb|ucaA`) zrE-&YF&X^qbN6@-#en}Cntsc=9faD6vxn?g2R~=l+kW9B2qsRcGR>=i|65~i-OWW1 zY6EfpFF3)^v8dIT1><$h*1xr~gwV(TrBZi$f}gwV-9Fs+2NxRhT-J#M|Myy6lGZ;V z)Zthr%bOSA=Ta|0-Yf$CJ%$=RdBqSKIJZwlG8X&-Px0up$v|-R)4dBPNZ>zu`DIgm z7KD25dcOK%1pJ;9N30l|g8z`NgUsiT5K1`uD>5k`{89~e4c{Jgtp8kp_8ItpUoK(Y_W?pD8>*oz6#UxVepr-LL-5)OrJc1E5Wrn~ zT;#<4zw%oJRR>Q&0E<0$%NAY;)7gLgs=-z8=i$6Oeajz0t_dIV!2M)^ zE1ToqkOm0jmS$n7jsd@Atuh(pA_7zvw2lo_K)4_wn$hbz_Mh;%oxW)h^6%_sopUS@ zDD%2|xuFrlUP^s@D_RNuZhNNc50pYc+h}@RdoV=syjUvZ{Re?;pFg|AZ@=L4unqbJPbq6heH2bW_}qKn zj5Bzh1bc%Msrw=F@Ff4 zWvpHQFv*$>u_Y&$WE`d;V(etf;kzp6_v**PXKx_#ALooqofrCbjhpcsG$7*36?S)FRfsWcOWoq536bks4Dv<;7pQY!y^I05Rr`DZ9wF>?W zMTpv-P<)||0I{Esn{WBL0FjJZP4Bq(L(CJpUIsCY%iC$u*d7S6?_U0M_&5&{t9%2Z zJHA5HfrPY+LSG<`^?h^w#2iEly69v&hCob4v9#k!3y8Wx6PjAogV;YGSM-EeAd>yj zQ`h$`5Ouc0=i!fVhvHAtw`A z^4K_U@*>uI_^q9CR)K_Y!j=SP9*Ewu`b9z&>sYQ=&#ydcg&6G?;sFZQk$ibW_23eN zD6gwqCIpuu`X$@9B0EJ$cIs@Xe$WK5f~l&zQgk6fHY)S$LrtucSZ;`Q(S^iSGvOp| zD~Ms2*wb`l3&e)>rQDo0gOr`w?2i;zAk9|7@a;Vph*zs-5hQPe#7hx1KPdMhW%O$k zf6)rWcRtYhnQ;n|`G@XO3^gI~7Vj&;fC$vTbaLAM5A_tNo- z$LXB>hJK&3y4}$4w&mYHZ&T6lQ!QyJ3iaace{7~vPG_L1RtzZ<%Ez7eVf{%rk70}% za@~TbwPfXLA@R;3V{!IVkTQOa>3#cu5Z|S@=Je(vB#AX)TZ&p5v4Pc)Wg&@Wzxl-ZxGERoorzVosp2Dh*d<0CDHR{&BsZNoiY4c6UU zrS)r`gJc=QB@qFP`>^B5)|pL^^4F}VCu9cVKVP8Sv$cdo%T1O-_o5;7a4nyg(rt)e z5BkY8%nQj^5{LN|O(8K<)$wRbJ*2W;^i?oZhxmDM>x@D%Nc0Li8$MkFsrq$3oFa!H zL6j?^e>-yNPD3@sJXJ_+R!-nbtb=J{b7o^pMJ`v0u zfJBWK5ec8mAjQh_cd0@RB>jG=|42{*(#~7RF6X?1gdbBAI(i==DUh)B!r?VYf7`FS z`-&1IH3;c88EHZ)b?_8Z4f5!Tm!CN}8AJMQR(9=i21we%q(-4M>wQ<~oAUfwT5s zZcg${hwQwI^Tvb#Nbd-n6vBN_=E*|M+}TXzW?y+ICLMw_V=?E(f(FRAaCJ-eBdqHv zNPMx)rwR2XPn_7ZQO~kI%(Ed6Aph=Dfy`_BUFP0hM|nw0?3^U}1soAPu^siFiVZ?H zc-$YWNm5d%w?86s*%jqAl@dY7#a|=yXp{LM&4k8JusVT$KZf4@!uk+`dHjcZ*TGML;Y!|Bh=F<=i@&p@EkHV`}Y`i=|P%V#)J1Y(U757^Zq=pQ|Uw(9?I_=)L-~d zALJp;G{3bj<{tXZja<;Z3z;`W`|6nkAkEVKnZPYk$WXrND}%Y2PEI=dOA7gHErunw zSvyF35azPJZ4}Z;Pcz@fpNGubqj&2lzaY(C;P^2`5V3&Q>zR0GF%|jP`UT^EDxml@SLn*>w%0bp8}HR6(IfjgS+qYD3GZi z6TInXEu^{TPOGTsLV6kZF&2hLkm>My>ys(0N65G;F3?g08M-9N6GMiO-j>N?+cyrG zmYH8t8gd~mVs%G8PYI+qa=6_|LvA=}Eu%{q>tu!sDK;+dkm2yDSgyPd(!Xy>`o;MV zG6P3jZ`{N>klOFYihq_MeRxmAe!oAEIsW*N_mMD27wT4<`aKUBxxZFA82uqb)XYtU z76O^|mL z{yjIgxkw9gOw|sRZSIH6CSCv9;0DMRzq|Du)<t@r zYeH!dNHq^~;mE zC3oaeAHLBE5{1mx3h^`3l8}97`l(=38e~ngo$5NI2RRmd8oqtyhRl}mx38}?K-T1& zs`_(k$V1PGi{=GDX1j)J&LQM|WwOUS0$tVPDMU3WrWPO&3)z!@sKr} z(!Bos6>`PXe1dVp zi=Vq2Aty3nEy-FRGQT|-Eu6jt*_wJeoSWz%d)F_y+6?UPfTqLdd7O~>@v{65$q>k9 zAl4|pm4cjFt@7?jamd>K&U-~~39@bGRT3=v@H!t$D0T8cPQIg$?J2C6TV{+n@AC?> zd3fythdx8@zM7Kg?H!P%b@hVdKpJEd_Bx(0$GCxfN9}$FLC)l_-6HKfAxpIE#eE~p zGXsIQ!(362`@(pO*`}+I^@U5xdS4~vaJkyIxgxiI@~hx`LoEAGcGM2JFy3H?=-a%*$W`gI9*S0u?gEhu*Dz% zx#sGL-LIe50iiWLO&4}To~Vz=l?SVk*X1JO)#wBH{Z37FN&BI|n8W!7)*I*UEfw1Q zZx`f+wehfWWC78b;wA0*3&;_CZB16nXm`Ej$E6cMv=-?U+fxGh{M(+$5w<{1gzu>L zdLZ)3-<$oIq#?H(i$RtiK|bI2>`Y&4)LR<&*&v79Z6G~Ik31~DZM9lC^6e2Le3N^= zAvZ2{pPlhO>Ic$ZzobLGT$&>7E$Rz>C4wqZP6%SutAu<3sm4N=-8jzANV!ar=+|`R z{R{N#iS4F91^V^A_!s{U_2QEk@%=__k5r}X6XX()HP62`(}0|)(O+39oX91A@W?oW z?R>Y>d1489Re|-vnmJL_pShCV^&Yu+O}^KOOOP)-cCh6z8|1`>>^blqx#*F<9(jYv zxqn!WeLtTK`9e3gsx;D&AD5#4sDwQId*3Z13p0>^`jCtwxfybj`kxdr%0TYenM)0e zNsv3-f7P-E`RtQ)41vm6PmmxM!!G^=`|X=mo8vvmKNl&Ykt^qX@iGJX|1lbiQxEdU+FVXcv&iLFNwL($wm|OcdYdlq zSIFBWev;~T7J1vr6CrUEkVB)rn#xm0zTI5qqwpKZ4>W(xo+ku3V}qn;Lr)-&OL4Bk zTM_b3Hsy)cAfIc~pCEam0CGC*%^G@=A&=wcwmUhEkUz^8JW&`8xsn|&mkvonoV-XP$@LoyOmNkaNh>XFC43&It-Aa$_tN*uO*Z!Nye!kT-s7 zfc+S9)^bI!2*^1UTs9aR*GAs`DHpN(k}c$Yl^Y&tNe80Xhml_Vo|Jzy_}TY%KIB#R zP0nz5Ay?cQI)UeQ5X}FweZ0*Bc^-87ZV@w2(c|2do-^Zc?kq5mVFxGYs^O}jNX47@#A|>e#hQ0*q4mR^YX83%$c$W2DxG|8W zJ~?pO<9jwY&!zH~tw8W@q-^0b;Dp4!j%TV+aIf*@nbl_)H}~qHn8T>&`^YJo zhjJY=)yi)`@M&*67mpl28}pAQHRPO6nr6gvE<=H#sZ2c&@}5uTjOr&DA%C|@wc*)m zD7YWvU;|;J95WQY46(XkUQpJ^mBB4 z1_kDemrXo(0wHPg#Hnf=SN@?<4L(jNIM4h=P!u_Imph)i^L;>w*`{>I4fFiS=bCLM z5>W8ywRcs5ED*{CJKkKx`E*XboUIl)VRG@ z<_Ea+N$3K zg!pqa$#KXnezKKcxGfHZUoU14s{TYC`)4R6wWBrCWlg~E=Z5Y(~tQG z#N%)7Dg}H2V$_XI+}gL1WAsaPt=9&E94)htpaaCP=dq4X$fG}#b*K~z1cJsU#mVk) zAfDm)D5m-hh#9pDA+#4j@@XK*CSC!;MYCgb-PeGa7?5-LG4i_kUu`FMmm+UG)|+X0 z5r}FT7qjs_53$xQym&AkNQpalO#FvDwoa{2fW|%`(vEOGKKu{)+koTs6S&SKZS`+B zR|!P>LfIGmpMd!LOw^@$HXt<@td*5G;d+wwj{4_25C?jb&zt&faG#XR_tk;8$-!mD z2;2X1zsGnh3y>_vV~j>o&-Kk*p~D*p?eij4*X|*|oV`8w@&t0ZDkhs)i9l@6S|sS; zJTN`*KzTQEnHP3-eU1AGMo{CRl;gZ}06{_X^)zVg<$6cOc)R+0b6R z0CN8Gn$XfTp!~fZ@>*9EsC?W0`#gYLeJqi1SfU8?_c+t;Wq`sje9~!Wo&Zf*q1SK$ z-zV;QSF&V?e9i@?F6(OK6Mnh&gp2S2Wl=kj^gS9mgy!SQDz~60oOku<>LDm@yk}R-1jIky7v%R@0;xpB#nSQ$-WNuHiR?s>!G|(^>1_-%0IrXvnWCN-`9r?zoB1&p57_sK+oQ1cC$x*cOq5jnA;E3 z*Z9+9k?TFn?cQ4#i=6DIob3;^fcWnL1Np&H}xqhtLa_Tq`SBeuDt5<XdFB!K`%11;7f_5=HJ=+Z0mf2>NQT(7daFh#3 z>Ra-*KEDOz=&qgq+vbqB>s&3w{S@g#yMi!3@})*1liTlV0_9}PjkZVyprk3^iP=*C zr1Wc_d)<)3{Ye~XU=sjpAFEtkJ@!wDdz`k)Z=mcktKWIj0eRIc`pV|MK-H5%8?A$FXCUiMH8tHKy&h+W%EKV#-!jm&vxVl z!-xax>lr91NES)`WSOUe-W}-p{xzVr6R)*4#QLi7*pN!YjCFHP@J4dgR=zGv#n3hPoVzbjLVt?`pv(3y_bUAV#&Y8U+O@<{j6VD z0lD;##W(e`kk@?d8>C#e0F=o*vi1(-l5a(wZT=|&6lahBc55O>{C(=D&t|Mc)-!+U zmw=Z) z^+I?#?cFf)%4c`|ygdt)^@`_`ElohSjLH?SHU&y3b8cmSGEfC0Zss|*;`gxY&iOJ% z$kS`pkkpXVE$emafB6rn9B&)Dba9=0A{MM|zJ|Q3#kH;>vlg zq49HTV>N(W=m)`~Cgj)1&UR8^c%97gKJQ|OfhrYQu<4jBa+C#bVhcxsD&BEdNhlwA z*f`V7?=HxjT-+6Y2>F+@adxp&*zTIb|FY+BpS^flzuxvK6nasv#PH&}?K@O;^(t~f z_y1%2y=MdpPnAj?^g#JCX@8s;&VyZ+gwk&;Kr6JRCp-Lx;$$1|trbt9NMGsZ*ZFBE z>^|@NIEf32;d#PP=rZe75(rbnFE-}daJ9&_kIu>l!Sg|hl~}R(XW6S@dP=zhg0bx%s8&9 zvgQ1{vEO9x&kHlq1J(Yr0~cWoC~Cp}!kP6z$?)g<>K_GEIeajo+JbXZZeyJV3deJk!UB{#l0=?6}}XwV|^0U!Q@F|s1H!oqbt38 zkuy5ig(=%ojC=>j68FpFDlK_|0jcIu{->7ee0tO2O>a z^c%=~Z;OAr6|ci5d%}C~AW&|<35@H)c}2>8d~w_Y`NwJ002|$fGJRKBM4ixhRixc>MnNq3MpIyBTdBc{nS35ADf{m>LXWW2tFOy4} zq5#wzO2+k`=Yd-Ob3#rT*M*>*qie75I=c($ZeKyZ+ly&e{NJlU&3!UBsDgR>IF6O0 z1UX6T-!6ule}TH{?e>!S7;@%z`@ben1C=3l@TU+NxyyIgB02GIfBN0pcI+2|sNI_# ze}I~KoiSL;6gi`;pmT-DpQ*B&y}68jrn&yX(g%RXO(AXz!TdWy{HwFEes7DcNYn2I z8okAeM6wuiJIVVL+mJ8iaoNx9*NN2O{doxmAE4z2DC{i5{{z+;zcxn$wRK`zS`O!d z(ZKycrdB8%8Grd#ZZ{MjtVnmp^IU2DnMdUhAV*BGn|ebZ3x%4qLT9pMfR-BjX>Pz6 z3i%v!=I(kz$)1Gyv?nG|yl;DabA~h&-8KFcuHXyBeGJdF4mm^7pXHu=3}H~j(R11t z`O2ck9eV{?o1xV7h|Z&lRw%m^9CPoO5tMG zLBH>3m_^z#-rp9J<9M#C^X>z>6KyCb21(lsf<>aIUC1amxLrTSo`vVLdGN_i?F_gE zHjk}mas?K^ll=0yUkq|WiHs|Hulm8Nb)Nr7LK}W=b#LUKVT?ESsJ0hSZcB+Cdjl59 zch_U6i{Pde{PfgWP4EzafyAE=z{WM@v@3%tcv6ktxjeiH7D+Z05wCWD)$8T(UEh&| z;XgO3C4=!?{8_?dMZoIS(ja@29$2J(urcY)05|O`Ehhsr!9)18vHY!Wu<`u;Mdh~` zcoyXeHFqz9MXH>Gn)EDKb*!B%Zt4RML3!fis9vyf?>PVZjUQOGZ|dG1?*bONKc9uA zdV!m6?~3=tQ{;#E{jZvY;W@jmtfq|X;92QfZFE%*EV4@PRR0$WRv+vq4((Pzu1S*n z%MK>6@jc(GG_(nnp`V+Jc*R z>I28=!{A}8ZnvtB=fqYYwy%i7_I>UZEs!h*i-G4MVnI@1y?t0Q*1HKjuG?CPbU1=d zfv= zsz;sb6R;_f54pT^9z1P+T5}#10o(8Zfz;l&V8cN&G-av*8?%a-KOBbOxyjpY-+NB* zX8bo$l$s58D)c>B(mK7^b_sl(q@_7jxWT_XO+mFx2_9XH zu%Wg81V47m+Ebq5;Funv|FY`~*e~ohmANtnewLBLu{_HVoN=Y}C@B&`jjw4&E+7x{ zX}{iCPg4kc`;)HGz69+a_ZhGp0soh)+r=m)XeTnLwipEgAOHRs9$82E=WA2Fd(iGX zTX|+2#v`jZ_>Q7okKNrH85qy=Tx|MI2l)DL02iHBn?pD@tHR+4$P$Ptzb_Ov9;rXwl2hWz_ zI_TdrG`(+!8Ti?iliNQ(Lq6=$!4KbWA#YVRo9O!&&$~S)(n6n#=iSl;Y2^L@KUXzoS4)p2H4@LyeY*Yhs5J6poDC6+1>om&;9}}APUNvB>#7UcA=Ezg zf&#w_1k5D+Z2kQk!iK#SWw+WQ&t-b%cvCI-cey(HN((@!ZLtNn)jXbyYaClmE<;}H zSABdvWpjR|xg>uz3G!Cj|W6k>YKi4`EY2-PiE^2tPNya0aZO z^&hr5neRFPp>FZ-HOx&Q;MbHM@fHRAKLliX_=|vFymaSbiB<@1@8uq6*1&U6Q}#$s zgdx8~^ooA#3E`V0`Ohpmf?u%Fp`ULP!GAI86~3~8(CDI%S9NzlAY(Y2n8+mfPcBW* zw9aQLV)6bV?&JZ zaJ&MV^M3w>kl(Z4xvUODI3J(3zia{og-2eyDeDd4b>SLSy1w9V-=KN=yf*|2*X(H? zR)DZ-&KqO30uaPqrT;hoGz2tuDcwYo+#uoqLk(C;(4$ zzsc1J;Ca2@?`9Yt*MX=*`22=N6hbpz>e{zEK$L3hTQM0tZ~4~VMO!In2+qFQe!ztQ zkq4ut+Qf<>czV~90DQjm>}W*QD$8An^2EY_ol*1@%R0)>92f0JKJ1h1(_{Sg7|;7z_NKdN z_w%}r&M~y>cF}*+j`4_xb{%#_JNDB&X1?f`QtIq5i*|Jvzc3@0G>`|<$p1vHI9QC; zBmecOy-H})7KpjW;CiU44*4~b{&n_S5H;wQ!;mY6=iMq^dED>@?fke4_I!cJRT)F| zD~)KUaqE3W9oh+m6;^s-yqVzp_dh_y=b8D;mw3+Vea2{9qshAO^_doTywZgFc3$M%`_y0Ap-6A=lQj6N5 z7$b(!@XS!;&sgq=Mvp+$NB6}-^96{j>eskB$B!J_Hq9bDk0Ww@lIeTKE9Bo2wy!j5 z;kmd1Np59lk#D04se7#>e-;(~tRoO&Ojp00HNT4I41c+&Am9U0U;3kRE1Dp#F27>% z-~#e*cg>QAOp#OTxT_z{isQZ7uunD_qDD`wt@Cw26uq9wleO~@F?XH$)=O@PvHADo zL(??Gw#KviiHbth4_mI$BRLTFIwE@C$~lOb`G`Mdeifp2Wsgq(LyoSY^~S}E`Vck6 z-RXAj2ShQKHlDqB6C&xC^oseLA;#b{3agWNq!}~^Tufmgl`e2Cqo50ekhjBSdt8PU!L8QRBYws>JLQERpvL-jS zheda4hrnNmKJj^In+bABOkKQgieeDCPk&c=vJ*sUh?Z*K*M->Mfn!pEiV)4Iw)=`A z=HZ#Ywi#Ecm8N$umpb6#cor!qG~bf6<6OL#AyPs)}NR+$cXmDQw;`AF6y7~UqMm{bJB ztP+oHl9M69pxc?b4Sl&sv{U@`EDIZU`6hWd^Q=;?|4J1b!GyVB=5)#rvt=^OE zAw}xGlLf6K#QLb?FGLc=Un|&?eH1;iBh?qE=C&YyQD&?YpEGe!-L%PC@sPmp&?T$9 z2FYjnxrS+7AEi9Me7|KdVZHtxn2 z&!Mk(XVaG({@IWa;X8Boks_q;i8Z$1MNjIS*OhQP5+tb{^x3fc37IyXf8_#pK-xuX zgOjghAVsO&hJ`Bul3t3blNuHvjc;@A@|hy!><$Th4Y>rVfm}H`%30{A6)013$iQ}N z0$RBKmvViF;%jPe^y6-PxJ>yUw%eiJLBR|ux}SE}YNGf0WzuX#!U^Q}bQgnP-NW%x zmVaDAk7!`x;-fy~|4v2IUCp(|cIGMN0(3Z@on&v_b8L6>Kij!$*zTrsQg|PhOEvd@ z;6-ll)=l%wVC3_5(zS0EAeR@-PxZkYJ+=XrbL{izyVaW)8ZgE2Hgo7wMv(7Q(Yb13 zhwa$tH{$+zcIh>qIR3)%#yTJGO-G(@;cKt$Nk|j88q@Jp0C~OpD$GkR=$*ZhLv@CT zzT5fgE5Ydb9^lL0AN&rvzqPnnJwD_GgQe)^*U@)tQ{pP1hUHw&j_)raueY(uszw26 z$G@p^rszWYyoPzEKq91u(`uB9F`%DzuWT%?7bFcjF8wfMhZMsbzaA;JK>Dn??mLEH z1**(6 z_-6y8SdU*XKV}F?f3;Y6{`-Jj;O??ZozEfT@UZUtgBFn5tP!%MD1(05LsQ-RkRSZH zz*Aa-$1jrg=d4;hWc=sq%x;A9g(Uy%z#f1U-`nRe4_ZUAa1R9&%^u_h-7_CZ_#sDl zoSyYL1Ej8LPW&D(fy{&l!3;U*pJtnT{kdQjQaYs-`R`~##yR;Cp1(gJb<{9XyDtP% zigl_|A6G!~qlTZ48^ zLq48aB60KqWTe!{Cn^>|+UW!1RKH(A${(q8afX+Wq84vVAz%gRcQ;CM;=GYNR2{eH zn}YN^)f0x>Dv)K_x{=f^0LkCMJ05?Rr>+cfwKE0cKl6|38OE2TNID9-H=C=e8rpZXEHJYmQyaAMB0_=SF2nqPJQxJ2Pnnvb#Tc)pi-CxkMP zBXsre>-ItJaHQ~y{#*3UW|D`Vp%0Ut=+@ZnitPrT=uV;QPJbr?sTUV zD;}5Px}knfuj{~_#ubLivUFg#$I&AI&UgReC&DCk3hxhg?<1BG3CzwRF#jrxA)0E@YP%Gpmi@ABG zku%i$;a7$0SlQP3Z6EUHAos{oOEs3`$W8A1GV`zudCF?n9Z%3>d_8eF#QvY3_Uf2~ zo9K)#Yu=SI>w%*3(t% zoBYV5j^79zXjMY)GErn$6z6}MK>ZE7@93x1Dk~XvfZS_e6@@pD2X2WZTH*KUtZzHD zbqA223!T3wxLSgKT4y%DNc361-^*rJh4cM*1;4fCRmd*Xjz9AH1mw(^e&jDhfAi`C zVPonv^wa){9u?F&7N73)fE@;)Wcnf(=>a!n>(Suu7`{0qZHFBJv z=uUa#@m4f?_{s^(ZGP}*SKB~#UB68S>$P+^5^NyxqZyzwrbJ#w8x z(PdKTpIl&~C{-^&KkeabH*zx2!}&5mrULmtw{U*vX!N)CJBNIHi~L%n7VWY#`gOOj z-!!n@LhjSP&2k5FP`6VFlpzD?r)6vn`$+})vMYzgC(u8rIxMNwWDP~t+9&GJ*Ho~U zm*)~qMBcLM)A6Gu{QnF0o#@Qp-VtMa;Apa_&Z+Tor#te-j8v- zIt#j%SsbtJt+b3MdS^ou?(p_OfwHM$m!dPaQ@iv@mkasN04;W|9BgMr2s_?|?L=j) zvkI_WH13q@2;_9NX4vaeBS%{F+kmGC@~yc(?c79;wP`^)WIsLnY5mx<+J&*55M|W- zKhCtfBRCj6t5yy-GY(Q>J89e1!!}sXx98A|YZq|XE?%4(Z+79GTuSQI$1R#IvJ1Xhmg??J~r+psi7hj+k5W9n3 z?Y?X-b4}boS%s^K#(U6{Yxt_Ihy(q!7xotR3qgSfEZUY-B7dq+n5aXq@(*hxhXOz@ zHQhD$Byylny^4vt-pHlC-y9e=MIN;#Qz!HV@~EwI=b8V5eDA9^q+>_WPpjdcg}&K> z8yfuQ7ndMskT2yB0rzhs^PpSh6!NO0i)|Ot$Nap{=t9O<+cKUBVS^H2!n zjY+WY=jnqys?o8^HVw$#dnD&+4SHtncU*jDaSOTD;^vWs6!gf~zJh*Q67Td2^iLm+j&M~)-d~56Ph{;Xa;*xB$Iq8S z0o$A$$#)QscmA*bE9y}2ZX!{iM2mduaf824Y9TM|JWtC5Jbnx9^1}2_(NB9O^~n=) z^kc)KboCj?or=ns4Wzl=ee_e>q351!e2h!964Fr8`o-M zkdKXV?aVj;g|FWCFnN-Zo9)t=5kH5VoZ@Kjr)S7(HMO7PMShWGgm_C2eVp&^Vt@d0 zapvku$NGDrcu!|e)50ngKJFJ_$l*tRc644}F$ev$ep!#z-eNl$Rnm+!uH&BUSbElk z+`_Z+hZ)G(*ivkzKaE9hH9%`H$OrdpVBV-5?=Sondqj0~&=VWknr&DF#Vmey5+Crs z5@R)-kcRs)v|E#Wt`OVBpNtH_&(-MA?|u0Y^0Hq!A1g#+yRoSKddQECbNUCnINs~7?#X^^NBXgBJB8!j@#ML;jN^Ugvp$aeWn-J_$LweBZ zhcPGG%AHUo6z1@`BOm>=4+wYJk(=Z=Z@kE(i9D}_oa9|*C>RNmp_33rj`xps3l|6a zX}^}-S1m%mm+^^_fCJ>G4Y?I4y@Z0#91QUi=y?_E6xUiYL_h5UyJPM%^wa9wRB0jK zoFbY?aCAaG*xXn+_ZafM1#rhh4hq{F+Ya2A!Sm_-dtMy*?!vpJBe&3ty;$U5ZG=8s zkd@|2rh~$v{HhLBLnsy~wvlA`4f#22M|_m8y zAMoQ73CDTM^P+2A5B=o>8=Vt$$N@hetq`+7KkZ0UzZW+Y%b9-L$MzTUE3!$GHg?DZ zH+>A)K#unEqwb&kPe9@1iIL-5w~+^)p)8`t`|anvn>yRy(Ic&|XvuE|MPc?8rwpQ? z=+IY|2iDq9d}rcv+&g>@4ybbnr03%G!pV`e>lPH*dpi93K!74D16G-LsmKZc)Mqs4 z#P8jVPh@_r5TjiStfx@*1Nwa>Lod!mNtOWwvbUsvm>m8}e&Q zffP`3J8UhpnjZ?nFYgqX{|~v)q7(YHWylrx?+y7I2u0r$BF_w>mwqnBn@1e^be?A2 z(_hf@yEt3VtMdY%^Uv%hVm~40X4Rhmi2$W_`z%wrw2&*#^3;oZ48?^i5gcz_pv1cF zfzZ3F=%*F&=&r4Wq8|bVu@w_gLX@B}y>uB$)-OE`@IhWhzQNC2G6Vgzs@?Nk(Lgd) zTdOmS!TUgLXU}Fea>(R4zUpttA@>@leMA0;81#Ol4gImS54AoSEg^@TO+JtQ`HGJd zF(te?$a$U9xuSsU&eiMm5y zQIkcU^lB2JbNeBbIxU9ht$Jg-|D4TbkXts9a@&?gf2hBq=j8M(w)1$frifl+6V8Kc z#{t_t_6+w!4p%r}m$T##Z1>f>%M^XC+H~$21DYx#x`|9)QzL_B$?`!#Y`kOf3 z=3(=|f8+h+7XGmg#ilOf$FtD`8*uZ~bKXj9=ap+rfgG*r-T+23c_?Cj!##e+35rEE z??|u_r(NZyM0SQC>AS^Yp6et9Q0C^hY3Ch^dLo)`!|$&2$7!plogbl};J;5*18OIcI*&nzGx z{dQse!7(VgWw^bo{ulabJIah`CXt682v+y!K~DM?o7h)84-pm*!#)4`X$KQygOQuJ zE);I~T7dV_Vp>M3mryJ}HvaI$ODIW8?+Xh+-rP3cPvHF$@~CVwuNDoFldq2YYKC6z z`*hD3AIl&=-K-?2bO=iBczkY=#Qkyh$!p4(#`_QR#fJQB`e`2x!}>TBhpL?2GQ#oh zwS|<>AqVe~!9Sc*4kh1i)o|R&KtFBeV~B4=KP@k&9HB+7`lI;7XMZT}xxH2wT&@helUpqJG{&U#JRKMCj6)1T+ADU3kr&Bm+!I~Ji-^02hKk{x=9 zogV*n!tqjxzNA;kL7z6R(&IV;rMz0hf~U?v$tG>f^#{^W{FhzbM2idg>yU($DD(&G z=KW|g`3VHEx6QIz$kTHBm2AIx1BB^QGYZ~#{*RqJgsNeD-t&&WDmV>PXo#PzmY2b9sDr}s7^1UZkA zvyNPX!{`-`FmX{>LC%wsH6yjo8~vmTYpTx3LANMvS{>p-52o3$rvQ3L+lN`rA}7%^ zBYfdq5qf4u-|g=gK~GiQv(_&L$aNY${_>mpBJ$i3RC_PreImH3H=Sn@{j}fZl=q-7 zkQ3t4X&ykuF^;chy5s1lRa9Q5IEy@YjYWWrF!J4HoFpMSsBB@f(Te$oe7Bj^{44`< z)_n7arI6=7n%h1vJC1y{ceV!l2MMkzZG?N8=#%vq{6;^8?RI;S{vfv-%;hU`AAQBP zH@PXlB6sQP{`$5~KbG&fs{IQ2Yl*ml7W5#L9^DENJb)al?V7)H+-o4Xu}_uST*L9E zm92*`K10Ir=C>nK*e@aQ?`IZl_k_t5)Ns6aS4$U%u-w2uQDhu>?R!>(d4T7)=mhOH z`j74Aro0VJk*{W8DLh1roL>HPohkC^k~`8>u2mq{?QOMt&wXrXU+KPn0N*!eQ}CiF zmeZ~TtSTeN&9-3nBnV3RR>@CqE+aSIt+`8niBqb_uNgIQkU* zv?JwzLhXQfi~m6LIlM1Rw-DS{t|3?cq2V!g77(2B1DztAfpCAmimfmJJ z+%NgTH}~;<{hP9w-+4f3l-p@0vnnXj*iFbdtAxJkJsin}^Ee;B7B{P)FFc;{g7c6s z5FPK%n51?=iHbwUwpY-gQSK66kE`!TV_ydVp?3pu? zkoz^b>N?Yb{#rX0Es=FA^n-Gqaja~Bl75O1UQy(c?>UIq*r{&E0`->Y0V|stc*ZhHKCL+{Z_!x-AC;KYiXdw4~I*agj z4gF~!&70o6K%W(l1yjX7ASA}gG*p-aX}xQdI-C{Cct4d2YND^q)=0}=5BYb_M}3h$ z(T}A>(#y8tLXV)zwD<9GEch+54#l!jGYK|z16YzdGvwf3(m=#Ee*`Mx6Ltd~gKGWrp z54Ka(tUY`mzt1GdwFlw-a%Sw2({?YA4*d?=^T7(soe~C8uVTCRGtHqG?^5H(|3&>Y za_<2}&)Cs#d^p|m*=b4~Z#%ElIuP4s=T=NyLOz~VM{EPV*Ru*ctyhr0Jggso+w$N0 zym|Hqo+9`DOzb`SeF?Q^t|^qFFL^G|ONHtUkdEYC72U!-Ay0b~9?LLbJMF!FzUYmX zq5rmuc`b=^l+2;@|2(!_@4b?c8$TPJ9WP)2rJIQr2DaybP?r;NOdNUMg@CBwQRET1 zD|I{?N`cg2qGIWq0HuG*ejRkA2cqm|nSMFm_vQns@7N*t%T=m<&A<`McWDSx9>F{T zqIH?4(tyzDaHf*d6X%P+lM(9?h zsqgoYOIjZK`a8xp-y_$rlE^A-6#&FveulFrcB7wmx5 zGjP{KW^~+a}5v}Zi(dS;BmXblu&Rj0*HT|uC3Qb z07+8)=RFGK>opB_HoU>}dWw7L2P4MueDpr7Xn}ku|K9u~7i`c^JF;6NW&=n|YnSE= z@jk%wNA#B32h8WPukT7UdW6|{%D%pG0MZqYBLUR-x$YFdRQ`Pu2v#in3ilNt-|ziG zv>LfxbBP<4>d4JzxzE(Mq4!eo<{`EJ@P4N@qSITa2gGVa&-((cK)QJR!?B%s{(XkU z?_BKxVtmF!CcM50BZ)S(`2QvG_S>_zy-)G;{qR&wLvN@+aFo$gX()?j`>^&M?+@8R zFJAuhVTuh4BFEHUS4rkwYCG zNac4&Kkd_*=F7-Wi%q-_W4H)JC9kC*PJSq3Prt9JFau=Oo!ru#BtoIp-zMd)pe9~h@rMDC(OSe~AkOhiBJR5)n_=XX>#Q|<;G#u3me z9@+B1ID))Z8~aD-rOd#vBCB_@Pl&bcwf|}5lTZZ^QN%alM4xg27AnJB=Sk&Ns z`hDbI;hlJ&nzhKC87oCD`7~F39tZNitkVV4cwg4d%@))~zTeeBSA6jSwv(Td#5kog zMTR}4PcC7(+GB?9D?q%iV!`K{iQ_HbD4Pk!c0U>C=l)>3*2p^1aU3tmBXkwNZ(ZL_ z?qVIperw{)vDMhFbkx!mxo$rxB%vAnt?SN<^0=L>C}NkSNx&@fnk*B#>#wx7Lf zC8MAAb+gawE+{M1w;Y1|=eE7p<%-wYocq1^uaWn@sG6U;6S;XeFV@8e z%=rCBV#is|28{EQm7ER1_?0i5cWqaYPgdTNm@zs7WyL!<+b&@og`VuK?RQS-ZQuL) zw3i)_7U(&-43L{vnp>|-_C@}g+QQodzh4+JZ(VH-1me`$i7$K2fb?CHvr+pi^4Z$# zM^#RtpH?$u{x|Ob&7*YPlsFH4j)@oG|M;Y@r}Ju^B#?U+5Zv!*3?wfO?btsUzhK^Q zm&2eL?^kCk^keb(tk&v@_hP((&c-N?Y|WD6@>beF3OKJpI+BKQ4}VStQQ&!A-ajtmU5)V&9xFXE7{_99A$=+77nHSH z{ji|KcypVxlUrqe7#BevI&>X5>>Y=gdJ3137mpCpV7A7%h-lSxMSM;~fBXGf?hwX9 zJbRvBYk=4H-`Yp(=#veJIs69Ww#&u>eiazt(r9l1u6L7U)~pS?U*mP9pKF_s$N9zTc{5$~MAFjNyg7vT zn{rAEiQo7+*Td@HI->vgav-~@0`mIB-Hb8#zZ+@9RD01A`TC2)3QY_697s-|`&*xZ zaTSGumGytnPit9UJIab)&Ncy0Tt6o5(SImJM~CqhU-xTD<8dSYB{6Sf931Vt$7XlX zw=8{xeW`T<$|MSY%^%0D_PAwX)_#n)_{y&s`W?NL5!@4n_#7uj&)(elh4B?@;*77y z(9bENSXHf$+x_E`mB_cdxF+eHGl#O34xV{FXDELlY<*xSZcR_IRVRMHIE-a&hlQwRsQeoReP@aYg2gQBQ{EaY9V{QMJ z`ePWUq5d+6V2^&<;GUvQj6an!x2-3$L3NqHfk4|L^wTZ}5Qg*E&G%@t= z=kY^7?Ua^rN&v=fd<(SD4_~V;X6~xNc#LH}ULTAjnAcz4`{M+@wjNAqIgfD}lOHdS;k;es zH)Bk~`Jy&L{20jqW%36CzinYW?iU)Va?4>T0~(#MmWvpVv2mI&I`p7|)?-#am={3d+8j3(;Jyz<3M=%O>^-An7xFRQrr^JnONQ)XA?g?qaz>$3q9N z_g`1cUxh;1GUu|%X(5cmAW8>$ssqVdYT#U`ANpLIk8SS6`<%(V`){GUcwKGxp7?`t zHWZMvm`{uG7rxjCBLB6DTk0eGKD5wgFJ*S+73hii2>KN-Y7`6gg{ zJK>Py1bqHKPrva~lnQ;U&W8pD$rxXu8>#vX_oI_DG_xDyAq2$)R)#Q+D5taT;`w^K z-<&+W=!5>+pk`vn5G%%2Fdjek7`?1KQ*{Ne(En;Y5&X)(4&y9-vmNgGi}4i=PYTXR zKm~_%^(5Yht5}6)nDF;Wf(_Vx1T1$44m$6*H>W~NW-d@iW{(Vny zpkn_$DGlJaVRwtlU>55?y|=vVfc1WN!+#vZe$U2ll9aGK$?0CjZt(M7nhgDL5gc}1 z*T2!O0e*jsPN)mVfV~p~4@Y+b)*C;$7Zs1=))gM~Q3iWQci%SJK=AX^I5iii01mq+ z-YCfY1-~tYG|+AcXPWeg7V zyiSX@vEWa^rsMq(>pi(wyk?JqUqCs<@1u9YVUJzEfm|ZkyY(I8`AiRfk6Z<0U)zBL zdt8t2JAmf5kGWg~0V>vh~ z4GuzvDTg{fga7`Sh~KTDV4tBC?D^pd_$4_%51V=q4%`LKB#&XRk2YHM-QEVj=f#Yd zj10ixddtC?6m{@FJCU}PeH83FWx1YhKLfwIggBLfa&S1GM>k(g4fc(1>84a=z@N!O z`H6iYIFzepaH))dzgHczp-%+ZZx_z`9`OagC99WIK}+BebX&nLQxNPY2QOSd>jwU* z97kgMRlw0m(D4}k3ixk#rgt6W2ZzV|sOp&d4838P60s3$tOr?p-e% zR3NmCHJicYH`XUuGJYXreW}ui{8a4szHaeNBt*GgiB@uSfv{VH@w!^)AnJ|me6!AJ z?DwnpMXCYT?_#?2Hyi73;=i3GSRN#4<5LJx?ykaWtT_;7N?LlnPZgqu1xxr1k*97i zi~JTTh5bGm_bAdqm`Q8LuS!J-efmo1eVhtJdG;RY8U77n7S1`F#gY&;LbK-QjvmeK zQ+WpkcSDp%R{oxq%Mf-uy0>#e9zr|qlXn>)=k4q6%PDCOVYb}Y#n@#bYV3`Ap(NJ7 zl**<>?_88Ozta)BlzsDoEl){L_mN=JMz|PfIz3zHu;?U6O;SG`*m#?%b4s)Of-TpmR;GW56eL`HMz9@+Z71EdB}9#IvS#{ zrGDEoIfL)t$#v{w7esyXjg*lth46zM6sfmqAnfMvlSTGg5S_QG_oLDeB21fg@3>V% z^xN@0!up{Q?$Pok+#7l3OVRNjzo;O5LcE1N{3L|^5tJ5CQiGWHzusG)wSY+b=mjd~ zc8Hlwd#tT`4<26i-t$5C6U1D2wH>4Q2_9N}jQ#Ij3q+XR?bqq6N6)6u5P{wmqTasV z3OV!w;{K>-*dDkEQ7i^;CZAq_xTADZnx&`VaTJdPd(Js{B$s5+-*Fz2&ohL~Xs6g8FN)pNpe$&n@gXa+{J{7~=dnwL>vpJ;~)= zx@h?_)++}8uKA7q7Ukusxv<{?565A4h?|q@SLWXdNmId9|Mjfu!fs z?L9Qy5P!<#Q3djgaUC1ZYqOJ(tiG9Gt6>E3wQS7C_M@LMbJZ)$Iv?UC9ll==MShdL z@195BE{OM6HMDOtg?P%_lHsjPkaAXc_^=^z+>yEORU+chb17Zxl#agIrGQ2Mm~cq0 zeSNDXN*xlob&mM%!g(7Zk|Y|(4{5u4xC875AxUA;{TS6Iq%M4=_dYlUiFQZihL~PM zs?dv2%NN1OnfEc4P&z{bVJM$TtN}9HO&#SKkuz>JIv%n81TuGhoDjSg4k-!tIV%k4 zd7QlDsEv6NQ+6b_T&{P9WQr1gxoL&S?taKr*Sy}tA@xom z1Iue|-S48`wB2IaMF=@Ng(V91qHwHVx2BOqZgEeHyPF?Upj*24d3h5)gg;c zu`^Hk38Zy6n(v;IgRJxBlR3|CK-#sXpuf_{gYMZ%VbFVx{T7Mm!X>cWbv5veHS%p{ zlov4{X@NW1>^{=I|9<m=L>U8fGqkT%0svJL)x>7T80_q(e=J)dUgjx z);_Us6Tz1tZOChsn=J^kR63e8eqMt#vmYtSQc;k__*FslJo54VCtBs7jYFF8_t!;~ zcOmQG&3Lgl8<6&SmE#V^VP|P-1{tOhAkA6g#oMtLkj4I7)=cdtq>Xc`HD0(2Y4`R@ z+@5BDEMf9ng_!STvb1m1@n3!f>FU|0R!?!ida{`S!eDFa^)cj_DyXE2IlXHyrP?gS6TQ zR2E^#w@`=Z_E3YS`uala^$c+biN||5JeK{l{L-*GQ=3{n{HNn?7zX!dfj^>v=^bSCJ z{~fN^MQ0%A)~-KmX6TzN9}j!|-#N&U8Ov_N{~xkW0d+teJ7jl1KbZAx3bHt6S%Ub+ zAk&D6>c#vp@_m91vK>E>vn}}`hrX0N#f#qxT+ATnhRro$3-k@f?qiO6#RJ(>skZN< zSRh*=b^5)UDioPF(8cR*K;e}_E!nks%u7!3U$xgVqA-UrwVE zY}b1+Nb#u;)(;cgEs;McaX!rE8CJu$=US`=m1DCb278nq7k&rfY%QseagR zKw#$dLC79+uDZV~9{aUgD^(*0%0v-*cjN|^^Oa{xu0w9JbBsi$2IMdo6;CfBFZ*I9 zpx~nH(gDcr=e#H> zHVWAvPV+oM&wg&o8<~dwOvqu`VcmoCG5h^*^~p=~kel62#WrRSIh?;3*ST1>`;oi+wV&LR-V8Z+Vwxz`iXo3> zUh~xz^rnjJVh9*}2f3rK_8s}SfgJXAj}56+=?F!x z?F$<>#z*A@_7wz)Oh6tt?^Gr&a=UT!4%$>wkfT4kuQA;hxl*c#)@wf?_x`G(`(9_r z`*ZofiiQTrJ!t45WYz+Cx&2gebI5}qW{i0vb{BG9x}J(6k3oT5zXh z`!i5Pc&qWiGyw`ZUj-f~e}Tf!gL9K%Z=t~bQ6}q`O~`-pYpb5R+!o0B5u`$B#jw60 z|Bmr1tlxcVChi`V$Hbn&b)FA5>|20!<)Qlcc^`Tp)$esNSQaa$Lfc?5P3jX87`pCw!q8r$6 z;TV~gAIq)Ou5(2}!K<+6Y<;c@a% z6Lh`L4Ef6PK{}@$pkVGwxMI{+B$3Q{R^2-ecUa@EM;!E$D$9F8Jsc0)@xAf@8YhBe#0Ityl|vnad8;$!;>nZg1t>hYNh#FS ziad0gd=2Ki%@6gt&;iJEWlK;W$V47ZVR?TV%M28jmR#Kh@1cNdaO=@uUS z$CK_};T1dNVqZli78B9e=e%=;tcqOS5&i?lHR$Ox>OZY>6g|98<#MAJZEC3p!5~( zqqH~8P*TeFy45)yibuc6w4gt(LjKO^>TAp^^;m~Bvl;&CiMGn)KxbGEVxviq!_!yS= z>Ah66!+x%|ot8xG*L#oa_W`V5)B7v17wco&>|WyMbd)>Oam^UZ+t%OX|NF%`6~~ei z;-Sb%uZhGF3B@n`4xGHm0!2#wHpV`mupZ>AY>;PjoMUZh!~RNUQ=}o}g!1l7-10~6 z(S^54X?Poo`xaJ2@1#MIitqIA(nKiEO%V3NdX z+?n4&#gg;BP&}OaV(C>Y6kUB;BW#Sm#nP5e4Hq&LdAafENaI$+p!likWhibr6hvl1 zf9j*AUEH$^Q2fc_;fsH~>#f=o?SFKjxc1qL$AMl@6k_njbUgry^x6i7d-S1rEMs@% z>{lo%DeEZsg}l^8x}O{7S1m6H^|&V1;uNNyCvM7Ls2)wm>?NB;-s=^{i0V;5;-Y$ zgP9unHTtc`r7Fm8xxA)i-G!dUfuD)`=)u$?pP1q(fnuJfT-bpe(pMWn`$+Wkc`-hT z$hZh4h7WhA`1C;O^&RbBEe}Hp#j2FU+1tn$?jP+DXNTg62eUq$&QKhiee?a`8(a^1 zV0n+%2KkBj%^-QUvJeT?M?taoDE3W4I8!{0jOwP-b`^(terUybio^N(0x zU2P+Y9z2RL&C-7K3)3=X3H4iHx%>6F5aftBYRZf|F7>7~@)hnNk3!r4$l2MX{hsDNlzZ5)z{tB)_$zP2w zMiS;%-d`EF8ch$ST=ztzR+6D)rNGYQ9`YaZ6A_PoAjhJjJWo1j285e*1d705C_Qw~ zGUOfseR%D^+;}kG{h6JNC1H;E-2QfgbV3pNpPPEpG3cp`puZNCh}=^2-TlL@$W`cP zW*wKr&vz?)_IW@z@+uNHB zhdmfiiUWbnD4sdJ4@zH(trO-hKxvY!jv3~SAW^07F=fT|a{h{XrW$1+ju>R$>eWGB zfNSE$3>k>t+4@Ua$bY3)d`|Ak2g21VqY-XgzuG%Xt@kht%8b??3v2j7S)B2%U~MB@ zuUp}kYQc4Knvfetzi|EJ0*^=c)iNM9Zu0Q47-POf@-Tm->A$@0WZjXLe|g;-&zPW3 z%p&yOJ}PC*ySC9BJ%Q^21BI7`hcYp5d%yF%5dLq^wIriZ;Es9P(-hLR-~G$mt}%Tk z2C95$CsNJZFrPWiV`@n=z%*TPFMe{v^<2Rgn^@1~e|gz^Z$$bb?V)|MFpzgDu8(6gHAdPmhTd^ zXC9aU;+G}5o{YkO`P9*xm-#QBy6nSs^zH4ra{K3MD6aRuo~(O{_al*ml((wpfk>lZ z8`g&VxfI$^VTYgdEUl=t4IUS^52bKk4fCQWhjW$fK>wlK$bD5DUxLW-g{%lf1}A%U z<4N>Ac9)6#iUi_iXYP!bL?H2YB)OX-r*l-+TI}0p^gZ(Rtp*}@az2-Z(-qgdITv)+ z^l_bBz(34$0MEBgMfZ3euFok@%BNfLp*Qig#RrUsC$aN<>5pnhu4}_@m#aAtPb)W4 z)8+ul)Za*1-GRUg;;RZ0$cUpRs5;_eqCS31!vxof3<%MwTx6xpgbaDD%;DLt$43J?d3 zcJ|(^g!0|j3niEKp{MQCM-OUT4;v0_)9!eP>&y?GUzwrj%s-qha|U^Uae)s`jtaQ0 zJsf6MjeI6=xsTGbGR#xn6?eQy1@jRCv)iFvn1_6`jCLQc)5ZK}vM=N(<|lvqqlYa4 z*V|04)!#jc>rnlt3dYb^YLKG0q|x~=AGwE-{cX%Q-W@nojroBuUOUm6r28)qd2+Ai zD&`wMwp1+h@L#_1^7-&q%rEX;)N|$(V7~Dc)}%DdFaB^@Txl1So!3#+;%x%VGcLx= zi|g5UhANjZu8EX8rRBnb>ze0Jj+FbaVSSyiPYN5BH@_2gL4M@?r{Z6V-*ElU_Dc8n zz4+WwT*#(F|5~1{xOmTZtWS00t{%pEet8?(0W24Is^bs|WfwNZM(}qZ<_%A}8jc)` z71ykyJaP;9elLh#IL-w-TXU&;?6>6~ydtM+F4^zJGK;N4-@x$mGuIG;Byx?_r1VU2K1BlkiM!paCqDtH-0H%V5g+E=9hAMV5R9Hl{x89yiBJ|e z)<%oITT)m2e<{h)n76xgJo6Y2azamNd9x{S-M-9UL^~VG!mp)n-B-o@-5++xuoXgC z_N94u%qK)zFf%&y1=pqB=~Z9w;(Xoqq~2UnLf*h~(R>N-ldmIVTMUs`Fnmn&`?3q> z>25s#<0^7b;zy}Q_h5b5c`*;^S5PL|KVkn=0m>MLsRCb}!o0q*>B>iM;yN->VdOaS zgU6fPJ(ltOJWcQIPDeg~p0IzocQ=%kvUpJ)w}P_!cUxQESUVuqy6Ih zSqQ?Vl!SS*FBK@$1Lnz=?q&Hd0GL1fg2NRb%#*Er-@2XrFHg1_Bh72fi#;yM zB;NWjPqvR&&vVR+E%e<+Vhx`^`xAMhmM~9s3EPItHNgDX10)RGE^E=Ajr)^_^;C7C zE_mLj0(Oc8nPIum;PFQtSZ*qtD2MatGw27KtYW|GUo5PrvHml8^vrdvm$Mq5#p67+ zRNs2H0L#;~>yo#y{P*C50Ddoy{L_VRFk~5AC&&S@<-HlajIPOsT zO&jEt$WC9Sj$Op-f4}4Pv7LZ5H}`cTOY&&$*ERg9lB@jM0dq*4q3=ChW) z?~m7I8_&$3mjdRgzO(o3>Ggm4tJQ8v;`rRIk4uGd-M{OFA7kGo%ufyE#1Q*HrJa&&Fzar;C71={}NB%?z7i2FYC-uo;twtKT0gko@b6GgAw{8D3 zF2m#ZPUeN}GV(R2j2|4U`h~o~p`-U0Un575KJ!{c5%WsVniU#K;ry8s$Tz_}uJomy zrv;LcZ#ZSR-*_GKNM|12bMp!2m*(k;6voe^FMeh^@i+1YjRRk^V4SLyJ4JBg>3Js-G9*2DAt}VP?~}HqCXWVwjO{As<%BQleoX%VlCP#956md z;;`_4xF3xtWFq(4VgBdaYy2r|KFwnEmhQWEy7BCN{2p^_ZAL}pU*6}8YhxCe z4_aTF5W0?epASx07yiLK&o5uGY9#&3|2&z}hxwk_KjpcqFJpe^OD=zvy)eJ?=JjaR zumAEs-`J8<#{AByOxlO`{LAlbwo<2x`J6LFmGgEnP zj(9wdjX3tK;OEA?&8;8J@O6jjo(7!1n4kHVKOR2;o)?uf`S_YPwR!`8ZyejoY_Y{S zBo(PAJP+@W%H8h9*GAP;oR|+- z@RC!Fnccs9$d)&9sc?Rrk`s?wMBe#C<%ISUl%LowddBnJzx>7%D$!n;xA+rbDETGw zQiGqit9}CDe7u*%s-st(z=A#hjEzmW)JpP zkNW$cS19Hg_URSJIKJ`=tHb9+=F!XPaOlK4ygxY$t+*-Td2&)peb{pg3C4Jfxrh+fqk(|=c%`-2iZIWv)|cC( zTmSOz9@b-+#QeI|l(*@a{^isCEM6~x`E#3tM+l;1;?p#);k)#>jT5g^Vj>f5vdqst zv?r5zPaUIgT)}eph0&Hl+}dv?73{_Gy-!uiO=M#GL3b-}cHFW=JcplTqU{dB3;j-5 zU-MF4wF=vht7R_j!|iM1*7luP?&MjxbBIjrVEyqf$O^X%yTk{gv0v?}n7$)q5?@{6 z7qOE#Uh?T|zgFBvtN7BK$8yOhtSxqAVi)Bd!3+LmV&@-k$MIM)(f%NBwwNoKbgZT# zm5&?C_Yx?~mT^nfrmY)8Ch^x2+D{aci9K(JZYvzZ?EsbFGhZ^%@srwBw*Sba6ZMWP zI;&)2_t(5noszhnZsugSC6ffp@6ht#e!jXV^K_OUx8_Ulsr<-9cZ;N@^?Wi(ysN|0#+b=t z+knT%SwmuJO_oe@k)=*+^&ykq1{LkwJwh%^D$-q)H^uGXZMn8KGO3$OUuJEaT(uzKpE4iHE9rX(WzW!Et zrT4#4a{0N5@B<=lxE+@<${~@EeKU5$ z^3a}$7-j6|eV=|?63aUuYxVrbelHbri#W(c6@I_gr%q=r;|*)#Lo2U_*3lnQ)5On3hU2&jp?Mo@iKZY zG0Kw(l_DnDya{CD4(BRAb#^kru4U{3M+}*$`s<7J-CQ!ELiK`3y8@Z89pzg>jn{=L z)!+19F*2csd@D%ClT4)C&Xj7h7q2X#RmrXi&au_vjp%xZD4? zcspMIS9OX%^puhb&%1`a3h_AXUweJ^0UjrR_lxV7tI5RMu{YF`~fX1BmD8#0k; z$RpkDk?;h%!Wj{N@hqBSs79G zPK1l>z4zYky|$>3cWFs>CD{}i*)z%a_x}C$d7Ss_zCQPy<9t5%I?vbV+;cIz2QGhu zl7w*4MvHq;>bqvFqFx6jy{b7EZ{WD)&!AUvV}VlVlVkg++Mx7EYaOG_29#Ruql*xK z03|Q$XSUzqJXF8G=JgWJA5>>-M@8^_sQ0Odui&`LymI1I`&%dtdp7M~BoC$Ek~|eT zUPCFco<6z>Dn#ze zJ)$*&vI)X}p9dFDKqWnclc1_PR9-d7e1*RWR(*u^t13wX zsvTeShxnL7b?m?+n~&>IJ-HzM{meO_@U#v$ei{bK3#Ze+nb&~)vp40FOde3y#RP{A zRiIurb+2dzbuIh+3|g$S^jM0P1Le5Xfv=}nu|5>3d}Rj6;{v8vkG(=Y*KqGjH0nDa zf82CKz1WbW*a7R7a_hUYfx^ptH(;|8D0P+6hTq-M_ln_MLK09me6(dF>(G}kB^)z~ zy5i5z5mi`c)h)hK2o%05g3}MYVpomx+&d}j;zT40i3+@5(Y`5B5oqbS3Vu~P$%LhuU zzU#yOKq%SG@1jij4HT_MBBCdc17&9X?Z{hQpfE@d4b)LViO_m`Z8aZI6zlvuDs6x= ztjv8TKod&1oc%|4;du)jWqDc73MHJw)igVNalensU-$X|C8pQ@9eac4(Kf=Ac8d>6 zcAl>Y|CIwJis?>A`HS&=YVH>uq=pjj<S@>=a zCF(4f5*VzYBu-aV{U5$hwf9!fG5mg@FmS<~?k}E?^dS-tE0ji78QeUT4<%}In>EVV z&lqRG{P8>-r{`2Tq%@%H@`QKKa|0;*^y@&nCVnpRB!|_$`v&C#m9)#h7ogN7=k`J8 zDJY{6D5<`20?M?dS6DN9p`zTKuR6IFDwgf*3}{uLT(_-)J46I3FYp&PyySxNb{n(I zm7h={RGFJ_Py{N>A)#OQ6ONOQgHMYrq3ZHK(IEWrsUpsP_bJwZs&D-P!AWm{#4+zA zwwwW^sbXHTSpXEbt)D-;eH+L^WtBBlUZ{Vu>N<7@^$43J?mt+MJ@d_f97vou*EVKu z0%@ATuVz;%6t~Mr%_+J8S(rVF@AN$C+)v}@AEB@Jb9qe)`o^+t5^I5Ugw=Iy1Bu&nd_w*-fKYGjC0N-o(8ha&~;6jbs#C-jigCr05UtsThnSl z@f=SQoxUrO4P{A_=379zG^aMTTN}u`AN(oi#rEa_KTa_zAU!3ApcUnVl+$-q}+I`3_~K2ZRs*z&QSrmPD`Pay93Dnzp2s-dw`<)(qjLt zHjvtuf{v$L0ZQhYV@m-$kOfIyrvF_A@{;WR=P~?1k(JjwqWT#qQ{_DJSvYLh zE&;h!PvoQRAt>G7(iwSr4CjMm!)bxqIA85e5EfE`5-np6T`wLeYf#nP@;?COF5NW2 z{k~B0E}Pa_3FrA;9Yu#`@q3Bpzd9aP{2sZtw(sL)FO)^s>^0u02^G4ew|pPmpyFMD zaFuQ^R33fN`TLmzRQh&_WYBm)Vb<&qA$KV#3iofnyv+fHLdWzLcKwE;>F=YRR!30( zy4I;TfV%CK*@OpJfAwI=K?Mr4<=OcI*RbA~$GV#beFj%a=@L*hBk{7*<}>PtJxM-? zP%nR8pIE=vpVLp|kd{Z%sRBFyri z1h5|c&sB8^3Ue>_h0MA_QRF9&8Q)1L6n>#$DnkQBvl{ZoW)@JGlX&6x>I~}qkE?fu zLDBDw*J{l#p)kLfM%-KxiemJ|c@D)up{V~|+SXJkS~yT59J~#Md7<-$BqJz_-me{~ zb_t5+sy5!QRYM_}YRax91Bw#u1DWr9g~GE3PVZQohoaRqvy+vpP*`M_korO#isF75 z9FP-(qNQ(yz2DfO@Ts8OhFc93WruTbFQlyI`ak}eeQNNYa%>pB#c(-%mU6+%&( zd-q_IBozHURQ2Bq*O!GW zp{SWvc=fCq6rV0g&AZDAMY6i37p}xXv0%LYc8@Oj@&1+Q zM^H?ySY2;d2gMdHd)hDIbuscf^o!FDC~kfuLsVXeqTPD7fxiy}>3l1L4M`c#qb^S` z^G+ys`{CusU<1XYMwv;>v^X!tFJ`aw0qM`^i3@S>plGt~ykY!vAp0F>a8}`gVvkXC zs-_Mcr!1{0@~45+yW_ZeejHHJ1(n*VZsPahYjalCIIrZG6wMQMK&g-&a4V3gunXIYJ8-kk{a- zSD5Js`Q-YHnGtu$+w(*)du|L0q^?QR)-R)OQ2DUuDC$Levajx9U3h_@6od5!(!;ti z$fwXgPO0CEzS_bW7jx7TJf=0iqMk&}EEI&kk?^Z+@33yu@3zYv@?PH9efQ`i^d&Hj zd-g#dGlx}J=Oz?LpS5wm{2%JHeU`teP*;#cKQe;wIV8^0j$Rr!>#zX;@)jjJW!eF=Fi z_gb9XVxT~#H}+FL`XE|1@di8Omwr0^)M5`5T+ThmE_4I(-kp5^Y}yC$v^^6QuOil6I- zyu{I{kBKaX@mf%emI&Hs)=KGo#1!c{KFpPPR6 zT>m5FT^@)udVdBA0{+#w?8Ec9K=p_EFaG@oD-Xz<;QKj!A?%5hg?vTBVYA^_C^&mA zOLB_|@@)Pk9(Cb@f=~0=`H3Zv&lfxNoc%8pun11CGtEFjvE#is+Fr=-e17AT%MU21 zJM_aRQ3LW?vcp>hUqGS0N+N9)8{~%-4@KlFLV+ud;Uw=C6tX&#lk_h^!I+ixAFB~4 ze4XaQB~l9cfy@UKP8UFtw|7~a=pYp6!}Zt<1t^?)ZCINe1jUT+6;}5Z zL-AmITIljIDA-~O>c4Fcq|a`OqapvGa4lK)kqnNb_GbsjRn9^&$>Xn%!7LR2xacGQ4-4=CYt**j~`4%xmUf}OoqqpcA zS&Tk+0qa$Y(uFFJ{p7ogPe=yj=rWwPQPPDh_QRV^AMQb};D39#G|!`MoU*jAjs3Ud96)T39=I#en@Se zfgGE%>vb%;kbC8_)2BUKkX>Il^gNpma-xrlrx-dwmTA&r-I@yITJdX4lUV?N|D9pq z?^($4{V`v0IS6ufBO1CL!XbOrK}K0b6>^$?ew*?Mf~>N$oo_DQh1~qr1!?8Wkp2Ct zToER3b0|KhvCZp{8&ph@Slaot2i=BT>CxvGWE3HrkLj$Br#Ivs8{LqTEP)*1 zme8^3V92Fn=~CFLfZP#+ zdZqj)|6_sNB0oLDTpUkHv$JFg)DNGwKi0Gh@_Q~V32=}hXV&D&wTJk*%DU0dFntH| z&SVQXyJEZYjCSw13>2`X%dYB0LcU68%h_E%Q1D}kbx8gf6eiK~1g}ltI67Hi^7k>M z(rNfallDWJq13*JjX6kqk}^u*A!D+m&l1lgV z%(mME*3%yMu5qKU|3YQtKGc{06Jx4F{fX{}=q=Q(-d8^g#(I6;K+ZCx(m&kVzE1~f zckgr^KEDJ>emWLbp8_Exv4h=k#T)el2e<8A(YJZx4?6?aO+r8H$beLaRrOJ)r;ujU zajTyH93=T)PcMvafsAAy7psy3sGl#G|80mm+deB1+>fN9cV-&OkjgZ-U|m!QX{OJd zO7Gi3QlQwuj<@-ckv15_<+UGDcRO(vMhHWiiQK(&3O6AmRpj40ws=V0*K<|qB{QU1 zJb52@;RPgxEISrfV86LxN8)}kKy{DT2VigDwubTkQO3uq_TdB~q@EgVTS&VPX~gPJyF4W!qamiO;V3txnm^p@ zmiz(IYS-67b>@W`q$a5MI2<|%X=903_pysZrkGZBZJj)% zJ(T+Rjy4<8-%1@67o~$_J7&ufq9cy)V-4)TmLTnLN?+Ac9!R&!)!X}X1TtUIGYzL| zK>CpW`0E#;ka^V0Em)cvQglRTo=KKLwqcHymftf-=g(OwasCb&cE@UR`lummCd`{4 zxdmA-;`&{F;JA18jG${j25AD_>2?m>kh8g2W|Q(2GOw?Xq^Vm#mTya^M=3w#2&pp} zN4|&5cl}#0c-SCEDcVT&i96)<44Wx_3V^)CE0PIjVh~&7M>O8I590D0j zwRE>ZNVIxw?jfs+x_#P@939k!wa)k`W1aNjr0_MYf7)pJDv0%fx*0#ULNEG$JCvL6g4o(SeOKqFAugYlUsnTtIuXjBmGjZp*p-L( zZ(?irSw0yHMPKWkwO~4|Tl2pOtAp5Q_Wquad?2oXN2|Cy5Tfq%ItPq%K%y-}N9DIK z==&*ZR9%Dprd;-A4TMA+GYxW86U4qqIVZK_A;cBQaEDgkhbVnZ$3(f~kZ7OgcDuG2 zVxRjP=u7{FxI)pol%_REwA0Mr`9Te0U;a?(uip)E6o-9u`d=Z+*srbbZxJNA)TkCc zorKtW82{r<2XQ2w?a2G>kmz(O&cFRQ#J*2WUn^e(T+}3Kfb(UPRq?;N;~kLb&G75v z?s|xA5-9oTKLv5+uF8ks^h2V1m!v}8MTq@oKAhMm1aVF8AJu%?4^hOYPdg6JLt@<6 z{7Z&25ZgY`Ikx8{#MO()Y472K#E^&oM5@RT`=@O5QhF7{jWO|fci)4kLITl4Dg_c7 zbR?THk|B1oog`1Bu0c+C%Pn5GS=b+T5EB@h9@>4oQzd)LJ^RAU_Y1 zXexJh>}ZBKj;2R4gR&4$T}gFKKLHX)YN*P6@O(i2hF11#h%eHcue85KoxWJ@23j34Gn`f{x{od{(}2VQC*Eey0zlnplJ+vU&^q6B>x+D<-Om z$3U90x>&vW5lHBeedZ)028o3)BMduxA$3o>>aIprh)-($rvE`5lBa&Jh+oHXR`$h; z(FNy&mx15S1$IE7>$RO_G?ow){HS*-))l-jyCwA&X+q?Vbm}JCUer&2JFw1_L+n~u_iejF z!ToScJ$2>&eFzGD#b7j*1Kxy>wPSscAaZ9lXR*H=_Pg+bNnZtZj$LaY+w?Vy%Dr++hK4#ZZ-nW8Wc?nO!e>mKg%QCMxzbcS2Cq@Y#En0T9WU z`<8)|0|LYD==Ia!ex@_OF|9KK@0%Y)zyG)Zk({tX`i}b(@PQ)aSO`H$MqUBDED*`| zhfQx_6aur#riF7}Kv3D0P);om@HTh9#>MdkA|(d=-vnQQzy#4yMlwAF6{I+SjCv1| z0#kpZm?;q0yl~;X6V|^<-ScUy0`KTHY0d|>5NZ4UC>6&W2(01c?QZCXpw}0lpM9PK zk+=4ndYm7IAhr}Kfpr}S7WhwJO)v|*ho-!3hvJ>tV6Bfq&nv_ZF$& z1|TxaWh3$WGz8Vj9(zF?fZz`rpB6`R!AF*{b6e~uL}fO2jR?GgAe)1|5<>G3?7WNV z!A>=Zl2DVnh2uGRJxRxKg&jiH+cgf9UId@v(62X@qaivwS4HVrBLv^R6i{GHfe>B! zW2c$cMTx!zQ1I{_a1#)v^SPzu-}4vwCg9(w|Zdp{wmlVI2{*;_i^nf-}?Nj zG=SrSsWpr~oj}}k%2@214A`-$%Jvwa#eQcRa~1CZkxA*4I*}Ue4&^QFzq<_fzj^oe z=Ssuz{^txwW-EZmlCP>2KM8j1zZ8bcp2Z+b)SHF3F0XyaVRV~dx zaA4H6T5r+D_Zt_d$N!&+vd0R4ip7DQboRgr-U4u-eQc9Ma~p`_cCrV2zJcANW_6XH z+2C;E^a-hvbvRy-T68gb0f=t=I;y9o!Om15W7%{H91f;a`K$B*(eSFt)`LZ`>#x5z zysHo#j5PR+^)2DJ#Z9#%Y=3~*r_8ezhW(~aS^iC^0|%v3xu>VT0I}G~L{gOz?4N0V zzV!#|&5`;NS(R{{_VVjvvV-7FwzQjl-wyWow?)f-aDhWer|Q7ZCh(REdHJ6wzP{Z1 zPF8O-IEER>Nypg$54CsoYPbgY6j6M87A}LsH9z?;fkxoS8~=re>oxdD1Dj&kEI8@P z9s1#Q8=M8SjTKw<;Fx;ADyy6iJh?5pLBrz)j{YW+uPJ-+b>DBkF8=|(MB9eh;67j< z=d5|b_zGNh3?4t0kpV7mM9WWJISKwdLjI98uMwXq3k7gzn>ynQ{C6(v5G$xLvOr6=y}T{+33wHTDX(cXkyWmceaq zVpS&*w^h4-ek>zcfA?;mQZDlt z!Fo-+Qu5aaeEskg?;{(6^{nkz7yC8T$M}hiJOrD4-j5G@jR1E`yT>p8MuN>w!ic;5 z9B_|EZxaHo^?>>G@Mbw#K zZ%=iT-J}$b>i7uEzKSN;1sc9_zSIiG9NFj?CPoO3fqqji2G`)wN)t^l$Pyf~sFnVE z9|4^FJnTPY4-uSiDe!VRumD>^+(i>3Zsgy}kNdokXO}I9Jd)Q#PHw&T+KD^J!!s=T zDSJ>CnEK{Gk9v2{yreePJzPF(1!Mh{$S@P$KQFg>Rv!EueQ$V_!)1|&9~M$oM$Y`t z|I5JJZPZ1%;~rq%L9t)u#bX2H=7rPWJn%kZg{H|R_eQ**XcfF3u7!M^;pK-=BI;+u z`{jnvHx%wlbqV{6dB`w*0J*yT%}1Y*=T{xc_(A*+`Fizp-|=ST=;O&!aa_pN!;YQI zyM~h2LdD#HTzyme>1-r&c8Um>ogMOZ*^cuW0mz$^xrx6GkgK12sk<J=ZY!x3dq+rN1Pb!p!D{VoMbx*xw80SuX8-uNy7WDRxB+Oct57}h&Y#YnkDk}+naIay2#gWOTD>-`5pCc+WVcz`>75+ zyB8ved_8Fw$K)F*?Papj3H(22x6lp6`%0yIcHg=h?uC54M53RFfBzg>mN<$4a`tKJ zCx0FyU-y$QjXb6dWmj!C_tMuPXTMUM zz=6CzvfF<^loq+VUQGMWI^^t6d-ue)B3~D`oYCHaeBCOi4Zp{i`!3cu>Fh_&{x`MS#~9r=9Z>*{@(LB+_`X*HBKk-PttJ^Yh# z5&617qXcIg^7UPR9KSaqSO3P~Z7PGDy;AIBlqv1Ndh_s!TX%7L^7g7`2)1M9{aeUmqxNr& z^x$=ws4Fu&_6zG(=7Jsz*p@sz&m@X?=3KhL6fc>N^rz3M%Vxfr(Stt#$OY{TeREv3-$NUp(jWwVo70W0d#{Tkl=4=5lahx0Z&kA`% z36H`g{Z$-iJn|zZ-!KP4dd4pkdmTz-6Gv?HKVcgv$M@#}P^yA!4%*(w@zb63cT5#Z z&e7!8apQSEyQ=lu6_4{}$WTUH50p5t>NCYG;XE*L1?3$IINL+SbV z0To8qvDFKI$jdOW7U3eHZtV`J${UcoC7On9&sXygqfpJMTWG2D8_1!%6#~)~ zfIQl$-4MqQ6?W3iOYCyS5+pC_yfx5KqBXer>&0SVWp+;YKtAo59ki+=j%M4kfuUG#z z7X^JG8ZT&4(buYy#G{11kHT8J*iiSt-*CK!bxT&KesLg&r|j8FJ&m~+rK<7W_kqkB z9yiS)02E`b&sh~C-gyoblfF;pR2x7}5cO`+eg@>~&E!<_fsn z25utnpgi=fwPoW(p4}!?v-kh}*}c_$Kjt~?oi?ZRLx5ZxJ9w8h7AVZx(Gbyl zN94*~phWn8X3-%7nR0JnllToNJI@{>Ge`l&*YBUW@FtK)B+VQZ?g8cE+tb@!1R$%c zP%0Kln3H+9X7;@o$e%O@%;qs)!kZ+%cQXSh1-07}X77O_namLJ1M@bq!6iI9ZUQ;t z-P_qp{MI!1-p! z<^-Prju$cA10(BgP!jL;%H$I-luTM_eH3oNoXOdYQ;NHxf_g zI{wnf6};bV(#^}U`xcPs?XLe4afG7YQ_dgvnF1;JiJD#{@*xu+X@Ox9>PPJy>d_Z0 z82&qa4vO!wpVG+0ZHBV5AI}y+(RaGf_a~Ww6f)>MI9(6LrY`*F@qPn|ftk=N&V+T* zk@QPnq1Zg-&$Ho4ATgc#%2G=WMSZV#P`&I0Qh3yb20Je(HoL>>Pe7i__?yON1@k0f z61Urg(xKQYAv$3gb1AGGf2NA}LeY?j%!|v3K#KXDqS>#7yqV+1qR|)3apcm;C>H=J z>he`C_ev;saXsiFRF8R_ejWvJW+?hO@$%FwLm;JxYw)$=`L=(|71sD0NC&o$^WSU- zQqsljpxca49F!C~Zm|F)5$#pq>}=%qDzRpDi$JOjCvgWhS({|wJC z`U(R1u_k}55(ALm{!-aV_Y=p_lA9}j-jIA{-i2spU>-}EBs*e*xflLDv=NCoP8Dg3 zTat0!3QuEkT|th%CCu7{xyZ(SZSMl|fg&g){F{v#$}r_~QVhq}`uySYGDRo}U%Bha zgE?#U+v$0kX~UqsX;~ zXgwN_TB1Hk`<{}Dx=>W$PDa#ILZ3dz+y-OK{Ljx6tPhkd`)fj>y?o#OTY$cMYbNqI z-gdieoaD<#Ju%l`Vg+@oTT-bnu`aN^Hi_IfcCpFqk|`8AXf3A~i$nhK(Z-t+(on>d z6R_EG5%mWbC?k64YkNTDg?R_2-2|3(J19svq}Ev_0fkQXsZ!0~Ab%wCX6V;YC}Li# z{#h^z1@W}>9FJ6?(9u+3=D9xR5Uz;{pEC7rMusOLgFkTRh$;`r>JuFWp_i- zkuL{^OfV0S5q8z581pWV-)Mn>S*K z=}@FacRv5~ODK3fw#T%-@T z-FEkMdSOrC{;kS3Tk&)NAlWe zWM)waBrzBl_1%V|gVWZ2kD@Urw2$NJeM>0L?QPI7ivkkma^!su{M@x%Y1`x214a3f zY9YQYK(RS8SU>j#U$?&5V2r%|!Trm1E%^OK%{f$p4)cI!s$r9vn3H|MV-RMB-z#n0 zCTNc0_$iDWG5VJcxu@eM603|Mk2CEWv2Pu6&KEBR#3e%B+y!Oo*bvnHynUrKQ4iC1 zzi<)jC(e+?GO*rJ-ug}y>tC<(jVPh7iz%ID8+CUHp(kFbSAG(&Z$|yO+|9vktluFd zh594EmK*nom500|@|*VqH6TagsNzVxI_iJ)oh2Ti&d`#7x(@X{nex@DSbw3^G2nze z{8Up)2NCj)@+~k19YSBVaF2=>rsjJ+LzS=L06=UeDc_*q2{GuE^5k z(M(R{zr*uuL&%{n3`7f44?y1HoNN4NInmlGi3RfPKU?m+;0gJ+`b}Ef#i2l<&9U}4 z&V#WnZ0~SgOrfzeUA7)GwOHy+c4qO6@=35AK6&xs~vat=X3Sl97~XE2XfdhMvN z%yFD2z7MM`T!SJ-h7z`!W+955|Dfj_-hF0Lwb?nS-w5okZI%+GST=1QaM`r z8z?f6ty=tOm!mT3au;$h-auX7n^ndW>nU&3WYw`=Ke5653F{r5>O0jTm6Jg=XZ0HD zL-dIroT!IKFz;DKJy)2+coOSx2<@(CA-&jn^Rvun$TaqqQe9U>pI4ywNlVC9QxGsK zEk^y|!gyf^>H-03UYI9Q+jqz--W1YFBM1Bja6e5(_>XmsKerSb^WLSmzk+f9)kj{y>P!5Xi9-h`v-Ubb>Mzz??|imsD<>;uQdf!l^`>u@Aj?;ZAg{4d)>y$5wgwgFWbk| zKzg$Q7nRl`WO}Q0Jbmf{*+zmrlaGEt`WBl5ZT(Zotdm_0@y4>E3&{uA%PTn{zZ$*#hCkQ&r+uat!QS(Yti zbXE&8PTqJjgk5;q!Y`fYTA&wqdMMlcnGpemXtl5F-NiXxq4B%2XdHi z+!(vT1Q|u$j1Rp_AWJuMYCB^MvIm=!=moVP>yCQasewBb3}{6_9=6iHd3>=42UE zGkpf*W;(<>cQpkHK7oV}s;w5U{(~4b?Ya{E7m%FoK`nD?81=>uL9?@{OC@fE*JIr* zw8Nka;$7Ikv^qY=dX%6fQyKbv3|-$%q24-vU0nlxE7wWtM^U%^tAYQICuip^zil{- zz6^G;y8)2U%yLR%stSD_J`WlmL2{1G-sypQ)OA;h7RS)nL3-vPhV>(l(+&hc{KLXL zSR03gk9*a>iXMR&b!$#8Ph&{VE&R#29)mj1z=mKA_8ZlJgbV8o?wivmApTM9)oN!A zNchA^P{>|^m>XHG?uHtWTyV&`p)&>IUCW#=)^I>V3)6=^lk||BH(d1NCp*M@w5jah zJ`V})Tf{HUUJ#>6n?TDk0m-DrN+#r4@$PSEtQpcFp^e&>EKY>vqQEF6{hbi+e>!{n z#u-THX&W_vn+!49d3E^~=&OEm%k54W#CwmfP=7lF3Ed;Y_q^R8xeSc&&mV;NcypFg zlUYcZ*x9C6y$&%(y>7ym)R6pMquHPnAUG}tVubg%1 z{i6wqJD1j<3f0XIhWLe^ zolH|FA(0@x`YMJKViKi~6=l*v$~heoa|t5EcSq{=?k$5vuIA=keIrO=HGOI5*9-|Z zG%XYZDM+l7TF;_C3Nb&ZPPeddLCU*_Oxd;4kRbS!=RYmXMG#9(CCW7*#r@a(Es5`t zXmR=K5iU_kqAUz9eB6Xsw+qU}lJbx`T$4eqJ^=|+UOyH_v>{3O@{@te2n<@AkB*Ib62hyWQF}u7fa8CU_$?oe`Wh2Wb)vLUmstBFO#|B zjb9QFecSP_(qBE)-#+DUo=2T3$keU}>XVY_8)2Pu6ohE)0~Zg{ z2%!EXh}BgMeb2H+Qk>8?%pJ;f0fMg{4!!Va5kjVA=uZ?Bg6|$8(-~Dw^vy`RxcEWv zl}Cq}D$}vw+zWLI^H}$heAl22!Pl~O#UE6Mkl!T1{LMq)%lypdOFH`Q#6O^wVu4^e z1Eu@)Sr9VgoML`s2%>eMqv4wh1S@C8-Sp*wkVOxYslWjEvhqKc@DGD%{ox7gzk(2~ z$o=osoqrHA&oY@y6${aN((-|~b0PTF-=nq)mmp+w%S3s*27C`}I6pbt3DKsGg{31# z5Ul*8u` z2Em5iUb94P2&FmnJ^Zi>L|e>fQ(`F)96q!3_ij6ciZ5pgY|DV}nHKHvoaA ze*}Ub|KyB+>Hwj~+JagX{y?(*fW7(>eder9%v7 zGj*Jq4TSKhrIV8WL1=rzTQX4#^CK;3BGn%uG9+%lDGeZRPqoXupWf1A*AHsLE1^g^T8?|4y zK%7f(ke1Rz2#QL7- zNl_!LfBAEk<~KOH9MP8lHHSVv(@rV})RVXsEEQ4DeBge%4}Fu(udj(=-Pqdxk3Trj zl(d^O-$UP|F(C`SE>V&(-h)_2}|qK@2omu}Rb zvvp4A2Gf{(BQkq#EXfq^0+ zBUS>A?zvShVMlmtC(XYzc{jU)CT;9~aJx2fs z$@(7mS9Rc+ef5RL&0yfCxD}l|R0BSS!$~jfN5DaNwAsWi3>@QVuix~$1U?!&Vu%@M z!NHbc>~h}^aQv*ml|x4a{(D<7T7q8S6E)h=sW%1=+I^ot5AFoVs)7*<*%#pRNa~J# zI}13x`|hilxD%Yz7-`06%iu($5$F7o8{o6F+p3K?0}g48tYw6o;B>@v>>+h9_`D+B z7&7w&$K?Mye8LFev{J(_PDukki-fLw^v}Wf+1sX`R6H*6=QcgZ=fNpv`z`g%aq!jP z=2t%749;g)d7J$=!Nu9!{gBZoIDR91S*C&;{In#$xm-*Hr~8lH^Mj9obEWMP@AFW2 z60qHN!s;q;mVb@9gj~<1_1*D4rF-yjRY9QtAv5^T#oYS*w2WYDyGS~-^?+b|qy3hR z&^dzF%A{_#&;{UoCrL{;{}uI)H(wn7pkAW3-FFG=8mT^HHG-|3?dA8nj|sLKDn|TE z?F6q?g!5W0bf(6ey=L-r^EF#MvD^!TTMZs)LU48<1LhV={&*KWjg%$%m%?$yX|WFdj*2m z<{nMH6*J&_#U2x896_*kW+nV6WgysUEz`E-&;#FVXV=P}Qi83g^uQARaf0n#e)^IZ zZwOxhJ(N_rEC_sc9plP({}OERHhtfD+%G-Pkz}t4;CpFEX`=^xPgxSvHRTAlPnw&AiiiYT^QZu>NMqou37`sBwL?zNw>hPXd_LCr zjg=S!fygEQ#pP8X@C95v^wZ`v!8YmQhH=Fif-SMUquqrFe3{eVOZsmSYzJAF%(|`- zY(LOn8e>i%5LLc~cX-qQpT_TAhEzPh#u_WNFRcXIGU-M-KRMuYvEDpOb%0=Ju+zzM zyntXQ)7j97zw1a$?<1VIy9a#q!?1stkzmK0B=f5a^<6wu4b4=*C&$!TcTax+?^q>$YX5llB15dMiFitAgM_cduOk)d0bM$wyet<1Xf7u74}! z5h6GdI?S1dst8W!#B##<_Yr(k6bK$x({RlH**BMuI|z;jq_Z(f_Xv&}^t;O(1c5t) z&EzaTPsLySS@Z3q9|$fxXQQVmRRrhFJ4Yq*AHrddC7Jz+vV?&C#}6+286$WOS5>Bs zKg4a5CtDfJxE&)9CLxB~U-^Q#c?q5)LW}Ff|8TqL-Eago>hoP6tE3140|B8?aoPmW zQI0gezgoC0tP`f&fUnPcA9?u{Az*OKM`uEV;5oMN#^OjaZl9xdZuo-RwB-t6tAv1& zlLIa!6TAY-Wq+AoAOxKfWe}`wBoGr0D!GRj5CXqH zPf*KfCJ+VryDwx}6M`KzEbX-M_gnab?|xr@N(lNmWzqkfOz^h$`Tjg;h!D0rcld^% zIl=drlNC+xTS7>qd;Z;7F@o=|e`fX;mk1HL(s4O;%}s&E_tkKKQro~t+My@(Dzqeq8YhZ!`0KF_UyQhJ-H`h$9r7A{#A#P z9*XPNc?|aV7~r~f$IiXkxW1kD{SV`Vo?3e%If6`CzKL6jZQKKTYKzTQPMm!8(CvsyV-|8u@Uw^6F zRmP5dK+&PxE_j@ZxxRe2J8=EFp@sAyJ_mx+f??pLC$3}f&)yoj4isU_ zhRqUpT)$3z-Oxq=*R6+S%_}bBI`(`jtF>%gzaG>50sp=wK4&tVKH+}O#6+{6=|K)E z$wLa+g?SfuEeGV=C2D76Zmx6UI`-)evHBz^iB;Nnhn*Qp<#UUyW@IqmbDduLEE&&- z*M0BVOel?LPhaH0e8T8H6}q${^k1CKJMslePdK$sC#2)L_3qZ;xem19MCi zBY!d_DGSKIj_Oirxgux3&uekz6!LX%OM_N?zQjGPfnBo5>Bq}0OWjGxm)DeCbMUze zChg($bnT;zvbdusI>=gb%6>{o`;2N;mA z8^nv9Wks%j_?U#~HRSAOB$l-U$k#1y6~>Fw3C+aJ<{w z3OQ;$M6ND4CB<+BIlJxAJJ<0%h^#QqpT+SXArs3dg6DPTv6(41IpplB*A9m3BVWH? zPm_w{?xOj``OFIB?B^TOFQqy zd{^?G+okjP+^1{1#Oux>|DZbb+lfIP`MSzr4And2>Rk+rAC-}_pWX8`UJ|eW6Kmo> zijb>6-CAVD+!giYqxK2Rv(2YW98JUL`$UGzyL`QeT%Fxz-}xuV*$W!Ewil4ES3bS0 zt$=*}=gBg)Jml)~HvUvy$l29Zc9?e~U*8v1&5rAdO>Sw>wI9J&CHKrSa_sPP{-qO` zCpq^x$ki+!>zB%xgi5hJN6jmN*UvfA{Q~2exLxp}I@Jo>jKeLM-zW~Z8`cZOdHCFC zQYW1T);+@ppI*b(d2l&1(@A>gl(pa&5?54RA3B?i5CUnkD16kr*c4`i;k2d|8 zq4P%$+x~f8%vF&kgcP`##DQe~hyUBjtJp3)T28Bl;wX#sw3`dahkc@Hu1o>Rtdak< zi6FK$ZoEpz@wp5_hi*7N0+Q9>nPV@tu>Im^a|3yM>^r&}iI|s>X@&n$blve>{cqH& ztU^jeMA;*ik&L$;G7>4WM=7#L1KE4;k-c}JA@Zn11BpV3q(Vj#S@q5D`Tg~N-E%zm zbMNPK@BQFB=RBcb8=%tB36j_)akXO>K8!lD0{@#I;mlC!l`wv|ZUEP?4twzc)VHsM z*m%8%Ds8ReJ5|z9>H4r)`7`zxxYjP4Rt!RwI>VvC@0gPiFsEe27 ziDd23gDOkfhsD)~P#GZNF8K=e{{Y_f3x+~aWt8EfFkb_IM&xc~Z%DcB8(%ZgRCx0sAG^%|U&*8!A@X z2BY%u`*%>dRH{r1D*L+_`Khq)pnve5oEttD>LniP7Vtt<(rx3vPw{z}lzcHyTM#O( zss@s8p>FQ6lKOW)J~uU=vIKYg;u?70ukZs@^HT=g!skJCOMNiS7JQyQVxRd~>W24q z@D*DjJ*X)^motkwWz`3$x&$UZ;wo=H>^%iFTmLJi*2;vs?TKo?ogHzFcrqi-4b{C( z=fjvnp%OOA+2T<9Jx^nV5p%L=KXx%*)rQ+gYwN2F7jdoB z$X3T(lhJGOdxSruUTk$$BU1v(-3!fSdzYY0M5OK7)D@^O$or8=y@>Dwdsqy}TIBU>`UJ?iLPj42FMF;7VVftTuNIw z5BpYjAN?C+hPtk&+c?wDKTsy>a8~Ie<`5VbaxuP2!u{48)JI2P-F)sF%qyudWD5Mf z6LsM|YO*}Rs7rZYzZS{Y1Z83!Z40KDqhR!<*|`*tgH1l`oeSnsczM@!(+xqz=_i+4 zAEZM$r}?HyO(c|Gi!zLi%E7#cn>U_~i$TRX`|2k{?NH8Pka5fXHkA7YDJQv_K!wQx z8QR_04{*R|=w;pmC=W{E8duSSGO4+=?w5JkFJncG1C5}Z$H^zMU@MgSC%Wd#=s<<} zn05a8b|^o3OE@!_5%VRS&gqMvg))++86%Hh&)qlJ571e^EDjPJkeHKLzl@@6>;fDmF{Pl(@znu+K2(uib z`iprE`)rT6h~jf)hkm2!c6<)mDsNHF$ImOkhIbz;_NO>HD?ZiHp|%_nkBC z%&by|$}s_1y>9#-+t?X*KX(|awU=$#Jn;VPUEYXknunT@H;#j0`=RnbiaPoBT+DAd zyuM)j7ph%YZ5R5DalO4#HR1*}i`ASC3Ycpr-#Io?iFtK3A&TZdk3sQduukjF6Ht<} zOObBX31{j$#IJvT@-)>eW;K9x*-afs!Q1$aa8^xIcItyrKWU4|{9`55-0oc}k(X9mS{o0n|5P#?}#7l}KI{Q~`i zFQpaHADvCPdNu0@6wex$z2G?uC7C5-gA6QCn#n&aNW+IZdseL|eLm{SO@fp5*-$jZ zCUcGj`$h__>p!`SqJFQt5>iI$2U+~|MlZFYZWNo;PK=2!F-MKouY;!4Va@)Y)4~X3MG4G*K1o&Ldmn~q|_>U zC|X#f zJ}7=)cWEHoAIkNoU%a@A{W$E`7yX-BpcHbt8|imL*=T{9(%d;HXO{6+RKWYTLL!dW z(+2yA(rZ@=1E6xt!Jz9`PGNsaizr*=ODG$kpjy|%K0cn&xk~Ay*e^4qc$!Q@MJ1raE9y?`9{QD^Xllco;#l29_p|K|N)E{zrL^l&nuy5nv8ymmEAmr6M zY5!6pfBdHFvJB!+Z{NE35Ai0wtS`-oyLNpV$i_N5qoq*HIoPDu5)s3^f=`h#hRmp& zcbJWDIT?#}GsXiKMj?OP@>1gwPsATH)(z@oU3b8456lPHwAXA1Oh=yXd|3<|@|l-U z7%wA!w9CchBIJLrn;;v-Q1Hy=ReWAK@xOqI}@<|8&-d>Hl0)>VbTniz8;y-@dF3dORr1Ycr z&%ymoG>c!hgZ%FSiofbDq2R?nCGB?f(epcq{dqeKMKqaCI|_XvfAXu|dAeRG=o;%= zP#lCJYA&~o5oyR@dLbVwvjYlxSsIeJt3$46%Y%as*xx~abgMwFS zS&Y}VLeaJ;+nC3wU(<*%bsQIff}xMAR!0^g_ZUY^Q$Tp@oL%dR!TsDQkzl088MV+AG(Lx-aEtqE)e`6{A6P%R%?S#Z2Sa>CG$60~3zHuDFN$qH#m*G>LBYsU zh;~^3=0wn+oIb7$#k5))M+)(IdeM8&sWc5J=51hf&%yKE>;Cdkq6_B1yzA8bz7-0) z=;=SV^yBMXCnLgAP(m}2{r5;O6c*jQM88`Bipy$BMDXvI5-q6#36W$d6Z}eJw>Aao zqZUoi=Pe=AsfOW%^i@c?p19@g7FEdc^HV({V}-n~`~&7-eX%oZ3CPRkQ4l$THaAS?>T9ew+eQUd97LF z@{b-!31R6UTUCLactLjSgGV5J`iAbBgDhnF2y!tU#HU+SQ#Rj?cu4=lsWakO37HYk zOn-^8K}t-Rr@iwa<}EzVX4cYx^rZ^H;xJ{%4175KJ3JV2(tjP4rDcQ+j%~y0?ETmm zV0dboaRpLt9a-TxCj>c9*>)@h+<*+am8#)e2O%>pN-*Jy0OZ`cko(y?6*5li?HXdb zj(U4>d%4OSq_oaT3k4*=t!<6k3VA7zAsyyq{p=ECKC+`VKHmX3U)vv#9K+m;XP5Rw z%LGG~hQ{3GGR!^rck@;=7uH2>{qgw|6J*5R%h0zFfGkG2s0!B^xTWp0e~bSw$Se_< zRq*G9>;nR|y&7wf8lLjX_}>A@O&RZ>^hck$)Xty9Oy!VuZ$9y;nH=QOm#=E9aznP) ztUjj;o^PM;$&x*kke0mod!LIUGdd24^7d(C=TzGu9A)yT?Z=67dTqQv!ZOayaXLVcnml4;PIQ-_(2}J&gEgyClkwSeNC~bGjYtuC>nm=Z}2D z@3#v9$Y*Q+cOoD06ZbmL)Cv%2kmt6-Ws~L1^TpNWLI#aPXCv_oCMe^qOM;-`~9Qq`?co~v)e*Mk+77j5q zol4{F`yfu??ey-%Z;*WAE3b6xafspKzxnZEDa4)T+v-01AB4zNePDQqIS*&~9Mx{j zL(I;kdq%QvAx^u*cve>xk`1YK&z`#kG0HK{cSM{a&i&7SB^%oyL{CpPsJ#u6U5%pe zR6T|m3EeMJH76m?X01%7vmTP|%ugru7eY+rXtk?J1H|1aZ@BZc0zy26xBGl^g5*3l z`S|Sb5M#fY_44vAh)bjkrT1xu8P!(nL%)03YT z6;y^a);ZB4#wCc?lqgKSf;@i;@6mK0NIk0;;mn)}5tq&-G#tJSiEnsH7x)w)sm3dm zdaeS}W0XW^x|~qY%`%$MI0l{-19ZEU?t`dz%oO6?ee1IymPi=>buVZTFzI46VKOa!>c z)l7O0SAl2U`56DKArN&EfBm!yk8_FgnVnM+xX1GOj=0EzXU&`wyZ9LhT68aY&F6zU z_HfeqqJ7}m_@8W#=SvW^cHqdh=!Bqk$(_1D`SCiGBu|4!q`dk{Q7t=i6JL_o0I ztMDTHyV^rQ zzClg%`C2Y`Y<}L8uxl2)Ih%LsDt!ha(})Ir2R8_@RQt2}-v{uh){ULQ{#369>2Bwo zRtTZIx9So58oYw6*7h5ifzRnaDW-8f5Rh4m+DXX`p#vJ*BtafL+q0&ew(kV*2KshQ zxm^&-s`#>G1AW<#cJ;~$?*|`>4}HJKt--fOcVZTEK*9}8%*3*diR(N^?5?ZdiR+7> zA~M@PlR(WHn-{1j3GZl4x_3pMxX!ID<<@8+|N2t4#}UNeXLOgJ$GXIemD7m7yqLYi z%L(h=OJ7qcM*cLtjprZajn_X(W+E>-!KWmEc!WN~&uZfO!#8{hHEq{d2BUP(MoHia z3D?>2FCe@556M5=Y{n{F=8)=E%cM$RKgKd{^e?OH+zEa5%*B;JmK_3jTZjdGA zW&;Q_Ow8Cfi4xZZ^TSRLONnc@bhSnw8wfKtXtvYi{+4>i&KkE9*S=cjJuL$yP@C`G z;Vesx4aUFV9evcJ26 zi`iR1m@;-mwmONpu9|3DT8$Ccx5syTrY(c;7RSl;XE%r&4bwl}nPTGlt+V#~`|Bj| zRNuqU-QFOy*w0v}rcK-^KGt^Eb`jT4%zE>EcR}b+$n46fHF4WsF3mAMO5CWb%&w~ikJp+SbH$H$Y1n{YATkZa>BbYY{iy z3ueC`#*o1DGp`>Quz`?_r@`+*JWi!=-6q?Wh}&_?hd+dUK*+K9S_pd|ar+jy*VH+f zxE1LX7ByQD4AJ0MRlW~`n(0IO9n!?@&Z~&K=Cj1@N<$d?k1rtjDD$z&S83v2Wt{x- z-x_hxUe;k@>nA}mjysfs!+`$*MN6v37UHg;xps?jA90uabk;z83kakvjw@M55>K-R z&YkaOiKp)UTlACWB>07ZQ87E_T3jCO8%qC4JZ?_&4DL%K9&W87@h^73K?bgC`m4`L zm_~Lvqt-*>z2o?w`PYubo2txcz@81bjW!CYxPOxHv1}HLU^NmEb_}?WhLHI3kwd#G zLP@~f{kB#{GvtG6`c>VL-+#9+Z5!elQmh590{10 zu-&VXgnVa2*3Tv6?Gw(d>SEmzvy;$o68aCO%KAhKxw-2*-8I!`Btl}VmSfv567kN-*WRg!#IGA_ zM&~7vo9Du>PDApLF6SH|5X%r*sC7FHGrdjEpCV6juJSv-BlN z&^@U8piPb3e6l%JnQ?$boK5fCB7dGlQuIsp2S<~e@%sa9{^XNLQRz)?S#1*8>UR69 z5eG?FporyoIfl=ZvH5TQ)g$XO57VaT2iw#{y9Ev11 zbSae0U4$f!-Qb#fI7otDht0UC?j_OH+zO>`CrOOj4$bBhlqBePlzfI}1!yXeN_5m+q6*zLX^S(z>?z!+a9wq;l!cfFDWrrmUQy zXd-cbPdvQmSxK^6ME~6Kl3Y!NzRC)4%k~u;_h+AI1zr5JTob}_%oHn%Y;5(?~)2BBdGz7L2Vu5 zB=LOY`QvMcNXm+Mez#g9Nf_ZXKE9upq~9u2Vs_Lb$t?1NA9wvDX>k!&Q|YNBNye6g zAv~RAK9Gy|c;rD+I-WoNyR8}X+mkQqN20H6@6dVc`(L1Hy=DEv#Qrk`N|KNgI9ouw~|L;+?9OjaLf6Dd_ z9FeEZHJn6!TI|JZtz%A5Idg|Wn`Z*?b&J4JGpwu2Sg%4|T)eBGt>HEDryU0vP&eev z%ClKVolV@fUTQ@OeW8NRuie}5|My<}c5A55ynetSZzqF3ZS<6p>#V@2)rWb^ z_a1v(M%`W_L09hv>VXSPx{4e{P`Tg!>4`rN(4X2__wR@w=EJ+W`gJWq<$R8LxW;X$ z9Bm;kjIz{ertXXEFgb<*YgHEpQ)LDx8u!;Sgy;)X*LS1}jf;6kG+ z>WK>P-q!V?UU=%STb~;8$`$FJf?=2wA7XK%t_gJwnKSw+m=_=S?P!Xp1Nviiga3_+ zL8WE8&^tlY^}Sx0)c%Y7{e`98gb{_WYJY#yY-3)W#_pXl? zGht3V<6Kb{zJ7C8&{6~H?YfgMwmYK^9hMS)CHg<8?5WD-B{%+`55FPh={p&_csOmoZN-z<1LDu@=clQ;s4~Rec zk4gjf+t7${UXRA>#k%^-_wRUpMd&O`=b%4( zTeHrQIx5u9_Gp<=y~DafS&Hw2$hT2#?mU8g!fol(m@jTU&mW2YyUK{fF@+cCE2lkA zlQDQ{oxJ5gV!r5AM2Lw~r&Z2*P=&kR&AiTcfTj=cWqTWU={e0CK{p&)`^3SpFU~f-G zB5fR0cv)}#)#;7?_1+qZ3TE`LU!`S#vj=_aGaC;lx1x{TF0w@q@Ba*b!8f zJSB7iee7Yw4DvSUUzgB$qKW$Tog#Xv>+|Sazp3P(&xbzt-rc{{SU?= z@9nKCp`v>E7uOcNKevm_P*waw|N72R`|HtAsiJ;al6w#8{L$|(m!e<3^S;It^?dZL zACx#&jn9wua+PGO(@>#y`_A7hg?PO(@U4FRioW%kT>qF>d`>L(^r4TgikdG(@NqWY z_l|vr@jXzPS`nPju7v*elW|))zM+5Ja(ewP-k0-s*(VzCeK;ZQrB{ge`?c&-ykZL2 zcSC8Tupt`Nb_qabkkqkmMa)m3pthX?dyBB|?v1tgK`HdF%O~h0 zC82*kLdo~AHTu?5zIZJOqmO-9ZM$zj`q%eKKTRA%9W|%VX!zCtb@UD6eDrIJaIf=6 z|6dPJid1(-z1KZzSF1ewrCEnhxSTXdj~?sk(p z5r5u;&oj*g{nxDTSoY9oA}%m-V-V*fcsd#71)vXpH?LpoVVq|mYMQjm6+bV-l%`1h ze|fpbG)tuM0`B)#--Y%h#Hl!*O^l+h?ltF)xtZmAB=4#y>!7~=V0FOlBkJper*fDN zqpt3@pYAK3ADb}yzh-{a*Y8p#6%C-S9ugcV(u6v@w*R~55~#0xHgvqh=kU3+?X@SIw~-~DPaISzI8IPEtBfI7R4p^X>%N~OkKJW?^=+{Vz-3RX~8 zk3D&=e)$Gom6_lQD+bKr%J;*k}%+X*An%0hHp+D=&O$k zpR1PTK%L!vGbDil??<7o{(boQ-B$cUxrFl-jOe;7N+?iY&ruW(!}CZ#*OyI+{&5tH zPPf^k&aM=+bL4{##LwMj`0@fOKdFjDJid;)`cJpT-Pm8Z{-5vty9xL`&p;ni(~0`}liX8_XHi#| zvQRI^`}psi-yS~fzjWEcQ#giwnJ$F}N9sFI^gt_&aifd2tIae}I zQfEf4;3_B6=oyH0g6f9f?js*lq_!XZ&hrPmTxCAt%6&)a8HBdMQ#DBkrrjeo!1relnf6aVW->_AgVt z5Bjy&j8up#lxaU&`1mpmN)}Xex$*NXSx`{g$Dt2pTJJ={JgJ~$N%6}KR?J;kk`4Zr z?+?Y{TXN`EF&9Gb{DvWu2$U?A<+~^t<61zjmtTXjld-?q=5TJnddi_4tX#Opet77M zKJVzg6?gix@p_Dv$H^y9vf`+a!GwJPD>ffm-{N(8>bLs9#2qNz%AE5qd;nLP`gbFV zP@F7M%W918r|mg!n4zFNjrxrq0_M^OBf z>PC>RAe7x(mi*Kk0;Mue@%npvarHjEwYnV2vZekEw!eeYJ5C-+VmSBUj?F@Q+$!pN zgSjqpk&bZeJWixjT)Mpei-@-`YOyVG}VLj~e%uo`d zY7!&z9?Dm57|WRKfU@1pCm9@2FW-H|fR78m&*La|{2Hc#@})2H{X*)vK0iEnSPx45 zzEGKu;`d6<*wG#8bC?ftnfdz8}eBUq>Ss&GIR`8PIi4A9SPyy|;Q+YosQ zwNDQn5O4nR5_7i;&zRQTzVQ)pYjGI^)UoYzo%>cWkKwpjw1C}C#2b_Z$sh49z}Z*C^U&{Z0^APh^E-pT|3jD zSUzQS!fgoi52D5#FXTbteP2n-dOpa%)FiCaWe>%K>9(UH4bERU7o}tG1%>zYwwC=r z&p@%-uD>r63N5vdMB3tcw{pd(-#{O?t8WvVLmU*VXBr$A!}${DzuTrBn1RCP=Wb%} zaL$R!+k8fj9w@w6d3*4+AQV1R7ruH@7V@vJENnk^7m5u$!|AvF#5oFovzVIqKw^?6kgvK>U%{K3Wwyr*nZdx`AL?Sa;ve*nd>~DQ?OT3NHE{D7lLB3&N81?wWjoqQeF!Tm&!= zBr-s@ZS^sf$T^(3BAo-pxA@#r1@X9M^lc{N!l95OLAC!J=EZa+wTWY0@m9^0p{~bJ ze9p4!=9T}Tl!tXj`IiF}`5T;-;dOn9)1t)a%tIir3tb^TbsXJ zlZWg^5BoXAT1cyr3pHJR19@uuHhQD{k*^he@6ds~-92NCD#RH?y4s`>|9$O}@JYnW zrws2GVx1XlVnHwRwlViiQjmYoQD&%ye4GIHMmgfjYN~E@=tH)9c5X2NvYVKuTxQV6 zUX!u>Rpb)#Q++AFnvoaFx7mIL>qe%m4Ke>ftyF^lAnLB+igRZUyu-TDtl`gekXFl* zzxz5nR@^hjy1wBd%#+D(@@X&r)`hs!tvurh$ck7vyL?$1vhVq57#)a!v^uKQ zSgLl&)BM9@k#+-lwxWYwTOj*xB-^1IC8>>(!8_O}*h&gvXIgQSB-c{x4)T%Lo4xRD$epBHQJ&(O>?e z>?QrJXOI{CP-tAP0OBLvN53>K(HU!8jLtY_K+FY%MY@^c(KTe}g??KPAUN;Hp z2maPXNZy2e64XJv1J8>`j+18x>ha12qfFMqkoPa{zMR)MqyZGwvHQ^kF7O9k5_nIN6e|D~Q^b_RY&n(`12y-Xy?@2kkANzWq1$3Af zJ41$lfb+2xQ7EJ;YWKb+0XcKo_qfB<;MTuw<_9I@p&;!3Sm@6J$kMrHTp*5lBPVo* zXX*PO|Ih%7=*xXjI9J_w^v-vPzbdMcnNk9Y78gs?YcE1r!|E|TA^@rW|9MXH+(MpR zLhYU$@|NpdFGLXk`EC1HIO1-@KEZZ~N2pj)aYI-mJM}riL`V$~J!b2Px$al>nYN+N zCegyz^ZL+J#CMtSYhOitjY;Wz0OB2WOAI<#XJT}zj~n?=F-E;d$TxX@aQTIN>6-A? zCdAJ+$XZ82{B`PURVSPv(NamIUup#F`rgc^AIBU7slEI*BM^Vhzr)MW2YE{8i2_!v z`*?tT=oQ5Kv9%-%qwn78P!J2|c!V`QeWqA)3{nG=3S9onhxi-Y_vRf#|GDM8cZ*Y# zxW9=}okMsWfwE>wbJLJ$!{leWW(#5W%9@RatRXc->n)?&3y2R8q@Rv4ghXqefV(fM zAT?(ZTBI14dCiNVoZ!)-(?<|n`p!THs z_7F&V*u%MhC(iA#(EU=Z_Z^~4+L+lc;~WJ+*V3{eoYz3ZcK=H+3uMY#5Uoxb@O&KS zdAs2>_?YZ>qrKh?l0Flh4D|&Ns`2}`#Fqu+13iB}oj`uK<1^JL#J>xtqF(CxxV7i^ zzCDO*WxvrTSXZN8gt_FQng`P)Rw$4!-QPdeguGOk^XLB%->xAsw+fz5*t?mN{vw`U zARgg>bsG9@+T+OIl;nUetefef8j3>RHTS0DX~YdDO3Y9JC{k~YuyyS}e`)VZl_bBSoTNVc@GQr2}>HA*vc}Ti7 z4jnIagV2*^JoK1T>iI11o9g48;A5KNTYK6NLbcbV(x zd_RJuFogy#5MZrg>v@2$!<y zxO*AJGa%vfM#f{s972EHd3%+;8@zP;{u-1Iflou(DazAVAoS(;5evRQ;Jxj|YG=MC z_{RE@)jSCh_c!&8vD^n?(L!d2L%6{!$3Sj=r5${=7B;lckBv=>1_e2dYC&PA-7;O~mn zLjFq3{S!8b|4p0n#Mc{N3f(T8O5A&b%_*+glVFAZymZQ+AR#OiK0NXm`Tbi9>7|H! zcddW>h$={kvdx>mF(vL_6;CAy-X`vSZ)$Icgpyz)eW%9k14!^*IrVPl4RN2yysR%& zMBHDC&K!0U>o~}rD9nSKP(r1I)#FG zP#t}}I@L|we+|E&I`$C6qvmF4ton$D!tr7q8XDpuolAGMtce6ief-jRSOvto%G$W( zt%%3|H+m!Qw-ArL>#bYuc7RyL;{70X9pX`A7eVzigm@(0KWC;cOoDs6Q#KUWLB2mg7_3obZp-wRn3pu$%{q=3)8I$UjeW96n8jCAk^bsH-wr}=$#7lz+ zBZX^+WjOI<*4~W%RSB~VSx`zDmo?W(U zh!@_?tnedI`*tiazNaS9?9?x!9$zMj-}D$XlsZVzE|Eq_ts1Or9X=xBhINe}s1C(q z-LkC0%Q6zhZPX?^_k%=pDDS3`=)}7D2cOHolAzsGx_&{^xZgV_MYij>-@*mWHFn%z z`prQH9TK(wy?m2bDv9Q7sybnTuQw$Y8?(Nj1hLh<`1#I>MDe8itw=s5(R;63m3Cs? z?%^1j>PiyDKlXAo_XLUFpB7A!=1da5m*sYQ93(+|sn5HA*h``goHyIG-b$jm`8V91 zl1LD{>CQW6pOC0SucBtR>?6@4%BH5P|B=KW&cPzq?j&e`;|KT1_asW><+z>w781?x zAuDn$mjvxI>Uz-^M50tvcnp8sB+-hKaRHHuByo*FsEMbB1W7p1PPxUAC^`KFQ&u_> zef0D0$&v;VBxp3z|IL#`T~gh3p(2Px+sDTHOuZ&a^ixTKl_n%eM^=hghMq(jKcKWZ zp+TZg4QEF`TPHyZc2|Vb`$*ISU#Cm|-jV3~rk-onQ6%Z`j*BvVj3g*vc=B{H3A$hsdR424L|X{u$BWC87?Qfh{$4yu3RsFzD`p}=BY}Hf$RW>^ zeW1H~8;M@d(D`Temju-?`d+NoA~BKQtL}^~lUSRID?JB~kz@{KuLs55B)FiGJ2E(i zM1M1S-*g%M{C%sp6H*;Xu;K%wzd!DhxTzyNWwlZyzP-#*XVaLZ=$?LNmR(Llj|OoH z$*GXo+us(%1o}x_@)Z~>F(e@l4l^k<&Lpk&ujn>2Ac;cupb7CLF^=u;bTuFCK zEk!+8d-E%oTQW&ySv40=86z2jA1~NWrIUo&!{&bROUTbL?~l2F{Fl|4Z<>g+ETyn; zk`x^+F~yI!Na{|d?WgXBkqja3$zF>NPaiaslIwLTvI z?xlRAqB4>p8lo0)rIjQsmTr35M&SGSZ%ob3grx5J<}c>;9Q!1GUa2{gKvGUyb)GxY zPg3{pKXq)Dmt-6|r#qc1NfOpPcBx!nCMlHW3w_M_aCp-({))pc9N zIKSZQ{9^mTuSn8%#IypIBomTIkdXQA6oqU`Yr$}n=UfS$`2T5Xl znDy-1E|PZU2c^JSN0QDuxUY979m(2qu56&liX=r#J$Xz~LQ?xQc8xV=c$)uDl!szW53+vS3=`dy>_7NAj9# zE=gx63`>?gxUD}Ihs^g6@Uog|$j!8KQIiexo;rarMahd)21_*|Eo zWIZ?@71ni@q;rXWp-e{p-UAh_{JSK5?`WmLg^MJsO-iilDHTcQwQx9a&Yfhn$Wum{ zoFVDl9j`1cj*+aF;zO*{5+q&p?PZpLb&}N~L?PcDNYVvTPUI*bCt071X z7xx$k$$IxF{_5U2k}eaxQk)@1vUl2;Y(8Kh>6d(`_rz9`to7EpAgUuI{Y?7{QO|0U z?Yh3pS3HKKHx~Lihs%&`6_LU>r)Wre{K=C&9+o6W;Nlpi7+&A{;1GA%i)6o?I)aW1 zlD?^!!m~b0Zl%7Up%~UDnNgWfKJ})PoDVurcL)iSjA@0#SELt6{tdRl=7aqthhZ$* zzB88OZCjW(|Cfm8)lycZlSB$7J~4DfTp_v9e+DQf1)x0E?U)VgZ79nhqse1bMjeh} zQK-6l+sg?KUZ^sB_8=s_S8G5f0<(7qN8sB|0+a! z;QV!u(Y9}>w^unWG#R(!9QK6x;W$UAU`V=lbjMF9AL)=A>)wKM*!e!oe!)C!2l_{M zrBJ_D(V_A3&Vll-BRkGkjc0|!1CMBp6u*>k2l}G6BNYSex40@(`D_(G$Aou@A8j3=V!SglF^dO%^3RsCd}XokCy>f-0)5HT zMSm!8j&M~7U1OQfH1@qnO=ncx$2sgh53a?SL*>x)FB_gaI9K6-Y;G#%P~2iJ_umtX z^Vc=b?=z!Dy`8)6lrtq%AGOu*4#oZ&b1mb)e>ZXddaC4~^IkaDrw^=qn{e*BKXtIC zAI@QSo;~x72j{Q9+#>V{^)?ra>{G1hqfPwvlC7`~^Wh&-yQyG51pQSbous$O>!`9< z;k@s}Pc#k3h7q^@eAwIx@e;1eWJxGZI{v}K!U*eT@AvGiN4_&a`v&URE`cL{n3G?c z#MZBVGYIi~$Cq32{&5u-F`f`WymNjckr92OI*0%3EW`KD(pCE61FV}azIj{(`M|Ft zK6Qxi#OC=x)W;N5mDWF?ANV6h@?7U6v!L;9xvUG zb<0f;w&y{ahsor*#Xq_oT=?+o-h9QF6R-BtHNF}1;SDcYE8+dj8j`j1)n(MnTnc8aP>;(HVAX0W z$9(uBEY7?H^}V+zYCoJp-)@`xr_1Pvou1auKJNzQT#x))1~6~^dd=FwW)t-9-uOeu za0T<>_YcsuvSBW~y0+9h>VXZHIQ84EL&-9eeQPd$4u_N!@A)NSEOMVuihpM%2=QDy_MVsrN^$mVC=^GKI7db)>S;to{>x?r}LN- z|D-5tBNFrBEw|s!xDMs6AwiAr@%~D;8*e{Qho95o%))W)XI;!@Md9VE0`DcU{mAuvnxO^$GH9Rb4#wfp<|A^b4q{dh25AxK544?)<7TeT%(vBo9Gi~7v4F_ zf_Om#O$=b&{okU;ijbeDs+?5Cy1x_StlY?l)eCVt#+B$?ubAu}>g%meITJ5AxT{AGP5eft0bwqW=5Qm%g0M6>oq(_9W>nKFnF~ zyR|3C@GAP(r3$vXG$DUb#l;i#zUdah{mH01r)j*b_@aWo^&`fnU%#V|{o4~8e=jKN zZ=0jf$K%YJg<3cCn`frbiFSvfk6oVPi4`sS*O{6IJJ3&FP-MORH0okY0jHLxeW7UZ zpK0dDal8+-kDS^4f8Y9L@mLdU^syh+@oRm6*ME+9`=B@a)=k%ju@9<*B3z;9E+_ie zby}@?Mjtz^@MQ-=tz0ux&o9Osr`Pp+6GFemn8yk212R%O;NK;p-|FrsQkz2 z1L$A3qTbUYj?a%joiSs)P%4x+6{AESd(Fd! zl7r}9A3Ce^7k%maHE~spc-^$~G2cvRL?65H8=Gk%^sm2Xjhkjc-?~7{l4L9T*twWw z_}}95j)OI6e;xYQ8K3&h-+{8v+RhB$o}iDtP(4ngY`_$yt zbdO{IP9=p*zsgtiuj?oc;P-1`!?&P^nD0|){M!5V*$~LL`>|)34)s~NG?%osdgMQ} z&h9yce1{8|ok2V@G5Yl+>e!5r<0^a*UoGda2tb{DzhkvtbII`wSZB&`x~2{FaE;Cj9nn}9NMGL+i+VVZKkrU=gt@W35uu_pJmm1+bD(l`kj3&9rCEJAE$r7gRj>VHYlx%=V5ZK8;;VWz8*d+ zwM!dybvKq7F4Wyky*I9MZ$o`O{Y}olpHNJwO1!$qP*>NOQmExXon5^|z%dW?^}Ms` zKB$kk?p`gtb;;%m>L&i*cNsv7$kRJu|! z#qs@krpjsMhsSX-`6Iv4UDVgdgma{@PsG68WBC)#ooKJG*4iF`I{WnO#nY&F>rm#~&ln;cMd{ijacAIvAX@SohgO*HE3_O(|$alesSwMu|~^&^&VwRkm9UpID9 z9K-&a8MZ4AFULc1j^pndJ839n|2Nu-x=(4BQ{Z;&2P;0CtSLx0iSrsbH)+45Ln-&` zZ=IP#sIPBX8hnZUD;v>yrXGH%vlj}fchRH1ZhP|dU<>3(ot#kk?18I%fg#l{NUwR$ zB!hZ%zP|(KmA_Mn|Bs^Uj>qzSqm&hil97l~Dr9DsZW&oAvn3gkiV(6Rd-J|F@9Ujr z*`mIoJ5m{?NJb(J8nTnf_+7uh?$2|M>wfm5oco+hyNKs&4~&PLxhH-DZlw|9pby(& zPctL)VDt>1e`5-D<05JL4B(4QC!b6K?$Yx^IR-`>;+|^?fJfJskNkw~uQ^i>y+P)+y6RaYUn-|dwT}pHS)T<*kPpq8t3wZy0Ic@f)OUEmT|fZ)xb!4Vc$^% zb*a}ftD7-3OoA+3$`81a`5{;6%dM)xM`mZje2i0iZ09gZT?6G!fv;Zu0Bdrl6V9se z;O(ebMv{5_L;M}&}cAsUmkPTJU6F2ZWF zE+6!rr$$YW$%_SGl17V3h~#$|Yqp#>62a6+mOB3JnxHGYn^v``!+24oM{pa?s?C)> z?-YosNsP-hSZ7btzGxoHodx5`9sgoyFg31yuWS5iOgfpFLzuUNG1~sm1_{VtzsX8_ zGKZ<8h1Unx%P{Fg)Zvj!*)aNU+SK+FQ!`9@G&w=Hc6Q-DuG|l!wQTOm44n1i%!K@m z1g8E+|8++89VVSim}~CLg)wMfab*>z-u+zvR@EAlh);Ab!#Y(GakP8+BILw>;=g{U z2XZCmm(t3+%rGhVvSXDvoKLWJ4P~1mruGFHtEg_mq{$i1N`VR(pAF=i2H1=AT!$K7=u#WyL22(>#u_oIDNvBlhQJx85Iw(Jc4~rYJhcz}D8(K}3ZcGr#)`ix_%zeulnE8#39Jbm;4SVEMJq0N`=S+Uh%@ZtX=BK^*w+1Ezj_z^iX?*Y5*9$i<;(4e;K} zPhUp?en&rE zKaxKU`mBqby)FEEE4C)j+x^)w;NRs@goc6tujc#XR;XL}ONM_}XDP=l7wl)jgwg)) zHao~Kzrq%wWu=B=YhC$EEg^T|@D|pNN1)G+y2R8-&XQ>6-9zA^z6FxOao@?F@^A35OCYIwYRsD*{C^(LB z>E6lT0+{Hw=~i>~2#$RyUG}6g2xlER9e>s1A0~WtqE94U#>8uO-vy4d;w+6ZZ%bIW zO_-D&suak8z6KAL(%%Q-*vFow9I);uOMfz4P%Hs**6)UHgZ^4XkBi%kE+*kD9dS#d zMIR>o+i1Q@_=Sm~J<(+?H8{58A^+yUTAX#((e8EB8BF*sG|VD-9uosh{4b7rza=v?V5Xgz4;LRN%PnnOQb_OmNmyP2cS^UocVOm${A4XH2Z#QIOwL zhqEZEw7V2`Osv=1zv4BD(-eh2-hK5R$HkoC`hHdhXWQ%}#IiMF;+-Gy52AfAarwv{ z^SB*2n`g#W^BEnd#YLsM4eY|{Ebmgp8iH{AF@+iSH{Ot^p-VA}--gq6u@%0oE(G8G z6=xMg7o0tQ4I+@&a6;3|zZu3iaJrrJj?uFxaC%MGK1(_Y=X!~hPR)boJn=@h zU@6q?Z~q)L3j8^GoZcVc6ZlX6&;&kckjR$Z3jHexk20t`*}s7OFMIMK#(avmwy#j;e2K+E)HI~ z0_2nZ`Y`b79UtZX0MFy)v*RVy&An>*Jdgcu)(*9O_rd|ehGh~i@>qp^TD5Q;>Iyw) zKFpK?FUFf5!3K5hmjtFfV7~quE&FNg=ga35W$+9K+}3_{^qL@6*`Pb7s}0ws_?2f_ z>UPkpKT)N#MR7ogZtbCOdvHtl`yJD)tkF=gR{ z5<2?W&(HOm1FYW*2vcmc=h%y5?(Q#ef&4+g@Tmj$7K?E}{I2%PXe(C!rL3kZNW(F8 zh-oGrGaX@iWcjv7l95cB2y)o}J_TLyA5~?YW1AfkC^9H@b%7~*y zzwRWCRjgs;ekOqK?j_m4^B4zodu)wnX~nU8Ctoxe-^KokkA?U0+2TNVyX4T86s%NJ zxwJ}>#IX$_%c6Vuu)n!8#jME(2MQJB3i4IqSpU+yPZJOhunjtl%~NrZ&(kA1A0J?a zx)Zml(|tIu@V+UQUw#4}ymm{f9_rL3&iVTQUQ4mjiHEuy@7(;lfEVA=;_D6ku0-#j+kwyf zD8%CcxUOB!mm8IRIb^{d z@LukPXFrkeVXJ>5wN6mi<9ly!IEo@2*|NAFj%VBj0^yXH{R@qbRbmZ~<#LR_d1$&pxONJioZhwH4&MH+5_#a0V+4 z7(Cp4w+8uY{C9{oI{^6}KoQ+l@+gYpboB5+1FY1O{rUOD&&XF@x9-meF61ly{KiK7 z94qw>-;sa14f!4`d@&mT2>Hs3i+5UkqbNqIx$1*oSgAb>xn$f$zDF331zdBGudKZJ zsR(nd)Wt&-{M&(iO-`cImT+A(?+QA-7)Mce-wxDZU##>%;Mjm8EArJ3w07Ha0M7Hb zM6(e;R(j%mA?f2K*(_Q4H1OfBMa|v3d=5qG3cMtcD}m>tEQXu}KK#ooEmy$V2hu2P zfL~v7Xk1?M?cy+pd@WpHY_QL zl07{?>^+zWb$<+uog#oQC5g{yLS5Y&Z;%o2`~OAtBESRoO0(}nNyiS3Nrv>HWUnNn z2(x~awjO64dDa+3>fNwaT17B#rtfrDFx0JWvpP}@I8X5YKaD6!$N$^T!aXS2yE(Zv zg^bc!?jBeb=RlGAbMAA$YQX7iKE8{81ts4snvn9)1YF_kHs8M}$$+0abW9H=`%CNV zBqyWv4L>t74y>a{!@p$mR4q!&@lw?eMob0!Nl7pk~w0JF`NRxj;n)$jY$-%Oz@~tyU zCbC~DEIN$R`Bgrp{yc>uFX;4a=S@IKXI0VTj}|C7&gbX{gNrEAdY_cv<~=AW{Huqw zmMKcEp?H<-`h(JU6UM7`&Z5YhT8dZKPoSimJV!1Z0pBxyB3A0uH0aMC#?p@zqNHaH z>1F!WD0z`BQ|lP$m3pq2G9rZ{sb}ZwkF=pAhOG0x%iyQ(^%k5HNkow`MO{sTjVRf+ zxKDai8+_qg4>w+vMd|V0s{0=epvZNt+ZGntD0$Oof*7$4rD)j5Jbt2$BHwaaCrTxv zl;~dTrn&%>>ce|=<-Rt`5RzB<_O=j3l`2_8x$Q^E3-&GlP!LL)Tb!sehVQ6l+q}1C z1R|XJEK}9I0})=An2f{vl1%w%_VrD$ZiHWNNBiqhlp5X=^72{&BAC7P2r4;*qU~6Q zR33as+2_(7{Vh%)qLWjORNdx z_=Uuk@Lp%jGm9wey67iW5+BN~(i&5+OG3m~ zo0`(Bw*a3ezpJGU>V_oTSH42syU~}DcTnb~_m?C>V^Nly@IF5+Gn8AsH~$6b=fqci zb3_E^ap|n1#!n3M=5Dn4Spm4$xvlMSDAVEd-+YZilyzgX-|1NdI_d9AuDvf2@wLa3 zQ{&Po(|+XMCEF~N<-YaR7s2O<*u@z1+LnPbooCugH`$^rui1e%g-*~vQk2lLRlW`(p;2gMC@jBSAF7zGTm2AzZvaCSplUfHE!i7w<+PvqX+Vc zIPmB1?*|l=dG*f@OJ*_3@_jx0c*GD9-?h%3cYlX6LnyC9*+8F+)64Es3rD$~c}4Hf ziXh_H6W>&gT$JhCwj%Wx^w&F<%bU!~5b>i+rsU2?D3fH>@cAPNWfd*>d;FC~x!+Fh zidz^(&`xHne@h3-OzhOzL^y`Bvc2c-ZH+<1Imgc7U5`=bK%relts~0%%;Qn8Cj|88 z+coiQ|4^F3$IB5jCsF3Zkirbg6v}G#ukmT0M`=Q@$Iqu4p{%p2O`_8W;JFe%uhdwK z@`&t&n!?X0Eiur;Hnsxv%r4l=hkq3n(;y_O-;DDCS(Awl0aC|A9@e@4X=ep{alm~qi^AgK2pLO&X<2>NQ z8Ioycz&mxuf9(NWoBTDt4Dj_Tvl0T}!$j*hD~R&&5cx{x9^gy3L%w|izDtY1`4{+d zmy=K901q`%6v2qJ0j~y&G$XQp&hYlYolw_vb&gvfynWwShf?5=s2?ue z40THypSN%z65G*h!U|1@e1gY`B29vMTl%*DKTjH z4d$C*p+~+#Bu+&;(PI}8*=VBdP2_zRpJ$UVmBS!Dd7@432$Z zrh;;GI-1DrR7Bzx6inWziO8q&V+GEG?%kYo*-GXN$~m#N{q8##MBDwJb7ew$Tz3X$ZCK1hikKxD7~-v3<_K$MU5!@=oADChDRE9#g>B&kHZOEGhZ z40>#Ss|(7xuyy?3p{`G!i8ug<`CO+11_9iFHBuHUj!6Xy|?m9y$E%@onneHYrEb)me3=Aw|1b(AmB zaq-MyA4IXDre!meQSQ8c)GrqiM6-Bh^oi1fXrnLGjT`nNdYk9haKU**o-8^%`0y&C zYPi}R^1p;=3SYt%%ghn!(frhKWCbdaU!P!~N<;Jp4e^!7_*sD zs~b7J8@3mPeM3no|F~IRnyVdb|98qku^9M~$_P12L_0f?$d^q-`Fd>Lexxn1ebYjh zM+oKX9^{A$S4Xt--6vP{lTiK%_Yj)rJw!V<;?6$Bhw}9w`X@%ie0JHcJboM~-%L3s zI4lCuZ0`qCEw-b4!SiNbiW;Ih8Zg?=PojLQ?ia_G&mx-7 z_H!G1exm$a2P%VVM-a`ObyPbT_UBq6ySfbLPdvf2j|@Wj_u>b?)EgpNgmBA0UtW|? zFx&JomV{`Xyn|zjzY&F(=R*qXenhLdv(;1wq5NTaUcHYQh_2)M{?(;-h|;e)CLRFS znO&TXVO@_Xo(!$9ySowes<~V7hKgt!q^z@)%ZOf0IA{0+?iZ!*zpm8~#9T^tIDdN* z(T9>;hPY%AlV6cNYX1pD=N4GoVP%L4+gGmJu!JIJ$c=_AdY~iTt!bTx{4i#tpJG*l z5N7g59%gfCHG+Vz(9-3>r`XsW8auH9 zbq|^h-&g^kI#9MF2l)P)=5!z6N&Vy_pu=goYTzOGJNmsO#fj^nTQ*sZ+_Qnd<8Rp+ zR>B2(^N~X@PV8C%UjHgSSpqzFMJ}x#>PB8KiJ9PnvJx3_hkM|UyLFYdOy1b*kgpA9+4s=@v7lC)ShTSLGoQ&t4zPn?QQ&(0bw>_d zs8?!wd=9QlHE(uuP&a0_%zP;sfccIe)k&c~#{~^Pu2|n(!pv7+PH&LXz|0*kB35-9 zaG{yW_xSR9T<{>Z=h4Mp%xu3|M+M(Tp;36B#pN9Pzdil3IX1)uCFU zL#4RT!J&2PGbb)+J+Ce~0shXuZNh)1J8yFMwMDcj;sRDi_aA@gW3AmQ zXw(Vo7owkEEiZuUGK{~wW5~gtVQa{BxQGkAu@d9w6F=1JV{|4q=QOwDLjL`O2I2a+V6SCd@}4=+HMOPQ8YbbwM>5YI^5o)zH$9fdqHLJi z@r?UkY!NQHFet;RWP%I*H21P6%Ho2=Gp_e;y~jmcrN>^GdgG$ztfPD65^>>YxA4@n zPPiaO={L0o)+L19YT*!r^+{R-t0~Ioap75}R=VJRT=e5%V2rsg33qFp zW*0n1E1VOjNLO*`+w0jw-W|BOtB9$(4C{CPc@v7~c^q1{;j+C>|7`VgF!WU?W_}|>zw~t89aW&OsTSl^%tOERDcRiB<$U0S zOGxeFz(*AAg?=y0sU4Bs7eQCw`7Cw&5y*{}?Rxhy^eNQ6tZl8e0RBcy%KxwP&Ju#n z)B|U7=In1@4Dd81IL0e51LL@4*KzR@j_Juz&1(|55sw_l1et12*UGRs@t$X05eqA zD>I;P19Pd);?0u*%v2*#0tJkr4}17*XZ;&YH@s)@K64}J;x@w0@b`VDLfd`ESx)G~ zZu>KT82YladjDH5V#^<{SeS#4Um`=vV-@0x=hWxucOI+Z}cC2bI9M`oh^AFcs z!GGJ4YB@NG3rvKKQc9q1ax&=(3%u`aXU+(es6ij;kf)`NQ@CJ|UN5?20)5wS1cerQ zV#X_2{qzvtbK2Vsk_xP^Y2j9#FoWl3xH>t@vjsD3IE~|lVckm8kK0&k7#G;YZx<%N z#Y`_Z*-q0`=)ZntctqnA^j&v)Sx^xS>ocAin%{=!$cNu~U*uz4OqtW?EpCCn>&>z; z+lAnJlC=L3ALJyIt9-k}34Z>&{Th4CWT5YQM1)dQ3G`v#NWEbTc{+Dky(t7b+6dlY!hj6qMhk88Cy;wIpiY_%WM zI_C>`so28B4^Vfeh0pCS@N>T!FN1#6YBGDw3v}s^w=ej?dI$R2;L@e{6u_%@MK?=A z4!o7-N3sdj;YqhtZ%kjenz-cV0DN5V=;jWnTa&#Wk`B0(JFhDPa^EdREV3^^4m|Td z+iW)E!>2sFtqJQrSOlK+uoVN(8tPVd6z2WsH+Nzd>S_maG}tihIq^96Bn5Kfb+m76 zorZk)1B-hi-#|V*;ZFfM80uzID|AC3Cw}(tf2>bozMe}*%+nwjp7+e=Gmty~!$-t@ zDjM?P&)s{sngaRoar~=7rjQHY^-bbMH{`?*?mL@s7xLjZ3#knJgIxFxKWz-}gI?Dp zT2gWZ^5H94qJ#AyAO4D&N>~)+!bjJ>Q>8*qJc<5C&=B(B1KGE_L+*Ni$LfuH;0I^h z?eMB#8Ru(AI>{g33i`&Y}Oe~25?TrHlyhxdmObK_*B+Xl#m7bANJ z2|-T$MtrT`4O8w73w4qWARm5>FRFhXa^VeRWJ6;y?Ssd>oC>T*;2P9uEPy^4dnme2 zZ+Rdm-aAhA3_OpbQ{7Ti&>x}Ug=y7eA?UY$;G@sWqmUEN(baJdaxvK6uAKY*>;L)i zBzxl)Twru?ms8w*%q+Tht+^A{x$J-U#)P9BeBxJjp6#~-zxgAZ*A5r^fLj-zRl5Yf_3Iod9wOjVpJYk8a2EXQJPp4cPlA8_t3nS!27K%J6&%&~ zf!}WEXS5Og>m!!R9DU$h&-%5|lm~q5ru%q1yurUdkv|3BMT*J7RDCTE_|{nhjXpqM z@ObjJSKHwDjVAf@LC4C&-;Yy5xNt6UE$FP9L{bm}0f1NQ(kF0U({e`H~1e z_JY?nq;B+TGWgfGGUrc$|N64@=+0T_NB&&NRCxvJ za!NVrKc9ksUF@YYZp3+Gdx!X~2f@d#b%>Zs1^;>w`+c1POo<@;*mJNA=M8*STXEbE zK6aO&p{J$bU+)suB36NK{e|F;^?2~HKe9;P`2qUAv)ok*1fTko0w)7I@a3=6d+vr@ zu-u+8)q4SJm_ip_@3Ff8zICO2-o7i~W6u-&>?n`3_Nd zRx!?#*y@Fm;WP6ckr(p5l25c;#|{x0ZVNo;9H+7HFTE;AN$z@W47PHzg~37_E8w< z(YJ2emwy9&TJ<#blL_e7+%LcF8Ua1LXL0C+>y#EkowP^L_f_D>R+P?+03Vs_>Yf6;zLA%KKj7W54mY&`Z+l+*A{+2z zZ{6!UP!63T#I(67 zKwXQ3cvT$mJjudq?8MKwtM*JPzyMh^`IUq-T<#v)}8i_3^{8b^8)h z->8DV9+0xpf(z#TS}H4A4mx|AzcsH8=vZr>u-@{$2oGoi}&&^%l_CRg9g3hj&$9GBtXI-;*%wJvvUES)%=Cx)_G-Y4j&gTKX*o&Jp z94v8G%gTq2Q)8G|_1i9o|0U?`pD)gY4S~My&!q-A%xMb6F<)0YFtJXcN&WUd92c$W zp9eWV**05WJ5<2+UecbozSa*q`<5Jyd)=U~Ke>MEPzX+2lX||X#t5e+8u`_$4dQq$ z37v!e7je!_qnVPYbvTX8B{;&lfYT)11_+slKwrNjN|RW}2@T~xoK>JtMAiD872&fu z{gSG7NDO@6Jj2th<>hcdlz+ISa|etxt`9k1@nQBJFMVAaj;+`3{ryKBaF45WJAW9n zrdOzOfUC532$;fl4mCmkHH^&%sQubdmu|Dh_Xc<;cM9a~1w_U1+Zexuu`1`W20!5D zlI>HwV0&Qt?Jif)iCKdK|DA?9(ZrxfGr*TdFFZa4{KFR&MI;zMS#JJe2zd08iKPtu z{5h_vxFay$$xSJ%z=zpngRYVlaqI&%(Z98sfQy7UytRPwICqrQI@C?S@zm9_LRE0Q^meH4(q+Ngj7Voz^#d`*YZzh1l(-uwTYX8D_7y+M+E_2LCy z7|%uyxm9A7MX@-)@9=&)5=Q5>vYiibY$L7lFY9I;kp8Rc$MHWd7I$#$z^$5&$vhlDqO3&80#9nQ4cW5|$G#rFdjZzf1U&vCONsY{ z(RbDO!(FV>^kJym?-h>ys}Sg;3hN)L?bnyK--PjG`-@lGaqRcwCTG87J3AQ}fby4Y+W zrsE*nsC4m9u~>08N7$1kI~@O@hRuHi2M+w{d~@KZXn@WH&B zHp=^*aj=5uNB^t>7zv3^;@&tRfiTgpyBYaymdcjO=SF@U%R&ri$fFJ%ejA)1hE?9~ zd*;Yj0K9NL&(WvAPbp7V!}^N1N4aJDjQ~G2c`rB+`El;^dl{7qb*mmXcfxh=>1FeB zw+3EQ*ELBOc)sTke2oEL`TD)-FW}6h%dA>}2M&rnSw=BIn(^lpl7TRE37t~c)I9_B`-S?;AE21rwmrPM=JBGcLv;D(y9oK zQ|N?7gVqkLQkV8`YR@S0Q{@dXY@;AQ1L2zl;y>Z9OQQ?nshuC?w_@kW^qs@im9B~@13NHRb-BTQdVC@enx%o z4b~%&pWZQ3)|c*B#mrGxbjxAnS7^z#|0kS3gR>`SEg!{9N_m>4-o?sw`v*>hpG1CP z@0u3YpCG?r#3<(U^pD)Kkm{dFL}5c%u*G+%i83&mb5|M;Cv4l5lKsiNP7 zy7Awy*&|z!-(13fr*?nGN;7psTShmafMy4-C&v9Kz)ggENvQ(G9XE|wRQwMgvY0ew zd$b<~@FnEPDz78|{>*qj!C;MW(3VglWiHrivr2bn^QpN|) zy_D<@zmHNWl%oZ2E+B&OzWahD4^ZYVX|d#79~A9BsJOp^1biZ8=;$us#kx(O?gaeh z_m!7!fPWTOTloR_2~kHePN*{qn&Xp0(E;p#wl#(U|3q$boB_P*wfI2%)LCA?nrS27V8TtUcOP+`a^m`9b3Qb?BLa8)2 zjh>C&h+x8szYFr9ObPDuH!Dw~=)g@D3i5ZL?t6)fy*bo9bsw4thq_w1J@B5SGQ8D- znu?%q>2_ zTE74h%p0;&66z45#7DvA!POcLSxhEgAA z3)h+}Ai}u|Rt8RRoQGa($n+mW(MjX#Ay2lW)cUadhqC<$?#l(nhS;MIB|@9=)1yhaE+?>3>ro(^2ZmnA$_pLPWUbc>PVl6pFq-wwtp% z1rdx~mLfwBAwrX_@-YP_%FLDj63Nm7ee3rg8#>p52nT;v=I!uA1nR`Aoc*^@^z>EM z^KoN{&?fx6TQmWD@_&5t@=kyrdC;OyFb>7kmpC3Jz2Pe9}XS8so%Jt%$Y znDEAdF5tz55{CcJ@9^EnaS`f1eX!;`gtF&uOk3#eL%AEw&YbaBMC2k~W-lM?Z@H|@ zSVRqF&xY^tQ&2{^tnS+!aWl-f;8+xJ2W9^ee?Fqp4nFHwH3uil5V_Rm#Jx@6zh8~v z?Cw8_vVR*$mMdRExoo^qI`Wn%ePzc5UVpeRs{v;FT;)*i=4ZqwR0Bk=e1CcNsu0T9 zsFXRf`z6X=YAZ?M{fBZl8PgX|1fmQU+phkVB$UIm#J$y{ z#+KA^zP?J7!}f^laKKlTD{%jrFDFJBTz$J9YkfvJ2kz+a*#)|~s*{+c73h5L?v++C zPNR%{1TE%LCdv_&;++knzaI@M>!7RY{AK0DA&!PrZMdg0qSluNA`(VK-_gplr=F3qhd_raW0QnU!lE1l4ECI=(R zkz(%b&Zj8TI9|Kd^d-tQshxj31OD`5O*seezd{+y-_4$GNkkAE^dW&S)?`T)3dE8FS%Z%M;Y|#+bi`Eey}d!ccZh2xdWny6djX&4!Yfe>8WoX zaGZZQ^91i*LD}P%Qph&FDF62!&s@GrM0Lx<=1Kbe3~&L59kR#3d$ndK>6*zqx*< zwx0$*^)Ce=S6`i9KfQa&w2+8k8TX(NI17gxzKBD{#|X`-O14>~@N zWt7&WKgwVGX~@+Oh^V(_e4jEtBRbpk>C@qAh_qEG_@m8#D1T+|g_vYcMD;Nwo2n=w z(v}zFeWeMAvgwOo?nDEk-tjhhx8nw)Z;BRnsFp`0QG)|KwV{Z@=8{=2%L=}AH3k0; ze?$^2r%U95?k|zlUP{bG)J#|XqrY?!eOpnqcJUY@$=%XTvTa3_?M09O+wlug6Mpb| z$&G;CZt0jhVTLHirDCy{?<4BtSi$eYYKXpfe#81FG9sB%OLFH3h;sNpwFQA*L@gZ? z(EJU0`>_n!X~RWC$?MaNpo9L&kzM;Z39gGt)atg4TM#M7&+0^=7NXotqj~DsAnI6Z zPlfg@BKfrTdZ&vas-YuIKj=2-#Zhwt&x{d0y^>EFMIf>`67c4O=Xu_hJ6-1qqRA)R zAZ)vjNJGP>p}MVzb~0{nq6#0PE%8+ScG5$Py|n6mEhD0aS7^{Z>Yq+1O5)5_Hj?Z72|DYOb}gG+Qw>pKcfF*uBIF|MvPAu za$2U`h$g0%c<#9*%v-@QOk4(DA<$(o7V2L8O?Tl%^g|nX@xBX)zUsrj@84O(`27B< zVt5pyiTCYS(*KU=a@&>Sqn{x9N@C1=;WvPDoHt;H_ffHS`kv?@Vz6@BZ>d^AjIkeq z@#8IswtMS!XVM19Qy4mKYqA^B*HPvBjW-ZY!iP}7Hjn7)i#ARF`5*?DOjqBTdx$Zy zgxqE(5pDksTdggXh<^CYv+t1a#bC?awT;IW(e@tyl|zK%JfZn`bjScPg!W}>RaPU$ z-y>nB-$D>gWlAS2v=q@1|Kei@cEs57xAkp>1fm^E3NNj>j_6L`dIFux5kpa7BoFd% znEc;bD>=3y+9~6rLvP^wVC_Ext^N>0ihs|w8wH4_(@^d!br8|Xy(JA#hY-W{+Dw$5 z7h>wTIky|HAX;eS$}vheqK6&iKHHFp7^Z{Dxm}@%cID@n?I)%YgYV_R9H}V8=)0EC zw;Y0))Pu#O2TVj89=E^1pNi=3_^%yvKZY0-hs74>hlo}-@ALX{CSpvg$FrT0M$FoW zk`iAlQGwm9`L!2~@LZR8J`KEz7`Ii~hjTR$Q_mulL&*uzHBPRctk*#W_hVOtyVy{n z$Hi_tA!k(BA4wl^ypEXr)7Y%8wj$>1rKbuFu#P14qf$yN2V&TNI&Ys_hDu&^-pVdH zgNlM(s!nzKqT+)GEmqC;zXykv*xr!T5=@8fn?G{)i^6uJ;ma6Vxc_3lm*-(!M4I=tIoWdH z2WY=2bBLKf8ry%w4l!5`bg8}9f$dYS-J{Ro=NWXfD|LvOwa-9_B^WU_9OHd2a1t>y zH;hM#Pr~!2;=$$j95M3>3ROOn5re~lW8a7^V&+_#vQ-v?=f*tnNsR+yGUKw=Pxr&~ z5EK1O621pi?$W9xw60pxbl8JBf(->}?DA$|uB-|Dg2uzbsU+i#_$#&T+&DmKo@3dykmQ5gBe2 zd&ICi#a;B~5h^G>$y&JMGGhFBC70@c5EVGpDlwinBE|#4tK`OhRM>Qf!{Qp$%^f^< zNBk%%R5IW8^GpR|-t%?}mKo%PH8FoNz1 zH7@_yz84kGT&$sT!{4pX27bI7$Bt>?*8lvk4Pff_gHaZH6fxr;uO=ln2Zw8+yEj)d|Z>KQSg>n6yWd%NpK`>hcK8I?1lL@@ozKaCubQ>Ow1_R6zJ(@Ys^IP{b*miAkl~)VaNiB;=A}l8OrY+~to+Mv zsC)5zAzTS`HF%+R$u@sr$o*+NGmGZ@11n^Zg>GJINXr^p#^;($Tzr*&b1-n=$o>ZTtSY3d}IRTuV1C#dP;a1@g}KFfHp#fgBg~ zg+6Y)5LCjA=>)M0hCHCdHoS@w{7lBw%R2E!)o|UeZ?CydvBUK6Z^aO;iD_lz=_2d5 zm~ozT%kq95rnd|JNb5R`X$!Y9G&TofYDG7f9F+|-3U{Qa{^1q0hJTqvp}_Wbl!$FB$a0 zaqhY$Vjba&X{T{zt@9nw@h{Rvzg17H6uGcZ0s^`z>Xia{!Z@{%BNr zRp7h>eKEHj;ki7oq@sDF0aHBV2M*iBV)8@fxzZ_kZq96*RMDHpl=we`LG&d|?&X-g z|IZNTsg=E+XE}jsE_W86i@w5?Fb^m56XBTLR(hlr{IfKBZAI$JM@*@8Qr__l>Q>I{ zoI5#-^DKAeb&Bo5w9xr0l5)YALV3#ZvIO#}zYAnZTk~Vu%_;d(=&L~8ka~N!$t9d` z>7%meCFFs}agq%a^D(XByX;TN5lk6eoQ`I*$NBp^%gbiuFfH3kTBdp*rrt9>Z2!Xv z=dZd?|H}nEcG38XO+`MYZ~mm3+Xw3n&h2UL+0%pb3)k^KAvn$tp|4ebn_^mU-6nJj z-pg~=&o*tQL0{=Q*Q0y?!nzbAoqhiWVVd-j)<^6bm{K;Pxb=Y(d_U5~1{yjsy+xj0 zd>{kU+3P)b+EH+R^r?n3PG2$er1p^NWE!T64vl`lkb`OGgiRElQ{nyWe)xN02d4Sl zEcz=EgqeJMJyXs%}Z@Bc-ztaNH4}BnS&+h{0 zmrhbW-cb(xLvc=x0pPRWrDtCTJjQQb@d5NXXA7D44h8)Cx+Z-B>ehsaJ1l`8e?2Pq z9_q%UpXtZ~-@acoAPn&44TOKKP#5s`kF5ywOLuNJAoAh#U;~>B-8Sf#9{AK&e-H4- z9zo|3;HBX|-M0Z(G|qn*igRw*+m&-(!dV~B)5+y@sOxq+dZ-Bcuan(#Z*POTU$Pd} zT2S{<^`^vGz-%9$?a);a_h%ZE%ig!dYXSHSBj3ae5eE-`YH!fAmF`Dc=n^$7|-o zN62Z&`Xcqc9M54=q?l2sC7fSi?_Y^4;D`Mc(Qr}P4EnEMC=IJ&gZ}GAsd3q`KR>;0 zRjpo}_5Fo}b+IQV#lPcFi#vmJVtec2Tsfc*`;ACfGq?|l{oxPIx-p5m<|_S&7y7Qh z59NQ*3Vqn8zg*S4iAmXfgi!n&=P(UM7Ox+HKJ11zjjsRizwS3JR1W>+pV~ReKVZi> znT)MFCu(sv_c7iZZik`&dTimr-d{LpP`v8dO=alAo-3pLa|ow5NuQ$ATQQkyvPZ^U z2l}p;9!;x_#o1~bjwk$u{_$Ts>~e1E;oK9h>JmSTarQIYAK7=fq5rzpGySJ`F*%{s zRj5<}=kl6GxLZi$>?D>Sxl{4rNB`kP)w6}~hG&&+bsWxNJYm_*CyX;<=9F{`M{$0d zO~`fg7dZF9%Ydv^I9}DN?mSL?oWFU~@=o5@@P2UL+2Uk_^KKd43So-kOyXQncOO5d zGK5-w6p!J&8QZ%X(yCz{#D}ZbSreiE`of0wb8R@gfT5d~1nYr(-!zsG*q{%4OWSdm zM(Dr({K_nnfgJW+fv)(+kjvh)n@5KMx$D)2HhL|Puf8|xv@7_#?Fd)aALjv&xh5p7 z0T*776b4_o-NUNZi{g;WE?nOnQUG;5+dci+fVVXM8v%Lbb|s&Uy(gjW_r&<60>F>B zO8tHd_#ep(4tc1f%q^dAguHhCtLF~(0e=sD>ihwG|J5=jY2ayFJ6DpbPo%51R#YwnN=_^R2sYK~DUA0rPmWJFii214lRPeltHJ3i8SK+xc^cmWVAe({-zfz|0d$-SKzPOz7IinRfOePQA6g?1r-qjyb#_orUZnAO6d-U+@;lg>T9Idd&@|svnQ51wP}S zfF5}eat;i{&-&Cu;Cnvicji_ghTr@hPY>&1BIn${+0g*ViQk0nFMB~g zyuG)Bw-8QKxm~#B=^!Sm5EkVQf({(Re)G5ye5cn7?;83-?m~lKIN|3CCOo8_ZV=Cb ze0T@D@Bc~T__N7x$TM@03m?qbNnC}T_z&%~E47dhpS$E%26}eThM$ri%i#ZJ_8n5= z!z#jM#H&^_;Qx-DlUEJ^ANkU&Pbm(-=ZtM*xd?d3+G*&A5fHRj$eghs@XpF=;%TV! zDD66<2z=#x#jQ->1@36X5rBWtGJUxUaMHNK9?+eGoWs+u4uWrdhmg$b5LOZTE0+;K z0Djf^%^^qN^-X7^??Bz0)0ANb;C<9P65wYK`tru5ga_(s1nBGkuj4Hrb7TR(dDg?) zsczs44ycwuE%9^mrp4jJy?Tkq?$bI!nix3nufR?DyoKk-Pa6dY&C-mjKwi8vr+ zsA|X$eDl71Po453;6DBlRCs6tzV)W-{Rir>U*Oca*!Mc%>qjyzA?Dy;A564ZPsIUY z9g=w`3bCJm*2ZABMewhOsrT&M0>1SJFH&OZ*e`OIcGw$n@V#gM4e^u2G4;oqCiAJF z|5J9jz2v}tp*g!1_nZU&dTitACb)mOn$k|SGT1NkzE!qYBUTgUgM<6zd1Q?hSZaUgM) zV?h5jj>p|KFGEd1H($6EBQ=lwcq&gUooNG|d`L~B`W{vp5VM$T`3?M!;9I$%m+~-O z4QoLs9#D?E!*?HaY{^F3L(_o2&vA5ve$Ro+uN_lQV3q!k)|Z<@fal@$Dwzeob-LW~ zBH;6h_O4Zc-x3x00rPH_AFheE0i9fJy!R{>cv+?Gj$eT{nNUxh1D>s6(_aSQLCZ7h zhe7`q6PxNu2mD=S*XVAjE8mrw^AD@MnJzOue#4ElO@OKQFetP}92z1A0ld0P%%L;0Yy2Pe9^*I||3Dv`H`F2ZrI zT4mIOp3h(R#7+7I=xY8PQZ0(A9T$ z@$CiOU2veP!}AyD>pbK$dA^{dCk;6e!W-wA6^0d+&*-t z44k*5n)v@Hy6$+Y|2Imdp`;;FXi#P%D~X3t$;c=vk&#(si)8P;$F*JeUL%r718*y2 z)t3|zMOsu=MT+0^`|JJsoa6c2&%DKX&Uun9eM5a+T~PP83z4cQQ9BcZpU0_8-y!G& z9=m@26Eq4ZQjas^`v3oVhm#$4s{a8G>2mkTfO6E=ZMwhhL>>Khz)|*x=TKKqWVYp5 zLY>{NX7FA#k;-b0lDLA$ecrQuDh+jh6TJ=JQI83|+t}&z!GTB}?ip;fScSU!0mIpE z=o>$+@2a7IeFxe%;@)i&0*}0-o++xCsIO}}BXTr+_Dzd#4qOg6G+YyG%3JAk6;vD=qbYB6++&aoHvnJmwYN zUy&;Ozs}ATS%&+oJgt2yL=km$zaOW$Kfukh<%d@_@*(_${H6nU{*XiJZK?b(EWz{b zC#PE(tKlX`Z0;A~Gekm^Yx3WZyAZKtz3y6T7(0hjd#0piBNTm#PCQC z#CKRXhxYX0YP->J3;GlR!-BY4&DS-;xE+$- z+#H2#=;%N473&UsK6(Bj@?O3BuT3HDA$~vub<++{_u|iHh+kcLri=P_M`LuJegm#e zz126?V4VeZ>g;3WJKj2opx)a-O|0B_5ZA)Ni>N1udKX-1>s$-*okzv)hfCoq@8qwz z7VF;Zj1?2c=lGhE9Csc5{NLf?Z(g`A@1wk0i}-G~-hI;$-^D-67#zd(faLq2M9e8} zJ5Z+-51~FKthV{ccb2o4-P?%kT|J3+T8Oh2o_+fY;=32QEH_`o^^f+APGQV1&dFVP zBm$v+0v_=@zaqXlgvAZ}4!YS%5yKSUi%-fvCJqq)U(Q=cpCDZGn77^G#a!dlAO3h0 zL1^%H<74~n(1+dm$M&fsuHAwv3RHYAGCxo7mO%W#SKHi%d|W3J*e-5{)C0-p8?B=u zG-kq^>)-~6?^l)`y6uju%IWoIUgCT4*S@Gw9`o+C_EaYx!S$qSJ-H64QYSh)mCGPB zpZ-uTG7RG1?L2f;>kO{DG*y}Ky-2&WZbF~}5>`v3h*CRnRnBdCX9=k~rD3D9XCbt` z*u_8+@6S)MSa&8)To0D}YrKNcY6$q`m=2q%jNMm7+xsQJz4ZEv$ zS4M3IBse@VGMqtQ_6@JW+n;kF%<61F?^7*EObDetVithJ$i|Typ>dElniTCZU=HCO zO!LPXIES1MJ3{e$H*uf7RFFY0_MJ%dm%o&Uj6A{L+juZP{nGGnrpa+gGVuJFGP?i~ zL~r>$p8!wGMgE%GO@+1-7x`nexd7{a z-raB|8SB2)WTq%V&fDW`ON*w+FV*xE_ah%^GT5hqe2AT6S|j2`Hb*%1fg+N3Y*GFL zP#DpgRMuI@8L5{PzfcG%c_-gBkUpRYcl>15ssjqWjyYGC8&Y!fwN6#N1j?c5_ebA8 z0!qnK{=KC~A?JPle$P1;NGTX>RTBLJ6tUB>+#At{S}as!KEw$r`SAvR?w^1n9no7R zh56g}#H-J#$3V`f2d4y`_CX3`ao;jq8&D(_FV3xZ1xnfC)UlhEkV3O_ZT9Gt%#sr7uR9q_5o5V#ckacP5?z=SK_d>Jy2@m4Gg4tF!z6(c$Xm78QZ_q zS2P34>#cgXc#0sGHQ!So^H)-yzS+n8jSVO|Ip=fRpJ0BsziqJN8Az!WdmNt`29#)T zaj{zqkhxBFdz#%N$d&u_a^fW`qFEqib0l7)drHjxEsR}x@PjOyAdD67`)zh7jDa)M2?u7Z~+tsUL)^R{4 ziLTnc>N8}CACh}DV+eV|5jW>nN+I=S+KT*EcF4TIw^^>&3o@SxK72HK1>Yx@OMkWp zp-+{fWUVp@*^M5{)eKF@d#{{p_x>NGvwD@nyLrfp%&JRzQ2|+t^}!yuRzaF0=kjNn>`&b{=-=c_;UPMB&Eu8RwYR3g7awERH~@=ubYf0ZL{)ZWd9I%SyVBP9jYS2?El{`;qob<%&e9cq!U z{IG8QH1e`~Nf(YHKNP4kbO7j$bx9 znT5Q&;o%5^{7yMjku5H=$5g+;LJI@CN$*lI3XA<#xXc?G&+k|y9 zC)un{As?5;NBfKWYq>C-@e=YPB0E^dM@;QBi*G3IMcGIQUv0)3yi{=dEJs<%2+%eLeAH|>`P0wq1V<=>|Wo>?~T?%=T zFHYQ57=!$s21UKW?;!hW;PsqM=qpYTQGRoa5AykL?C8vphk{JTm}rOrWIz8sV`5nV zd9gW^1S!;mcmF%&rq&4AogGZOjOdV;DP-b5j@Lzqz5j(f>Wzi$EpA}}ko~UUM~I*f zrwA83H6ued|uw+>UIVyv5 zfpmY=p_ghsn}0yQcG`*io%bMTpD;iD3hJ){!FO9OJ%;=eU)S%&+Cb&4GD_$#ft;3X z@z)#iJ}ga-eH)R3{NVZn9Ruu;6RhCkReBKe8-6gqqOU-~iFc3Ev2Tz{wdjBTZ#U#t zjS#BU6y&?b6fSo$L;mmYs%{+zAy+Bl#=`)6)UhmI%60w)>a_(Q1F9Dk-c8^9Gx-4I z{a1BculF_-7=8>Ad_M{Wy;3iz3PzBpJ2MoqJ_P8`?u+$qSA#-+v1;F`VknILZ-&3u z9r9bgj&hyjfPzoFgT{5^KrJ6PW_LG&!jiy^drI#^{?k`^9!`PCvsEp1O(5U*LLHg2GY`o^$&~vF^GW(||Sd2_IZdP9bkl%x-3g__5&wodHnr zxy;NK-sf!r1z&IM zo-_Li)Jkqu9!-BJEK`5eqoRcV|0>BBfAD+ZORVzOTX%ta4``okuHyb?7B)noZusp7 z>jc9UsMS7P9ZjB4SRt0blS2&hJ0A@dbnbzIDRJkq90AmeJ0wHKH$Z-eYzD77GZf4Z zD61==&Rr`J`0J-S6jl!;$qVEA^WTH3->5Vwn6bEckZTI44+kWMj^X>(^RSxVp$(|3 z@*k9Ve*o&Ui0kdk8=xr9N7!UM&DpTuLK@S~yVq5EM_(9d39 zss9w{^6w9|ACUq2C(Yj%rRITg%XH6%DG?}4-1P76jXI#2cR2}Y*#MnWgrfNs@7HU~ z@TSU4C{fqn!@@ZOj89Yasx^*K6c$LEOxXo=mgsWso6%5s`#)|~oQp#yPJQ9-jMo>;cxD-6v$4 zf&85u<4OUn`*ropL2=}-N=r7@As%(YO?Ly<-MKettphX*&SSM73bF3#P}2nJ&-LPZ zPp4gwzbYv;cOL7WJLr#>VcoZzTmI9;>)aV#lyewpmg2@AUcLZ2^W95qB?CYu;vWN5 z&mez%kIE{*{T68I4nM~Im1hZXk3eA{OX9ZdMxa?4uW5fh0`%3sRNc}SKy4IjQ5M4Y z-2Zc&N%jKJuBufSzPbR^hC}`4GQCh3>O5{bIu10uViC0oKcKJUn!6@>9QAhrr||5T zP#AnXF)c|OXg0x5B31n`J?`VUZTrD=Ltrm13pK?%eAWi z)#x-_Oz~96(DpCbmzbpy--#tlzY7U ziCzg5e#r0Ze;Ed}reA$u`3InIm;PXQx**Wv``DKC8(3w&E7mqvH zOElSf9_SqBTe-fT1^V|@ITg*dK;zjzYrW46ifYR}mNyndarluwJ3((K_T8_xaYHIT z|EGE_`F;SSq<40{+8>I18YCmV-vK@J?7e9JIk+>IU3K$PI+VPvN?FhB38h({U+Nz| zg<^{r*(0mwfbNm;vxyDg_bu|S=39T_cEHdB5kK7Czc{TdgxfR!Jrh;O?I^QHzYK8u z>G;zucigtHXA2epx@T4nkIn?pwu%(ijpgI^DY@CY9mo%@dNSn=^qb#(M{IWkZJSlK zfJQ%VtH<6p_Q#)Z7n{KxJo>GePge5+K;wAb&M|8XbZ;f8{o;FowmqjlD`yYT{hK&l z|0)2D`(fu%Awi(~3OCgL!{?FfWW@P+ZlFhP>e#z52{eBD|9EMNKo1!We_D+{&zBjn zyRsYTId&=I`!j(i``pyZaUA;iTwIo{-~1J?Tjj;{ zJG*;;rlBv!wvHDVJ9Tef7@`0Th4Aw#c)mY)M-Ij@fad3NefTCfFdoNUIQ;n!(4|(m z)W%K&!!G6D&m%8@_Qmw?>jOWbXrYVQq>%|2#s^owPH})D!-rq9hb{rVWsPqO_Zld@ z{dqq<>@gHqRsMXl&l*Y;E^S*Sa2da!rhEp5?4WFAfc>a>E8N+5CS=RwpCr?y;_j(^ zGla5kF>1^66_OSNcgsJrlI)aamHT{d$fx|Q?iNITMB*;zXT(R(n@p6FOw(;U4~2UY z%6bze8>Yut7qE^`(2!)OIxbxPyanstTRuK7gS_a~C)iJsohqBXe)S2gdw!#R^(3Ke z*u!eycpdBh9n+_ye>&|9`wQ%|$TW3o{?jUnb@c+a@3&*!a4=`YZ<1-I{?ksqnNV1B z%o?Y#E_lZE?pa=voxbEaJo%AiUWu$sFMN&r9jQ(=oI-p*F^n1`nU>CJrV_klBgt8?jQ=KA0vU4lu+eGj<+;r>D2g{<5 z^-%EAk_t&nWPet=XhX6ql&rH{uCJ#7D=c4TvAcQu zwG*LOP3Hang6BuPWc20G$IHZD!y?l|GV?5M>V3iU(@~BwSh!8HC$hGF`>jHI_*_1FxjeF69Fply_gj8gh&t{n6HfE9*gs>XCg&kavaa3Fb@+k0@vZ|4Ly=tQ3sx@n-4;u7 z_}B#^?^lzo(QTTJ`tu~ih+XKLR~5-K8B-pAKTEQ2=%w#@;z_au&-wV*W3KfS>*D(! zUDU~&bT4PvlibIb{38TkkWAqu*>n>YlE0*^cfr4zutp+2e%!`HgQT=??ftY&MZB%moo6T39kr;4 z{7TaEHPelT+_7$&dI0kVlHF*>HJfA*-%nTKkiojdezl$QB-veO<8-bP)`dl!!MOzK z`Cp%&JMag2{d1ffZy?Y5<;dF-#52WT`PZN?JCQlZDU2jzP-gdz2$FD?UsOFQ5cTB) zIeK$!$ZxymtcG)<-Fsh+ys<^QOVl%y_PM<~O49Et$qKwhUF~Dg<5zY^NOFq&z{#C!NrD;G zn(4tGlHU5?V30ALq>Kz(LQW1zj?VUs9!Ny}TgYTWWD7}M<6e1c8jrK`4!?yZ=4`wC zG#Tg;AnD)MpZdPJnxy=+eKxZhkB3@v@I$B@>gu;OTGnIUH`JYc%w|rKXDnELMzoTI zv@AsdzGjjk-P6`Ic%G#0<>z!UM4h*92cN9qYLc<_+XsJz)g-m{tte0Z2uZn?)2qUG zKoZ71+Ke7Kl8ol36PJd)NUFc-XunP=NfG6zZhp&3GQ7{p$vw3rX?IliKk(Y& z=)>wH(d*3oP$ho9jgB7)?-L+tVzn1$KTDI8uf~6(5AzesnIBU4mto8+NDP0s!HlF^ zlxSM`FOZ~sB`%MeB$6$+F}W*e7fDY#X=fdSzIH2H#=1x?lEvDYeLt#&q6lugEw+~^RO8s8HnMq)NLj6O~x7hKG1EWVK-Vf#ITf5b^5n5I={ zUPOMxtMM!#f4OhYDh_d7&-eym5+kWl=lxR51pu7yXpDDPvi}A$t_u|n@-&m zhjq#qce2JtkQkY5`~Jw@Ad!DZy^l$8lOWL$A?7#nB=Lm$iL&EOBu45_)vsv^SoZ`p3N6;6# zBF*`^F^?pwcIgda{#DEg?s>Vq91_J^Rp;LFiv%6nNsi2hlSEC2PA#=%5~ElzHosPk zM6KQDG7!x~5>K1`HmElsF$P;i`{LV36mR6nkl`y5bnKmX&cJ^p@d7QEW9%1+Ig^&Q z{ig|u+Wzg=mHrr#sORgZkiCJ#xJvt!COeWSl@WHX1#uFj)11AKLnnzhh8Ef0`;Zum zDNc?vYf04Mis9nr6q0DUw85CNhs0FYCy2iJC=1v?>ilj?0r2 zj^LI?Z#NQu;L?XZDT^fbRMV3LR{Y+(Ffz`qYC^)UZQZRTt40#acG&Lhdr9JZ*A=k* zbt0)z6EghwcHrFcm3=!Rmxycgyj{Tw^ap3ECrbrRLr+I<*4p9GK5~zeHZgqmC{!MW!$U+hvGh(yLaaq*QroTI*1u{l^3>zb0T)81pnkBm%a9(=w>6Mx-xZk41*IS?9e!mtgoxO$o>s2++ z#`C^Ry;f10h4a!K1>{(s5s8!op`A@wr*+!+`kPGRVeIlk`Em?#ZC~3;TUShi&wSLE zJ^hM!n0pNj1{o07o~2`HsHaQB_B;86`IBJ1S6A;EuOc2-nD-vyG{-sZM_+}{JR`wp z*HeqX=@O4?Tf34r%n{eYuD5f|6+|M!lgIb20tvo6v*n3Z9`Ud~{iDSAC~1;s#-|L=nQU-DT2wx{t ztVyt~%ATalHpC-0nOaKQLEQG}#JY7U5ecDzXEKNGli=+ApfPiUc*Js?lAcLIeCz`d+^X!AM57*7b*S7w`(%3C?Xz9m>CqTb8s}VIf=RR z%BIY>Phg$DQ|5jTBKduw;Y~Q^r0-We*XO~D{FY4XFRQU`pTe`7k>JKJI-v4uJL3Nw zz1iMkKK%M?`+Cn1$!`yZdbZDET^IFiP8sq!9~Ga*;r>p$z0}bGHvziio8=eaChcy} z?~{!A@SJDvf4)j2Cq4O-BlqKezwpP}J7ezpBXhy0@QoeFT^5eYxhTJC1h2L{@?r#X@%TGE)M&bUx$dsSuz~eaN=Ct`*Jh&-p zH3v=}gx~_>n3K;KbC*n3K>ai2}@{Un+jer44SU zXNYF22j;`4?@D}mjYxL-ecZ@yg~xYB?fnTwa8uo*ihtC=Jo@*PovYVkF8u1Nit>1U z%t~Imz8}JT_*2{a^>~RSmEG>KJm$@--PlF#Hv+eF28~+_hlu2ZS>eAw^T5p~<8zAE zAh^Zs{17Pa1i{1qY7V?mB9g+^<_Bl*fSc9ZRg>l~!Oh($i%S;g7??AwWE>F$w;{oy zb;icvHu`Sw(Ee=@A}}GHsy$64ZbeVa4C48f9VLHUwt`#vd%o>0RYY?40rUU1vw?fa zPd+d|XSG4{MxEq^E6!JwA3CVQJ2V2I# z@A**YV%`w;%bT)Nf ze9KAY59o8&ut{Eh1AXkdTSC2Jjj(QUVhD4`<24>MY&jl=_yf}uKB)KceNUA&JBM{P z+R96)%WI^am@VT+-pw|(G#7D&XARSe=r5Nt?t1eGee6%nbDP&g%AOlrw0#QDZ@xXq zqZ)nf8b8^-N1^XJ@95~vp4V7cXKOq#ivDuZHM8tH(8u1ypCc84{&mOIN3_?Wf8DP4 zgtRg4_pZbhH}sF^*Ei)XoyPsumkhh3uB^?~Ge4JsKK73D>nyQuzuk7azA5_Gw=?Ud z;aq90eRgvJ7tqJvdR)IV9R2I{cF#U;Lf`sSzC_JY^s&FFdA>XfDF-hdsE+eM|GMe- z?wY$0e|FW;ZT)uWWA6^Vc262Y{2nf_GpfFCR~%ti#W1 z|M0K6Y!-d%i3ddwD?r>oo*9vq5eTVfKW(Fm{RH)?5n+S6=wlydtaJY8kwF?Sr&SS{P^ z=Gq}_@=<q{AM}y2h2-9BYaq%rTq|aaBa=D@giA&**5qow(V%hkl z_1!>-*fddTyg?9k>;`t#zz)>4e`%%K+Gw~l@GVmIEQuZtM1q{BhS(+(BFx59~J(sMSYyn z^YU{q@}j$=_&8QW&Zv5R(B_Abk{6tp^*0muyOMC~(J|EFPa0&dS&jP}L9Fxa*GMb@{BQM%#q_14Xj8b$;~$rTq8_PlH+1*&oU}P(Pu*PM@C7O94v# zkx|_WoO^vjg>sl&-9<8zJB%;%St}# z>UMTJM{za&t;**w3%MKNmxw0n@2za@Y;XNhS8q`t3Y7uMSxy^=L)TDWxBO?D^AvS; z3$}*qt59d3K6qJ`3-hME9jy;VLdtiJ;0>`-K=~neN!{ZAI(xaGK^9)G!BdHn0*k1t zZ>6EEhV%QCUb&*S~C9ax=gmw@{E(+3@9%8+$9 z-eQ;S5bErU&*rG%{$qzUhm@+FrcO{` zVBK(gS2*hGHXm>zAmqGSRDGHkhyH)#yhDPSknbGH!M`&V*K*U*|4h+Gxo~tvZw&hy zg8EKtMIr9D<~MaUuGF*NMiLNrJ|~yyirbY|He#rUI={NBhq)6}HJ*Z%Tg%9|sXX2k zf_TpHr~5T=Z3^4zin-r&w8#LlaL9LIYFi_V`kBiCc73_kSZDs0Ep#W|=QEegnlVS( zc`#Mxo-?lhM)l~}7cjrRhs|ale?IedymKYLosp4`E}O*XObu6d&q1a97Vm}ER9bCPTv#9s_a|;FXy_dXV1=}J2)?U`|t&Tv|QgY_}wHb0(Yib_v_lEqNX&kNG zPPjgi|8op;=T~&Tg~%+T9&Nwd_%R*VSl$pR)RE3PcbGB%g52!_?sn zTwkBo6#4)2eQd{G8ulTi4u@DQh~oN}@yrbUnO5uf@6ug?+#?FN`gxlnKjzUldpGnQ z#|+2yNj!ku{Ylxs<4~u6!m|0D#&=vd+z3lSJvcN#H~xnp`uIiMr`hnj6z@Ck@)r95 zisfRBM58cQUHIw(9raG8k}P4pT3ny;4qZUM=`%N=8OcNL*T(ZE^a02pjy&dNd;!;j zWS=56$Sr-ecQOX`-jpi_d*(WzAhoPD-Vya2&C7f>4j&-Tj!#%e=szgXTKKN;IS~r9 z9Xx6rB_U73FERAdd7wV|G`!jS7f>JH*zA#g9cX8AURXMtLjJ|XZjr=$K;_SqwSS0u z9>4U)uJe|VH){OMatZZFy&s!$MZ}@7_s4ryldrfgm)9v^|A>?h+txRWP zN2P(7TZseE=48ZkaK1^w(ySEoo?+xIBGa~gL|#q$vynOC6YNSUsGnXcR{HlFb-K!k zT5WO&>#S7czD_{F-~HUh`0rHVr5OL;=TOhCbaXS9?na#T;CT;zC^X)|WBCG)r*f_* z{`5txYbee3MZNy7pS&o}ohiIDdZ=Q&3Hkb`H&!gWm;53ffN*8t`C0wIu#15QUyYVv47;>cfT{IOQFzgWcig=AQV0nlf%xLHvjtYLA?<3?XD)7A%diq24IW1nWouZ$hk+?qeI zzl65Dx93|8`h(XUj9=2OhQg}{GW(TL$9(d(?1&KR*lYCDF9JRclhi|dSFr$vTFg3Nzjk>#2%D;lksK<-8JLco@li04@#sHx0$oGkf zFa-MPiDlbB?3Xay`IS691ch|o_?M+YQ23AeZ=X2o`bwj1)#`X14$gTkMHK_hTiw1} zKn>{mwnz5f!v2f97U?CTc>iWTWCy&r1lq}4T3_{cVqQWl%d_`SfHpI=u1X~k=qfWS zifp@pq0MiYwdV^Io?U54o3;g7OrC??TYQe*@1FVkOdblEJ9gbuwFZXo!<4h9lz`C@ zyQ-|T1B$3`x4&q{`$)0e5qa?d(5tj{Zwc-N`if7t>-IJ%{N|*+SMxTMYJ2~DxIPbx zH>Pb>XPbrMv(?O^8K}emQ1ue5{s#2p70n#kT|ggw_UB7?JTMq>hnq%kqVBe&5|k!^ zeD;x%txCv0_%Bux_1Mc_-YNuyA-=%D>0Af&ckKOZjZimbbe^JZ`vo+UV?`VJSCD^s zEhVf4>!v;}Y~O(RuK6~Tbf7B+KHRGQ3+vMIw6wkhqewA$aXAqA>d#NSaleX+*4u{$ zkvDi;tp5n{o2M<$;`LQZ{;Mezhk9Vf7-yK0*trgy_M5=J=0R0HpgiK-O*XhMmPW% zTP!j@&w2qZg5@5(&;ok>CX<6gs83(na`w}95h&WBbjYBp6li^G!-J1E13jDFr~gGV zFqHnK`xxQ(Y*k&ymbF)ap~Cs|ciDYlj8@$(coYmp{y&aM``y9oyy^VWA$vT2+PYu# zAzj=#0=Uy#^}^KR$2q{*Bgtzx+CB09D8dW@vx4INi(n1{BExO#b=| zMRYmkTTwTGJ|a{8!0RjWil>Z|S3{9Z=5zJECvkt--?_KN0>k>|(CrCXC_38SGt%q< zMMWB4Z$9F~_bR?4|NTQ?ScxkymFh#0T<|(86a1bXwLE_3&M-9^1PrG;w19tjoF_;IPEG^*m#-NnABBMtvG6>rgc*vA_dg$` z%t2AhXAXPEIbblWUcWn+1q{EB?H-Y+pcILO*d&i*2L8n-@{~j>559VHRkANa(CC`psgHY5h z5%$k@8j26HKJIzX0u1}cfDK2V17je4aQ)L-yg#$=`BU)yJ>3vq#BTsaxqn)pjEFQN#|$SRiK#1zda;!2Bl}@qI0>*p>*q+H__r2Q2J8%lBo*=>To?L+BtBrs{bs#D;*8ou93|{Y>a`+ywz@v#*&qJi z`wRJ`bD{jJ5Raz_IAkGiHxCCkBL1U#e)%kkySPtKIRNJ-Ut89zc_E7Y$r%3g-;wY1 z__f9W@ji8n))mC(Qbf7-lEfOHoO^|+A6xZ#7WW}{a=gN|By)5Ia<+&Nt{K)*xJiSNveBRMu+AUNh&#ZXIZv@B-W1q zVmjPMQeC&?iB;1{QkBUn;Uv@n+a7;l;(Sfwu6Hfk)mM^KzgfQ7P5PMIY;L@=MS&zX z8wAVGqmSSFk;Ohb8%b(50>4^jk~ol=a#@^>#09Xu9MbA0smZ0WYPLs6QteI%%_Su9 z#a2!-oJCS2&9_Tj^B_rM-+dI8abEMEU*GA&H%J`gukgNe^(3{Bp;kyE*iN`l8y@xce<_1MM8ujmkOr90>Y9#ZF72DOp z6_Uz$_F5pOkfgjwJ?1%hlTbF(b>%x9NOH!N!fakQl2Nfqy>+8KNuTs=iKp9>?D~gX zD)~kv;>*f~a$(FfJ|T97_1bq5u(`=M?p{2JH#Bwe+%k;(7p}aszR2(3DhcF3{H*At zO(2Q*s(ZsfvI=qketLls)=hPD+gl@_x+m=BCFBLi(=N^-Zx}Za#*eu7=@qps#J_K% z2!FzP!3Tu%_gIqvc17v`{;nbM7gk+R9h5{qSBdSC4%YRqP~V|1-LOl+s^}?+m^$#R zd2yD6tJzEBPPk#+kS5IJIO3?vrr6jTJXK(RXdOwNsVB zMNxYMm*mB-263O!Cw#iBi2{%(@eJ+pwdApIO zeVnr-QtE}=^X30Yc$^|Na9=73kU41^XcUY7b4JLe@Mk1)Z$W3lUcA4zh3bs@Fn7S` zZolWfWfJKd{`$KRm4pukEmqCdk${UyN)NJ)Nc>|f?tiE!M;aROZRheJ;Wavj`%2!D z_yR?V+?GBP#lzcrdKAy!4n{X#cOn5a(^Ws@ACiRKZNt0cd`RTWyn`(Uze$7u>sowk z@%aw(R57zB(Z~MI9bUvf4qEjG-mXd#sQiZM^;PUg8gZ}HuzW_MvW{n@Jg_8@tNnRZ zVsZZaP42;G96cn~Z`ibpfqMVeOVyMz5fWs-r0}87o+P=K_Hj+Nkr=}#)pq+%lc*uz z9aOZK5odcO4;dUO%cT+_*`~#?F^P+q#MCoi&!Ku35x6 z>dTDuxG)i&QCR5HeMbVm-?MT`izBY3zfYE%h#)`Yw26Zi@q%SFtDRUUEqLx^Epd+K zd-gRomxxY}*PPX7LVjY*%W50UszYs)F3uOT+6Ha)Ds^O=h*R%h=uh;bV}FY zdlJ^o&~4YLy~X`5=gpU-BfsmQ?;S_n-^iM>>ng1K<0yb$4qpIYp<{3R@p-0TtD@VGW~*x z7Oj@9tGh@7_g5S!oqI@JJ1S1eHoYOvl>x&NTP;W+M|<&cY724w)3nuBLW4L@j9(fv zenUjX@>(hu+DM?D9~Yk=_C<^zyK`0s@5AfcYOA(9BY_IDl=h>V#Le~8IK>E{PznSfco1~D*s?C>)^9pO-1)XvdceUU5K=P;r% z_I)q$tY}ZRYDEA3+SeI6@~cRwL0$O8$a~=2R%sr!{vtTPxx(_3?+OIUuYD=t-Alw{ z>2^tbM3JWohG@Q15hZ z>k-?Azh64P@y`1_I)}K;`vO)eaBer;@+6@WoQIgR*pkJt&Uc`x_cRfYkq+nFfpzVB zSC_O+U|r|bnq7m4mrsv}VBIsZRW&h5SodmoID-a($GBqy9JGjdl=i0QkMKC#8#g?P zqauH8sFU{#5sy~xaQUPP&K>>d247i#^IMET~xiTKUqfA+-S=f8jFcyzrvIL|IsOn&_gftr8ZpT`&w@ngQ<+qW&^ zc{!NxvK$2GZ{9`YyYh(mC8p|EUESdP?~5R-9}Bpw^L#(jr3QglOpLhpvy($9Evyqy z#=v=6z-w3t@6&QZ>EbLKIrP_)S3RO1T%>ek-WUA?7umNg77C>h7``qb=-@kYNW$6P z^PCB|?9^vDxg-HDJi{Apew33#+ZvB0j?IBf+@E*lw-GN1;}kc{fWXdbmc<UZq**4S_evTRf~-2IV= zth@fFh*=k0x|W=@p0$GO_S4RsflrC(RVHRG9s_XuXs*tmJ_c?}{u%Ft_Cs(ah3gPs z89Df=-Idc5=fEpd4=g;B!MXNE7o?`UiBQ7t)-%^WLg*`=YuY+p;1Rs-gg^ei;1Pdy z_CWJ?vcJ=c?|jcuoR4l*<27sy(F!ML*gJzEaoO?S(0e8bQqeoIBP$PiJ(uJk7m=52 zuN`zlTvb^!P#f{PIowGth$nMgD^kb0lsdj=hR6rA7R$6CA6fG3;TGf_0_z@4Aa0*? z#qJ2sM+fcP9XD{!y2xgmE52Aax*&h068Vpx=Zyof?zj8!ISST|ZnX<~k9f6LPkRB* zT{lkcm)F5L>-z0ij;=uBit}%SH?a_Oq9k(jbz9tTx63g>Q`~R;HA}7k&uu^bD8O$Dr*WO+c4_Q?z-@!L3e-N1Rq{Q*RuZa=Vrm5TG% z<+i2fdqPb7;4ZCwoDhA*O?+zYD9&FO{>Cd%2SFEa7T00!a7?(e?H(0t(Tmn98u{*@FofJGZQF6~daWyq9~(qFiH|zx zXX5;Ic@~~c44ik~v`v?<2%=kVU5eV11WBqHamknQzUO=}=Wyo5x$DA-ay48Ko$oun z>Q68Pg(R#we}4gDy;EDlVh=;iMaBDjDcq10-fNwJI)Bj0-dmn5S0PqTd@QI_3}V(F zUcBmc3xay}6?6u%55cFV<;&eG5bHCrW*mS2P39C^>b`LW=darwh!|Ie*q${9Z4^Q`rxdnZiDJJ(8dszx z_8kO>35zOWf5a75rJo!)_u7a_nl-Ev5?;wBzWg@^3Fcwa18LC^=BdE%&Ls?(!!EXE zDgkrZg_nQqam0LLr#r=__b^{w*j;GT4&+T&-C>|^`GcEj`g1+vJZF!WZ$rG8tM!it z;x;ouwP{#a9QWJ*Bk~uomNIoBAC*5j=Yag_1$oESh^t)x66%Ec?Yj&AT?|9~o!NgI z8JP3F<3ataCgdNa3C8zh-I%F`@Mq);g+;FNAs+Vc%jp+bx2!%;wgYqEdkWLLaUOEv zSNlf}DwyZ)xH#6FgnabRYpc&9e<84HsvGfb?I9x4m7&FBkEHl0UpLzkRLp{YOD~oWCvyUSgl!Cd&-^P7X-LfW5ItfxzEU_N}*f?EAn$k@HAjT7~X^i79fU+l&? z%XM2)=X@SxK73tGfb2KO;5Zm_R-^=V<)876K5HR)1B<qlSn`k9yZ^G`4zKBMH3#y`l=Rb<(AegV?eRzLW`5W{@O1HV4Rf zB*e1LYZ7u4zl^-whkkjDJ8~ACrkD#aD;H<&3K^&W@NfNR49SZn7w`C6K$gMlB>fp~ z%!%jbKK5=6iKl!4N~}bcdv*$>%nhED9lnG4@Kn3~ zrah4TYpt7VWe4WOQ-cHxiZCCZFDTjweX=_^?o&GNp#R&s>y!Ht^po2rzutcZvdN!y zlrtxg-*8oO^-1Kd*{@rTBL0!;dxZya#UJa&{SeQ}2;P!|b+PtMofptIuKaM!b{2VI zJ-rL5$cIVEG<`;#*G%am>iIijxjOSk5dYD`mC=TEuZ-fW8Nvs75kn!~&6r!9;^UjNyAJymewptotH=FzD4k*rLSF8- z^CX^M(`Pwd9cA>bziD0MIF3Gco9$#ZFZ$O@?%Uhq^=lV4?HbX6{GIulE?Q-f7q$1x z(bh7^Ze<^xYh8=J^(V$gGFIqg_x_>6HUI@#Ok*Vv_#yj6aMc=-Uy#ppChzMpncpsU z3-X#wH9lMGp?{r`!}J{e)+LX_JY)>e$L>0=mi`fS%SL(sYnLGBsX&+p3pe%$WW2Ng zbPw|W9{kp)`xgF3(RIgD^}lhmlrl1sgt8NS;trL-kGqpwY5WMwOR?>+9lMk1jc zk)kA}P$9BqRg`4>p5I@e*L~ie&pGFFKIgjkzMuE|$+;V-Jf$`Y1?qlHyu(;0(PEsR z_p%oC>!p3Eqt{TszToxP1?vM=?VnYx1fhSI(66gnO7?~Lw-g5SSF z>aRINQT4>$%CqPL@QxHtJIw_Jy$MCHsdu7|{W?8ke;MSR>%4qL0CjVnA3a;uwxMqQ z$5{8van!LZI{!S2zT(fnf9Y@^Ow=Kw|-m5Pak4VX){Os z?CG96jfm&72>#T-IQyK~$^Y}}$!{OKBJXWH)fyNpfO*0DMKi<@Kexh=tA@Bw_y&G1 zC^GJ%*S>fWI~ySudpDVct+MyIdFIReO%m^dtUi!27o%;s>e< zE!Hp|csJu56Y}Qo9uZ0|$cKymed+cQ`So~pck6%1hudmjy%vJF-Rlh#9n5Ri)9UTT zIOCDlD&+C&+#WP7y+NM6=g;z9)H|=NEQE?tkYE3J$?qt}YYU{6Qu%P+_0^$v^qt@2 zJu};04n>cv)r9)2p~&LE1!2QH@i9 z-ZtKaI$c7@G|_tx^6X`eO2%QxuPX_6O!yjX_3Jt1RsDJ7*-H%VccadeVO^4+myGxbfg&e?4(Tas=CJ$4@MqAkSX8Pc!f|^6QtZsZIHzROuYUsFxv*mM;b?k>4>M)*oC| zMBR0XWyTKV&6Sk*{1+F6qhU`_dn3k^|0{9O#n&lfKAwR%mQJzBqJH?=K1~-HliD{U_shxzRX&=h~V71>^jeE2WU%2H_hm_y;m#WD!O^G;^nEZM$#*^Gx>}NL|MIhCPQCO2s}x zsfuJ&-kTX5RW!o%9zqGLOtx1l1xhuIvdKos3u#(A`Z6J3Y7qo?|6PF+j<+Z0p4&sI zx`t!|_RA<$zc|jyy%$Q@{_fHF!-w?}x59Ig7cMmjpKVdc`(&qjWVj0X_5)m<30b&~ zIydso(66Xe=a%2hI}0e;=lR-p$O}rZmsfjL;c>4&mdj7UY#~0s=QQuy9rsKK@ls-N_I~j&N_+v4~S{CF*Ux>AOH=*7>C?;#(7WuC9 zo9R8f?ER^nLE05^(^x5 zzgvAGE6*bDm|I@_1?vy$cSkYgKZSCc1&$+5u{iEhqh6l^63w0uvs-vxuS9dzB6Ogv zPAetS#tO5PNMGlm3irtRUivwW`5;1#IZ12mJ$c#Qf4Rn@!e4FPHQ*1YYj*u z9?H^K=R*=n7Bs5aiPvA9#n=x}`TdMqQYsx(@K|RF8}{OOGeDBm31k`O7KuY#Q1&TC z{nB^T#UFpPbvxz`l#lNr_B~OCGG2?j(M8C+fAUg1eSZ$|JaNN`Y>exNbOw82{M$*P zhD0bovGY`0Pci0QDHYfwjCkcPA{u$%PmdLqjdCz=Bs1q|JjTO2gi^Pl>~rXin1A>j zo*-`}yXauv(7kOk{!qrJ)~9z7dE(C}-WVIlA%1N?B@d6oyXqS1q6=kTI^^<)X`x(t zZl|5D6_ihWo7jAZyeGfC1i#e?;=*s!96Au!r`sI5g!A=L*9{_%KdjUAS`~TVQ+Bj= z3l>m5HFN9FE3Ah&RKv!BpBKx97}g%ehT#1;ylpzm63PzV&)a|SCzOq8I(*uC! zhx{7#p#1yN!xTqvC=*fsbke9F>myzcw4C_^<#HoAqeKUk3H}-7Y8->IdH%;a=`B#M z#WyOZ!35>MCO;e_Bkw46Msc&Z4a%mEk0!a{d8jIn9P&dxQ~Y`PU{oEHQ@x{n--$f* z)dC5s1uh`b=7+EuP9P62Eztha4f)!iBG*fhS2g^wvGnjRl*t*WTNxuyDst{d#GNWA z4|qEex^)3a0=_&e=aC1sIkr2&l>+5#-<0zXP(isvlFpXTYbd+G#~-zM5XwDvJYd_` z3gum)uSL(F1Co_>Z)Qd&lvN5iq~Y&z)m?rli@Lu57G)Gj%&gX& z_78w$yZgU7L9F)}vE(Ti=E42H_iD$g5|p==hP%o+0cpQ5e^D~thsDXprpzE9E9)rD ztla=|qL0DeBo-ilmgx>ZI{+l5hwo`Vhy$rW^Keqj0+9X+GTh!oe}x*~gKHK$pdu@- z;bbNQRD6%(JZ-W76+(a?=-Uert%g z+0Y3euf=(r(ycpBVVsM>`R`dMf608`=z|-OY_2gM&Y}iV>q~aEkt`^;@K@)nHGuN= zbo%G7CxB!<9YcLu5z5UE<#b;@jr(EbyxhnPkQ}&$drGhl;-xL!?zR_DZZq})3w)ux zbG670>#a!kih_?A^`YGQ*pLvPDU=V~x?kcOlxO)DFHzkEl6$Wxsr@tZ{oSg0&4oZVobCI!oC+i=6Yjy| zxK3J(kDuDR0BJ05b014Olz-aaWbbqU$RdJX|JMA0{QUH2iNhd}zjoi1`p+3ig*Mb4 z@n3+{<&$9lcrTFc9rx_S{%oXk)w_KE$^#`Luw&gZ1uFPU0>4my2g(*BpXE0h%ok<3 zB%}c3k0DmqIX8gf9Mat%jGt5FxRm&IghSQkC%&=kOi(q=val2@4OI#{^6%2ypwdS; z!}4`BR4fi(T=cvRl_AW@)1U$sM|hlKMTX%)U($L^QWiX5{S&_!DhdxS>Cz?+9)ape zZwubBGeFu{e9adxu-^(_Clkx7SjV+N_702w1ElTTU;U3e;A@X0 zn_)r3CksD~<8!|mI5mC?_s8~$W!0g4e9b9U7r2D41MNo`wgH(+gioeU8Av<4Y8bxa z{96}j?@1tkL`*_*(WmOrFxHj(_ zE*=B2l=a-j0NiJ%C|`EcnBo7+=$~%|_X0`Wh}f;A3uMc8LH}i!1Iex===G`Dnr?Jtu0ol)= zn?`#PD2M0E{}nF+nP+pj^L`9e^4f{Nw$?@881^m~H%q8EKO!(cH4l{IW(T9szkuoj zEk$qt2&npbaF6)Ua;SRXV`L^(36*Xci)W69LCp!1^?MyA@WAuoV45BF>yFm@^&Wje z!n|J_?QZGHmxE;$GAX-KCiK$9A*%KE?@1a!e<}@98)zm4MNOBnE&%* zD_ILffX)eiKUs4kW+&&*ga_(Gc+8MRuitSZ?2cR6-8wvfhO4Eww#gIW$*Rnz^yWm^ z-K{%{-@Xt5XH4I}|NVl9VWsAAmCqx>6KZeoxm-Ym1vy*XnZfGe-S-;KJs%*#bH1)_ z349^KV#YtPJ(VB=uH-y_=((MU;jLgF{liFvXNW7?FE~Or8j2Ayd&iAxK1>qf z4_IZliJ5_%fY{pk~#%7>|D2KVG$bxZO*{ z;1~F38TLfPtD;Aw;ZY*|Y06by6;&coy>v91ubPN0*e}R-P>qPV^=h@>5ATRD3y6q+$wl?fzC_^I<<)-qW60a9_k}vE5|Ji0euD$pm-_1d z&37yVM4Zg03+m!x#636bk_E|rB05+${F;yk5q!|GJH-X{@&@e-f0*rvXqkG`f4`p) zQOZ-CJ9N#Fm#6#I3>S!y470}HnYBdBWNa|ke`jz%WKQ3%@gfrc92&Fz#y1T?inXTP48zBN!Ua$Y+!n%PH)z6Y{ zF@%eXId!7?PC~>xF|m&7AQ5Q3aJm2S7V`Y}|NETaOt?tDoIT1mOaz{1i8yrpC*e9E z@=H<$@2h9h4&r+VA^e+{R#Zfq2uv7EZY7^1Tpu&hcNozSE~Z-n2M8-7&__7D^x6X9 zX27?{|LrrvrOQ$@<)|$o9267D$a8}TTv1th>n%yRasRzfBXWaq$vP{zSF45yY|{`p zBQr?2{p;7Ek?JR0^PYP%dbtupes@pjwWJb3P1K*bs#FQLbY=GiElt8zPKm~Tf`te= zul{n8w~z4fDZW$rSB-F2Y%ssLo=pf`&<;z`Y$5Jm{!;Vp;}gRDvHsO9oD0c_>QC^pD-A?+2NJh7PG|NvPZAz|5i+F}XNi!X>C-eq7U0~nw8J2j4xC5T z%|2@gL!bt4fV0VMLab)h!otA-@wb<$7wHi{^eK!riV%Cq9^}a^0nX2CH3c6nW4z&S zK=M1x)6)tWTgAM1z64IpdnR5gcVHcHe+p%89pleiyq{sb)llGKv=2Cc%S)T_i^se? z`va_tgxG_ZdkEWk%=;p(bnq175<1e6$1v~6K2g-qI6vRFx?bu8&f|7JymSK~P*Zzw zX9+DKRxLek!H#&Fbd1bD@ll| zxrY#|VEOAHh{tOm-O~G%4bGF2x9>=m5n`1EOOsj2;N0Dw@#jPXI4^FC-VB|EKpio9 zBGriyD~Y5>xuTO?Z#C-$j?>^q+%6WuX`CMwe_APK8Y(6(BZVk@s4s29hau9e% zIp{w6--xC3`fR_oADsIbBv}631m~5p{bia>gjn9?F%{amgbDZGcHFJ*;OJ}Uteku$u+6MbB==y+*8Qa-g zR0a^3bl7+Nl{_K(O}4@3;8}2yHoMG z+>PdwE~+s>aQo~V1?6EvKw$cuYOQCu zc^LBY>l#N18VGZ4kQ@MY|N1w;xws*-U+eff0zUMkKP5X8lr!r=D=qId#n z%{B)h^5BW70{J5l#Cc5Vi$LzJR^+*&>jM5@@tFDHC}xIcTot@sK;&=EKJu*-uG zbzIR|LkZXWlra4v_Pr1!WLBvEZXTknj>Nw`;SZ6v+$ZG3zC-*@?WNsQmmui0_7DCl zQHU~xKQiK{A=0S$Dy<|v1j##irHK3oQI&ChJK}ag&i1%lx47!Tu@dK`A z5>cxV^~Z!kk1rXbc8y2a3OGVg`Jjm5y;`_uQ~W{?f47YetG*Y}7z+tpY+|0D9zt+- zTa5QXJ&1m{%Gq8N2~pqPxop4y zA~mdU=!bOaO#dZ>d z5QM&Zp>g6i_A{{86_QzyK;3?NbWi48NU!pRLf3X8E-R)RdK>Yu;fnBG z7+)Cs`cMz!(RF&l))*hke`s%wd5uGx3h@x%b$sB=6>-FG&a3X!LA)uYmBt<8T#`4% zxFO{xqqzGM3rN0hvH3%Q4$`ZSmGisXBc2iJaHtdWUb~pNqHp?jz8)hjX^h)c4k`IS z%75E0$~39rEbT0Bk@;YHq0BJn`X?zI5k^I!f8lx zSa-cM$_mNmF7k@u9FSf!`y~eZlEim!DgV~An{(?G^AH-#a7Ae^O#>!~p^$7BT*b;L3h^H=RF~X9 zAA^YF?7>5|knAV&nXc|Kq`wXeGI8UD_=!WQRk80OB~a5c+|mz{JIcoX=Qm#mB3O!tcjJOL@i?O1R5WQ#HKIGw2c?IsoZf;^93H}c@#j22C zDqlY?+YD(cHaZ7-H6ZnDS-1^-DrCBFLAJCCBx*QSz1dR_sa*wUH1G33O1H6HVa*pv z7;BWA3b(`an!jbR7uR3rO*4-L>ewaqUHV49K@zcBz`1K1q)W1u#E4NrnqvKYhOQkX z{^PlC({&&6jC8z@9D50wn>vZdZskFyXrz_2#VbhBWYFK{N5MYlhmXfEp?~?Zr`>aJ z^zo)5M-8;ALMDS%S|^Ml&RWrQTpV$eiLHn=jGwt;OYy+?-K1|!yD{Etmvjt$#Hl_Q zN(CK3`~mB~n_m#WG}f>sg?Q04y32`D-qJFW2=x)eekU* zcRBV;*RHz#-463Ud+A}HmFyLX?*DfF!n}3!Msa?~b&BLwtong<0`tS|*HI@;-6+q* ze+@Esx|ZZb`s2Jq3ad%?5m(r8H*Xr}8zeI}xd-a_1sOt^LWK4hL?Uw<$o*|A|8P<@!rDTvw@rHbQHMTJh zLC9piE~a6dfPL4$yneL-*oWOKcXn3{X*dgl`fdS2|q{#b4+bPr^5{9KUpcm}!2zd~B&J0XX!r`p07d2BZ7 z;R<#S?7v=3Nqe~lxzT>_>xWda5BrafyAjmVJBKW+0JRnDU;Mt!s>=Up2ZZXB%rz6jCDl^&VRhf=L~t0Yqjxpc%DDIW1~^WnE9nE%>Mie~; zb%`Jp2+5S21bl>SiK+GHcNehlx?RR@M!e2hv(<4nddMoc-0gav75lD_vpwy>{>>Q? zc0o-?&_}=`EwwBK`>z{!Tbp2ia{OwatZIsV*xROq?zLh6^-kl#i$hQx6>Qhu&WSu{ z!t^rhPwc~fV`=ptp5L=;pR{Z&kQdci8+@9JzU-k{Eco|Dq~CoW7Jt!S{dlirF#1AQ z$(y)YiXeXLb{(l0%H4 ziNQyR7j83?ti-s!!X1u4jQ_}VZ^rtE>Emx1Jd-dlVnqI=G2$JLYDM1=Z&W{qJXpch z-`p>-6XU52;ll6H7rrZL%lZKn%y2M=J&lDTiYB||1lC8qjQ(;s6#cZT&A8;^({SFx zMeU3|7(Xm1lZ-y|H31F&&JE}j-&Y>yB87g=jlt(`V_qkV%n2D^^o1`GQJy`C^R5hr zrJ$cg#~FsoVbp8aeY1=UdV%Y8N$16^FxE5V3n&KlLVg!V)ulI|p|DmefuBPced3eH za=u}|fL95jysidN_$0-5wfHs^tf(wMruBiMM+T7%S@s$bW&s;Q+7D638M{j6eM>rIo%YrrMb%griULeDs!eU7@M-2Yg97wbwm6y{_ox60eAl`d+K{i;Nq=!~ z9fi9C9&XGoY4bi0kd?`%tTv$N09AO5azKswe3Oni{9 zeTKgHLXsW3(RZWZW8nH@k3iH>N7721t$-4FmK_4S?a&{)>aw{00L~*5eJid3ec|2q zms_H)-jcy<)TbT_`_ta#8u6k2H}KLeN#xDLNt2n6_dw}1wOO`z2KvM2Oud|-LEY+F zrrZGfO)Ie-%n{#yWvNT38`mw0_*ahjl-qIMo2Wo!>;!a22(n@1IK>TSN>VU^)i_HVBLWwGud|(9X z!pQ=!%D#1=etjrnUKDlc-@dlk8X#Y-vc1(*;0@~6zZ;yzJ`g3-%+qd*cw9}R_)7*B zs9(=GC8>x00@ei=C_B&>ePSbf=O*gB)n#-zO;Go3Nw~7fqYwC!w#LYX7pP-z3F$6D zKD_Qmlb^dQ6g%*K6J57Q9$Nf~)C=@i&rDfSTc>*kJaIbB#EQF=+?EY^jXx|V5g zNupl#d!c6x8`g1rZR-k*gpyUK_>esbP;!Y;ZMz@V|G0++8>~>RF*Ub((YgP#Wsiv4hKwQq-|O2(Adie(;eu+VtDmq14QH!8xf8b?mVv zyQKj2>j%qy60}gie%A5UW*pWr7^+`$K;QH1{%YQ%s9&$MIaV?%3Z)~D?`^?vC{?5S zcr*$5-ymIob>9QHepe4YL>|60&-{!#sR^$qv%Sp56!q(g#}j*T|9uTJ<@(78Wg1)B zH_efMx+1RnXPy^I`5H;aDQsBxz+JchG~S;U+scOw3{X<>wI^U!3U%vd6Too=_i^3k z-)ROQ({ZXdX-FeKyzC)!0{Oe%$vFjaMEg?YbKon7lO zZ?)!$4l~9pOHZzR#=K`mo;MC+Ui&9e#YyDJnXE#7u|gT2{X>_34T!t6%>6;#_-7Bb zeT^3|&S&UEkMp0TuIR-&+Ok20viiTs2Trmzo$l2~em!ox)=DAr>K5gKeXGc`+o~+> z|NngJL)TU-kXOG`_{*6VdG@G-Yc9xVPIGI0zhZ^_`oPp#?8i}#r7dIEW^f&KZd{dq zg#3D~mtN`!^6Jjv-Fo8)hSv89Y=iQ-gT5Q44#=%zegEl1n01x zL5R1?^Yatr)#ccnIgzKIH_yAlA`a!tf^6iggUGLYr4}3E^{QT!%+gsxp51MI5B5VU z6Q8MNnLyuxt53o!Q?VX_nj$$){?c&nuU}I)>YSyy1b!4D zzwSxM$on39XNCM~ z*^+pG#VHDqlm5kzv$+8oh^i7P)SG{Xy!JWdJCz#sK3Z-A(wb*PuHqx)D_6wl%W=JH zqEj+ijF4B)){nY4gFO3_)`#kckYC?iREyz9etk1-yeB$=Srg;?&OdL&z9x+y87ZHWar_}uqo#xWEzuYyf^`%-Uy18~ zVaNFXdtY^T;CSkBF6Af257@_GpFh&mN2=dGpijlq_cymU<9a*nHnr5D1Jdr>&%D0l z|HCJmB`^EKakS{UPIU?S&V!zoR{Ma|=0ukyw2otxIb&WAkX`bZ15KNe?|l2JrY!*Z z{lvJE6T>)G)vYj{0uqZr-Qj<@@48=d)(5@BarEQ1FZ+S)-KO=bS_Mc4tQ!Ug&jYEG zL(KOK^6#C;4jL7+A|J}LW^=t2NE4caGwt_ryk_A=ya#f0tI4Boyg$eFE|4Aw0qN70 zhWZILAbsY^NMjen`k_}S0G>u(buOuuVHy1kXqK%CxPV;sGrCBT6G$c&D)y|2xSxJJ za({{Ix3-z5v0(uuZF_4q?@1uvH2PhrD1@W0s`8NrAg{8_FlO)oi7a%z-X8C#l0-)O zj-5Cfw_cXPx~03za~3huK;h;IF*rGcql8+4{}fQdp88+203e^<&3!3l2FR_4&MR9Z zf7}}IsI7SckE>5te{>&IxOe<|6X}fOjI3erEvP8??r_=WK2U;KdD@Q;0;SE?aYQ== zN29Qqlh`j}m`ll3zyYecA3DUX2I2U0`-9~zsQQ%Nv>{XjRV=}K`UE_oviDS8;=P;Y}=D&ilD{#`tWd85M?q;|yf@_q4pGg+qKbQl@eJ9$nz89#TDXUkj4mhpP^ z!q|RlZUXsK_NAkM`y@G7dnw`+;wpx9>Jb>1yOXSo^#`f3y3HqRfjp->A9gMRDEd7s zzrRUi{eh@CD_1p;Q=Ss#b0i>t_qn{c@HmiVEx+)K7R+KZl5ON8~=|?Lki|l|rKl5Lny*-fStH0KChX6TWOJ%#tQy{PWR^Jyj36u+d zI{Tkp0J7Sp{>?o6`!!rqlts@*wSW_e-GAv=%3CtO3Qe z{N>)i>_9#fae8qS=PxBO*xbQ7f%OaT`u(zTzc`cs6?db*gTsd;`{zK}KdU-3a2F_U zAAWw}a|N(rp)lQIo54xrsn2K0Of>*7%PPX$o`AOf-9bv$vLyc(tMy)<+9BT<^bip zUG4Upe{h|)>5$I{14WE-hU#PtQ0}lB>-eeQKF+%FA)^#31h2`nDRn`G*Y>)rn^frk zabW*najb7DUegQbu>nf+BbEA$t5CtltbZ-m8z`r9yuRwtLnTEoDcD5-DmS#m{W3J5 z^2Nq3nrkqR5?^nDn`lP#rlF>Qvv6s z)uB4)X+6urJ*W=!`e*%g0jhbA9abE|{jAxp8{UG?L--pG-w`8txaUyzYJCgTcwBp< zULpxK=`vlD$%gRYPm7%r{=P)HpRIpaEEauE1nih@v*T;OTTxq2@HOpx;FTJn#Bk88 zo`*`as^S*CD9(C#;3G4()>g?dqyZ^r*(AGU@8wN_b&z=lF3m`9Snz3G8 z0!o3?+am|@`I(ju;#|uHO1q?*vSlDpb{aVrm?Z2gG9?35J9FM06Ka8~eOtyU zJc3Xuvq-4XFu;SF*|irZi{QcGw9MSkoKW3=_zS~_JgC0BOv8iUyC2%AZmL)Af|@sP z@7O6w6VAU4Z|(1_C!B<{>M9x{2|@Ptfvt0Kg#Vr{>cpQ@ju3-f-T-ziu^ zIRDA=*K7Yi+H?!7eqsk{2`pzwv3BEY7tK2t|p6y%7p*kw8P1V zl?fN>>YmQxD#A%xTxQ4DJVKD^-RlqsGU3mEq(6T#o^amUN{;4yNH|HomUR@VC;WNd z(mg#~O1NwnpF1#GOgL$Tv40lWMhI?C>3GIHMfgk9MGk7P5iWGkwCqW|gp;Caf9^h6 z!e2yyvh}QsaM^ReRv|W@a54=DeD*J$5Zv|9NOo;w-f%=gI*4}Zrr#2A&fp=vTCe9!q-x$|#P);~` z7gJkw-zWTUJiE~I;5Ol6m+?Zxmx^$j?@JhusU!p*%2p@Y+7tfYJ}Za~BJX}SRMTtw zd%~%rtToc*A>m)WG5=E6l5pu!3v7o#!ujo`iamD(2muu}aq4R{M8HF<^|x+U2$w`B z3*FvS!a1OI=KF&UB0&FV>gm;4!Zm3rwNqS?aA{Iw*xScT95Q1O$~C}x1$<+*s6bx* z$Ok#cdK<#Ua6B;es|?l;g!9D&$`kGcbb_CB`q5X9Y9iRUd5rQW zf^f6u{NcLLiar998ar!06G3+?c(xna65Ju8?2LJNgvVPuM&6p=ga>n(@UFyKB4k_r z2H`ITjw<@~d#uvI@tV)Cp5ke^GbhBA+bKy1z2Loh%jFK@hdUKs&?0{Ih*Bgi#!vc@ z?mfkLhaK%nUT~Iwj0z#t-Z{`Ywt;w50_Wv$#2<(M(Cftb^1)n^5;&?p zUgh~}1db*Xu@{n_!ku~P8b{CCbCWP7s1^BtHgQHr>Qf(ePI9`A6Z0tf!2t5xptv*%^j@nwE zmi^1Y(b8$3?wMA&^Fw<`ip!4>dZup?Md0~pI*#T!6X0l`vZwMa9tP(ZKxB&tMIy;pYHWF!t*fI ze4Dl61dg}Xb`>h?fIqdS&usWjLa1Ev=s`VOaJ;z2s;%$@99{H>!p+$Tp-08t;YV=& z?~Vlx6b6E0%tN=|87kn<$)eRp>L7%i-0JV3@1Ucz)r`9-jv-z@7-M`1p}Sv;KeJVX zWBo(p{l5O-`06oxFhf1~tNmx@uir!nDc{-`Ptga*oUz?qB?rKfd?zt1jhztUtaO~b z#RN`5Jqw&eH^52lrFhb>74T2&Ii!U?{zB|m;?>UL`Ts5GJFH9vPAvZ&&9nYV2p#Uw zaQJf>oJJ(GdpnPV^D*T{$zz)kpr|PQ=;;6<=<~uiM_dw|qWD*jf7St~stc|hHdhJ3 zcK%^q?+tLVoWFPeWFojYJ#$PB>cBdOfR(l*BZL6IRK1yT9@b%;9I&9H2IsZyH?Nvq zAOzZydV4Qj0k^|Ug2hJ*P;Vb4H{$&pf)cxbr})+o{0Tp8uN-y(SFJk(e#bMw^_);| z;TbRPr%iHWi#hIxz=7g$HSAnc3W z#=@v4#1sqs_r9_a^ZfEp-O)fiF^1)H4dT0#EFw}cu4;YDM-syC+J{$`RAGFQ;`%-h z^LiLQ89fL8Da$`e(|m}tJC3L~BOZ5A%9s)J7Q1YYKY;L%MksxXeZ_|qbrUazKuoDX zP*7$(;CD~*r?38qvyPFEOG4Nn+Gi&vfd91CyLv0^3m$&i`pK{+gnb=8N!x-Kl$KT(=hGQFCU8%r-cG1t(e;3gMAIwhyt5LD;u2_y0VOg8!17%p3V*5T2@StyskdVT*!4q_?^t zrol#)b<6?+s1^Fv&%J~2_*c?evfL0ht2>*hH3a@^rRMwoeSmPv`vq?{P6($S+kaxW z3B7*gRh}$;6E(yYkKrYr>JP^)tTb%Lc6a+|T@2#KYg9st^4id=~*IRt! z*s31Ho}Py8(r)y~;#(Fo?}YG;cj@ZRcwQG*ip1qkKtQ+&haU5Nh^VjV|JbaH`GVR{ zI<`UVoZyS8pM1EF=M>BBJt5-e%*!a>;}G5>Nl`j`6arb@d(1SGA#!8m{1-k;h&1Q< zAY#}Bap}9h@{jRC(B9m^nD<%`d1XyJO64X*JUMn>(E#gsNXlClinOT9-xfFV`VmCW zrF`1m8VK=&Zr2R;4A3uP+qA8b4~4l!3^T3 zy!{3kFmJ)bhMf-MhZu!x(l9M#`ufkx)&Jf09PwOV?@Z)f zb*^+4Uvb8~S9cf>UxcJRzb4(23n5Xr_HEWq?6WOerE-!z8e+fy=$RgUfVjij5 zi%lPj5XLyia~I^{lQ@_s259mjQGamARP{Ba9?mivRw;wnMH9>Z;SES)r=Aq*LcasO zj=noWlMp*!x^Kk%G9>L&XxSU*35n-~ISWF~Ayv}loBqDD5c^w1VPJw0lJ<)2S`=o1 zL_->?PXq(R{%pM#a6k@{4iXRKY@H$Ts^P-3r$LY^vs;HR?JfTF^D!N3_aNzjQ=Fjm z5lFl!Lna=6g4p$G@)cVRNID+Sx-Bmc673e{cj4#PR87iz+ZQYl$1M1tmKd(LSe?Sq zNxVJ_r94f3tXE;UJ6L^850cJ0F)7`0fW%0~Sz{F?NVU#m*l(*0abm%~;~nIWzvdbvEH9g@0U zkF2^bLDKGXUrl@`A@2Saw_2}NNMW5xZ2GPX$rmhJE}$MQosQW$a_cR`N4)hb%AbMc zn0}4n-8GQ(?x@5WHbIEzyZ6cM&=#a|T`QV;G6JbKFNU|&y77oRbY|Z0ZnX(q9NaVz7+$4;G=k{RWVAro`<< zvLEvB54xnTPeIPJnzUZzyVJB1XJidtK$hOS3LaiummN>n60M)3zrlV{CB99_G8R3Q zekcYqxlReaE?b10*O_}u^0z_SS>v&u#2m=FV0b)M_abEO@rZllqyTApe#YmV#39Qi z&G7ZBM#z*D*>%CG9&)~x6`fZqfix?hU%v;}A!+SQWz@1p2K zk^V02{CR4~G&!%zDDw$&8CZngDq28VRQyYN*Taw%(q}fc)(x4OH2ThyEs*BfMg}MJ z=lF3|;lJlNUwzkUEvpsCy$JEA7Th7N_nC3JLN8>sGgV&4-;**UzTEh%A`NL(7gct3 zV?9N_xnoj7IAl3j?rV{F3%N_mbWw(ykZ$u}yRWe$WNUHDRCYgtEH-LlYQ+ovC={(d z_5?vL^?8Z8lkSlH#_^Dqupi_lT7UVfdmS<&d7MV(vLVN)Mp<_6J;>%RI#Rq44CzZ{ zmHlKQNybb?JtIlV{NHzC(j7#W4U`bC1lH1Kc6+Xr1euHmox^71vg@mkBZ( z1+U~vH9?VNwxe(Z_Agg)cNe==1o@50W3E)2kbCBHGUKsv$X|1CtnT)Ne6coB<2O-I zFk&_Qd8rffxYvhvi}WLY?d`*#)`-_|%1xmU1NZzdz1#0GUXGt!kvBd}Z6y_gOOhlD z;#srGM)H_9_N`Z;32~(nZvU$ox7%~6s0Q-aw>O=bO@w@L`^x!Cbx<(+ocVp)DCF@t zZuAwW1}-Rdrd?vIc!ovtCFlmmH!-U^8+*k^z z+HDCQP{8bYGB7y{@kj}`74i8l2^od=;nDq5w)HwN;pPK;YftU@8{iG{sg-jH{O z@x>FhWGE20XUOM*^Ik|j7PI;e@>Dr#ZvH}@zHKI7)}S5aXFb(@B#gRtmDoq$NcE8C zU*o5ps)~IIw0?RDNnsxb@x1BC=a6T6+~^lgJrwjMcG`$U;Q1W>@n?@Y6y~1S+sw*_ zyrG9}JBqPRBZvR*8u~`$e^{J6F?k&FDh`_-+tmSu4~1`N_v87@n-1!$y@R6bm0F^| zvHwNJ>%zfc?8mJx*eaKgeLVcSWM@t2aQ$p8nmawA*eRgLK-L(21_D;}d5=SJf9vhg zcI;Cx5+XS{hx+`uJq$7RSO?NW8~=HJ7z)hBo=Pg6gR+eMdM{B<1K_Nlrdz=-5xa7ZAT}N=<*DszV()l@IANHiafV}}wLU+irB*hpCpOp=VzNbdM{GGnSuN~-X;5GiB$p{Kt z%D4DVX+ZJKlecKe{Md(m%l2^;>gcyOg>^Qag~IkcUTP=(|NFX2w(Z3J;vui=D4t?i z_fhy=v=RGjyR|9Tp5(?p>@Ssk&hA0oe&0;RxE2(?3Awr5_%q(e+jqpRea1SKG|Plb z+Hz3%(a$$x53X}Tj{qI#EhuU;_2QxEqCS1?5|hw7tP3HzolMAq;zSx=M(a8B!`QW? zNr!zF=1;Ajtj4;831{#M{sYAfvAqF?=v(i0NVENN78J=k?UsIue)eq{VYFP>-(ljG zN+gXf_FrFUuBX$(zUy(-IU`O`93P--K*f#q3EGG2{@urV9rdiH26iYBbI=&y%YuE_ zCj{<}tYiQ6A1nmwqDwuV9<9D-fPL5_FN^n~|9b1rIcHtGZ%NPm2NS=ek2t3xle0ed zVGoXrF#mu5^%9bH&KvBzey>^S)E+2%vL0${iMmez?4I+-(dXYcOk495^1^q76A6gH zx(O*k2R}T1Sk@WgfB5_Nub(?UOdvmy)gUFb1Np3>@mFznOHgk4i-YqA>dd9>+~VGJ zqA&Z&``%WSP*yZ6>a~oz|H159o?j7&pF2c7Jc#&#_k0gBFdo4~E{ehUQx~0>4UFGo zae96o%8HLwQ|QeQpUWC5M&4gK;fJH7CF17Y%j~$n2iryO=$oQ{yJh)pJFIK4l2(@d zgSzkH21>@xCG>L-qrLhXb>1ggc8&bQ`T)xjku$@%Z-(T~?tg57J^|%-OQ+GF!8&lM zPreWR;oG^H@5-V-e4P)s7}iC|Y~zd*MPCT3&#A%b=o2w~pt)hq4teMkbQz}TQ*O)2 z%)a&w{o(r`Q@>8ZIuw?mYx8yJ3%{UoPyqe^Z@dmz$ryx^uirMB7=58kS(X&$@DBYB zWTw&=+0h^V_xu-@Ls(DJ(&aX-j=t~>9A|wFL#cf!<=5M6tY5LaoT7$x7N;eLWhgXI z>S-0&7$Smx1U#eu`1!YFaZgDX6YBHT#e$8g9HG?p^uy*5yzW{1mAJjT(ZAx}-R_g< zOA&QnnB4gh%G&+SOSfyFKYYve-+Pf~KUd#!0QD`UfsRYGu6Tb}J>>-Gah(Iz*Mzn( zULzYUBrk{l@V{Ca6s{o$93 zu&yC5Bj`jd>WoXTS=F&pp-+RAhpZFoqIr@^LR_~&+1a*SJ!ud0uTQ&kk_ma_>E5hU9tj5<@+=UdDNkargCom4%JJdDA; z%aLm{=nJ39YO;C_Dqn`0csOQ5MYJgYGiqkki7UK$!Gzb{%1Lv>8hPsG(bAF!Jg7Hs zoznZK6n3VstHh+iltmkYwm6&&%{!KsfxY+5DZs|7a%@2$k z(xT4Q!r}B>-$%r?>Goy!V&0Oqfzt+%EU&87u~T8)flO==|0m3Q<#W6gb==pxpPo95 zI$?`{wANR#E}^wwx6}`P*ROjTs&n>Y-9xv~@`VW0u~*$O7ec@Fmfs`3N9 z6xLx_vDIFv)xddwZF4C+jQaIEl!VXaSO@X&AkRA1DZI=Iltn!bsZFP!eMAxU>tmnR z_dN#E4VA)(GHob-A+*_b`yJ}nBji_%&Z2JJ^+lcw-j_Fy;@|kvQNKRZc+4KJ*H-7W zRQvxC_TBMVe&PR!B%vZj85zkIrBa;ijFc5Bq-?T_ zWbeIq_8!j?qQo&uR;8p8GV&o5O_cS!_`be>{r>nq|6H%@xu55pbD#U%*SW6uHBLqW z`0+hIj;xJJqKXfT6Q}map~}}hKlWBaypP+C4-W}RsM3vV^o2?s!~t}dvtz`|USU)bez}R(Rs-_Zdjzh${SV@Iwp;GBybby5 z<(F^V6N2~!`qg(b;D_gUrmkKqiK=$!$npGl0^%}6Sgl+jAGxs7|HvC3R7uPETAE4@ z^4DJz59}KSzx*>gb6uD>59_b;fFo30vb=ryj34B$x9JDU%s~I-)nE1Sf3?EdE9YrY z#h?uzd6ouMJ)Inu1bnATs9Q($?h2|JJG}j%aF(3bYAVe z3goYsRqyJzL6Eopwv-?IUlGr%qE50PA{G6xM(HZ}L1~7+U$TO{bq<*z$yxBzvB!9I zf*8E~%cX+gK2o{L zYU03;tU1#9qY?bhvNglUsNci&+f&DF;eATkX#2yQ1mCBV06GQ#Hx*yu%- z(E1cKmjH1TCnr?O&F;c=yW|@j+u?t|W9nhwsXFQBnDO%#_|-k6e5sOARR(no^ErJ) zxFBrF<_2*(r*COH-2^}XTv66#$oHs9m!i4SX9)9F)){TV5B}n6(aa%u9`}`W*40Wt zZakVUS%i3rvwrG{g5WQm-%Db20zR|gTbMG$6UhDP+IR~4<06kw-%S{2K?Co`SR(k> z-_}`-^MHRn^DA?9HTczM+RWn8!O!kjZk+QU_}8O3k1s=<1kLQVcYM$eDQSwYT?G8= z>%);272scgWA)&zJoq<#XTJdcS5?j}W?`WS{`DH!mpQkh7Jq7Ycs%zaLk5+rcke zLkTyB_`re)m>+A1*G5`-up{f{bjX;FlgY40o2dLPVV_8^Wi-Z|?Ti{Z}0id{1kztO@ZB z!^dBn@&1DE>rPI4vjd;4(Qy#o)8XD{%hQ4Izs92l7GChY)Gqmn!F&y0ue@ae^EaG$ zq;{`6e9v^_)OYZ2kA!eUTC@VKO?BPQgoqbi7e`p&d=n4;3h}RH@cr&%WzESz&k<`E zAwI*scJ}+A*yFD0rMwkl`KH1%LIV}V zp910AMDW8e{VaTQg$fatxnHwf?M6gPneTqD;rFrkF0jwsK!op~e_pu+a_Fi6>eWGix5G?0E)g!{S?sW>hE;9;k=TA zdUl*25h=+dI_~*3psTC`k4_*`1^M~Li}Q%IBk79{M>Qhx|E`Jkc0eQn{iLCAs0&p< zAJeIjjVQdw&tH5+4^-n<9AgU9&-rfab95b%bH6cY8$U#3OQ(6?%QZl=?g_y;z@*-B zeZ=+_RS&Ga{cHXk3%>ZLO<&7MU?!z zUyd!Wr)kDm<_wgd>j$Qce>06!v0v}b(m3-6%l2%_S`y~fr#V^9^o#~)1*_!Ts&$J zv8~eW@O4{@>xMa0*R6Wwll zu>Q$DE`M_o>7ZL1U3e|TXL2i2wtYs#wOad=^b|z&XO8!goj|1I!xw{{fo>ntifM$n zH6v;EI$vRE=lLYlg;hlMr4PItD2hnqKTX)(eouu+>kJ6g- z5k>d&W7h+oh;l4KoxK~*wP_CjZSlbXJqR>Dc92^RJ>Wc?`n_TSRi}KsZTzhRRm;+p zON}2#wZ>HH-!5E2HDibQ5BQRh12)PX=Muzx-lsFAFY5t+LTcn*CGcAFeUtOR5AZwe z%g20o7c;Yh_5z<~afIUrTtC2J?I?mATDp$@dw&bAd$6>V9s_^zi1cC@@O1{{1DBCQ zTh-j;9#_og<*K$`4(+!-j&k;J2L5N2g{U8L=&Hg;#Y7{A zcRdPX3u~CqO{n;fxH@uJagiK;3vmnvw=Zs|CnJZir^;Sb$74R->qlv>c_K%N@;#}G z(U?yz=a;%`26E(>Khb>oHRd}%J3Ri!A30`lP54@6;lt}muU;OWMvg}F#^Uz>VLpyz zfpaf^qg#;z@Ber+;KSNu=WRzWqFWN;;pw?{_;9G%`T?k;>}+6pw~(d+^EzF9{Uo;q zIXTwtzL8LcdB27qH8J5uuAY}(5M=!Dp?RGF9j*Z6lF%BekY$g#{|i2QlXxAuD;=Bp zE;WWZXx{aBH6)_kqWh80!0uqSHa*}yR3|dHkk8u%#=lbvz)$1oQAM~O6{MCt z2K-}}kP}hBUkDs(`RJcuOXjzoe&Tu6gpJl`D>sa`3!wKSj3xzLO<$Mj`zMrJ|B4)(nmfGa5WIsltpxze=}U?6*Tc-v@%_1NWfNDQ~gL z{t4tW^V5_s=@Sa0KD=o6Ee`qan!m<(EE|O`Ix`CEzCk`~)d}Z9s!^E8v*kz?CFFbF z?vCJg@GI|oYkjBU3i1_o76^6uiNd_=mQ?RvK)z&+o18hjQJAhh4@a9F^7S4N+pjo+ z!ui`a#&3Q`evu^VU%ER`*qd#azm0k$KOT1ZI@ZG|!XZ*MC{hyz@ai7>6Y>v*KQ)e5 zoJ&Lg=Ar#p;#*KO9qq4=aNcp?*kz)z^eq(Gpnix1@y>x%`U|B)wJ7$!d}_eV4yZRS zs(Loy2}-h9l6pLJ55->lTqvS>9QcW!)y3Jsw=EiQK%VH0b1RzkJSf)mN@FWe9Po$O zX&_H3)|5x$PwhDHeNOe$-%zZXk_xSx9q$IXGQEb@3B(qu~N-ERMee&iNitY7t(lFnK zlF|eWo$fHB*y;;srn6u^W-2-fZ&*;AbkT`GmV+p%yQK2EA+)zqqxBPVrrTCb(Uxaf&6HNBV?9hbz^1sj6vHYz=@$YOX zl!XA4mL=ElZd)ZvVm8aPfI3^L(b@`oD=ko>O#RgH1@ITvIb}%Q`-YNR!>YZ!PC=e@ z$?~^@d?;<->P7kIPk@g)_nv45{G@@zZF|UvW~6<;JdV=X^&flpLjCLN4}KF-)W9F5 z9oF2;mwx3T=qmvHTGa=?Mc{9p^=qU7zPv`bTL}?uNKhuAUf&6Iw6?0|CZ|2>f zpTd3`Wj;1G?)_(o(zt@0f>I8k%&ucn!qz)bnn+?GfuQc>CowRxL2PAF@SW^F-+I!d$sp+ZrHy6DSa)z2Ca zqBMg+{3s00A9vO_G-QB0@EVRYf|{KuOHq_PgN}sK;+(wG(x%XTLH~{OH3KO9Ld!#? z3tcFy>qS*-4;iJc_i9DK`Jvg#@sAo-zoU%s#pVzpI&^>VNIiR`I@Iy5-p#7$i}LP9 zek&Y$2mZVX{j<(3D0h2IKk@5Ll-c<;Vod7>_)!)-Sg-4b`=hQND%g)tO^Zw_HE)*u{VADBoS&@!-=lD95As z=w)&T%6AkibG73_IW|^3`ZuVdK6h@+tG|3Grz&`PKMFzlL828_-JelT!r8t2zTZ)P zPa?Ye#T(`BvYa#V>xBB+mkUiy98u2j>xMM0*Qh}8uAzf5od5p*Hm9nF1LQBODK&Ay zx!%ssCYhl*sPIVJvblvf%0H!QpR)jYuhmhr-hfx<<#MahWuHSue+^aqzn(`0Lrh%d zL{7+~+{Nu&3VEUo6;QAz5|wmi$E5O>qoR8qRC>;TP*IXq2k*}uRIpxLl2!<~f6}G- z*J>faCkDOvECYNs)+qo#+xo1{-5tMyk8Z2)20z*Q^RV!NB2<*D>T;(I@>e(9wuy27 zfa@#i6V;G+x*>5wFZmZLO0l~?>>>!~X8Wmcqhf{MzYi16JP6m91^34Xp`tXBRGu!} z7fte2hq-7}lo~xHKQ;#bwusj!Z}*|1`{LGfs1g-!ucQCi2>G!Y3)Sy0?f}18Np?rd zG%6})b9aFKppbbi^#bPCq5@uZcvA8W@GpAgv>|WP zv+hMM6XbvHkrf^I0{NDnk>d}<1b&=7 zpRQ)g zR3dQ5xnfr}_$dlKBD0|WHIM4m7b#t+G*5KG)S(`goV;$8O#pvGsvF5DaT%3}w;f60 z2EWO3+ewCS_`Ru1^q-1QR9b^xrj5D7`RF#MQuCo6^nsNJ~^a`D(Vh&Ob(Qz$}_*Z>_2#-@(7DR;L=AV zDvinLq~nOdm>BPD2!4y-HYW$q&7rb(`Le<7PzUz6_V&YykU!ZjKoh+T{*K?>CPRW-Q{7>}mtXJ^-pI(~KB>4j`Qg=pG5w0(8i?Gu{ ze(G-C{Vq-+-^~Pyb_Hy5lFTwSo`8G<_AJsMuKB7nm(`j3lVgmYsDr8a1^ zArFwQ*s9=<7b@#7mAnD|s0u!v=f_4EP}#zn#ssV7lJcLnhMk-P`?P?wiB)`(fm5mi)%O>_p8z&WG|Tt@&ut?+Ri9a;qcj$*Hl zoU~bi7awER zg#0Y}QU=1Av#4@IPAZEE^2K(P7`{P(1FygGPECh(vID)~RR#Q#YV4-91?0=^Jjt~4 z!b#wnG^vh3z8QnlF()+z$eR_ql6KJ!^56_FMGu*yDw^O=>&B4R#@Hdz!={C*c2*jF zo&-FfHR@!h`vBB!wHpl)hVkrnHencSK~?)hxY*2;Q66uz5+CaCJrFYOb-zYvLsv+dupC*YTSYLn{^_P#+%!tpzRyUFbFP^5u; z$in+e6G>)>{Ii4A_)Z5RKM*!CuaZY3cUAd&_aJXZhOC&MIfkk|siheUEFjNCx;3iY zAN)YCMh4%!0e;VHxx54Ll$${jbih}7R!bZMd|fHW`JW!}PT4tgM!+-37f%6x6rU_v z#`^>EU=EX=ucZUe-A@oogzFEEI9J_<`!SEh8S0QX^Ksdt6L74AyXG?2vf=mZ`d^aB zkT>&N-~#70R5heNyh6-Hgyf@3tzjon)nKAMsZkmcvUiAF$VI4X;vl-UP=g2=J~#b7 z01p3&a_~KQ4EK0!`HL@1(lQ@pbSRehQG!uYln@@DEMzlZ{ExAToE zxYZzU=7}OdpB}1OQ&)RG40z*ej)UF2Kjh62s)uAi?u?C#eModcgd+#e?0E?Itb^(0 zjKplno9XyEtV08NGq3!4lrAEIEB|EO*_)6zW1v6QCjfafHCC^fgCK84S=8vz3gpfF z=~=W5MC2uh++XcS5t&h0YVn^NB6FsGv`*nhq?4&9E`++G>Y5V{vbW)RhbHJlC#*40A1w3)PbHz*);87o?M=jv`jrxX3jWNKHp7`xLQUrL^gu$0@ z#{rM3tqHW$2RthE+*tJyz@t9l-?7lHzyCY#e}FS4yQ-TW;6Wt%OY-f1*Z_~Z-*0R( zg@|v&(w{-xGuc=DDpiOrB2DN-g|w#t9>sJx0rDqEt_oE*8~}$Z_ZO7(jYAYYPHzKp z65vslC065S0gw8VlqsqWc$9a)RsS&HQN}zv0^l!7SzXmEuLV5nwDxQJQ-DYD^SROp z03K!JBj4@_hz6Py>98L1_1LvI2ZxLfk))jYy0~ z*6cl^5NW3nJ;$EUh{Ph?v12VAk(l`NXjEnpX}?6nlVm4EV&xCk*tmg6LR_We&*6VO zJ3h<{4Z?bS(`6G0_buBOVl=xAk%D&ZG+Hn~B+G(zQT-2y^oLHx=ztX>HOlmxWYQz@ z$gAHX?m>ubmB27#CW|N&G0Tsxtssic(~lyQ?dU;|vMjq?G~lXV_S^KdquS~uMGqfZ zL@J)77G8qqFi~VN{u}%NjWc%z@7v^g<5Y0P zDbu@N670B2O!Cttbqgju5x%phH3$zOQ#O*?&Fri#piygw+|ZP0$rwv`WAbft^6xu?Ls0>4Pco0 zq1B3GJ_|aot~O(z58}Ix_mnGi*wgLkxoiPAk>($U>^CT8TC1-^<~B+VQVR|s9)h@2 z)x`ZybErU1R!=b&;+T{eRnJ({F=@Uu*JiC z+w*20Vg|XdJZUKd^}O|3!(X&?qRKA%uPIL<4x+m1qeaASRLb&KH}|C_D*UN(z(=71 z<&HUjp)ut^>H6&bqzY~nPc`OzEfw+!N^qLz^e%{Zao3;tAR3R1YOz0sDJMwqeg#lz2c*$pA0@dn0gWw zR!VxlEYa=Q{~%bpuW&|)4)B0MQ|>b#Ql!OS(N>r`Fh45VW?||A_SNxQ26e1 zRA-+(RG479b@_3w6KsIVDY!e?nOkv;}7greDCH;nT+iM(7pK0c&$coc0J4g!t z%*1(nekT@xt;G~)3<%N;=2HCi|kii*=gg|{NV}mOEM?e zXUHkM?c}MYH>1S?`HOucs+#b8wd=2)w#J!*SbMULhznQ)Oo#66#Kn!rZk^V7fXnLg z-&@f0;);dLjn`UixXP6ycBAM-;C4EYk4WE_l2*R+>H#h;*}?)Lv^l^#JHYUC*+k3N(!ah&VWg9|9(?d3P!3&kkl zZ^(9yw~9^ia{>G*H;*cOrl}B9KckGuWrWHfIrE70RBLBTqBtU&dEET2l>l`ePFTOb z&Vniq9z3(%GzyjKxURpJdyk5EUp;30ejnwj`b1bJK1As+n8MyVGotu4PmQ2iQxrfW zn0cwC2M7EO_KnQmfuVnG%7I#(F#+115F^f4jKE8f-wWftsup%0!}u*#c-3%451)_Q z;tYoSyYjIAASN*cr_YB3VYq+V)-X{F^D+8B`3K&dA2r2AOrdkK*(P=$`~M0`eING< z$1k4LqBK|F^zL1e@~+2lp0em?@A`IJ#Jfu)<2(y4)uC1@$-ajxIOjyJZTp0)?#j&N z^0Z*0SvnKn$N(li^?l)J*Ne$zU(gH2F6eJzkN3OW&HfuS*<4{fAz@!>{=)dyU3B)H zhVk+jYfPMl@n4Ag;9Cv%^VBIM_6pozB*m+_2=4dzh?}=F+`o|tJxw6YM@T~Nj3>;0 zI73kC2Zi<}zkxdsS+W1@TD!YE503vT#&(VY-E_qbK+ z*7NU}VcJ{|hrS83Z>TkcWh~J!55XDKYovi zV-6K@Hu{RmF{3=Wd)@6IkJH<`p4;X{Kwc30KRFgY-4c(4G`a8c>2ieQLsPl^1}N( zY!M}Co?9Dm2FjGlFYe=+s5;)hwo&5_dN8fJXgRwZ)fH%*{{AN%HHsXIiTo;w+GV7N zu2`+2b_T(HC*J=?ZP5>XC040XYZH^ey_E^nl22OAY`KA&?<~7pS_`5^A^!E8$@{4O z`n4Zt$~aMt%rU2P=Y0|J=5Sz93E*&JX%)}sMp4Qx-x8LSf16%Y1)C3F6>Q3<+Ph2j z(P^MtpZ}%JHB6)VN--P?xmM5H&I`>dWSO2X6?vrHoZO&zsj6sAA;EbjsOsJ?g#`Ah zq_y0K|NFoHo3b#nM!A6g#?278^Fs+x>4R>>qde_vUwQz*Of(MA4ebx zU&Z{`6D33uil)By>Hz4wo;&spNoT(RBd;|-CBem zJ!sxmIiVen>RhK~b1ol4kLQUoyy0cAZU}oG6a@oaku1&^L}c5zz#WAck?m@ZHW!5< zvLg+v#I`9!b|L?o6dOWhZ^?o+{$)gtjV%naltbj&pR|=?sfa>zHG4{r7WD8j)3{&{ zL|Ig*Q1D1Z50p}V5Ae64+R2Q-;?NlMSYCEVLx>Tq+q$3^2@;?;Q%jz-&I1~^-^kV- z^yyL>qgZXwpNCGIUWrGfy#~LChmV0B;i&Spl^K!5|Md_T>Jdr5o4xmZCEy({w=C!m zBeGn2$7!2qh;q7E%;(U4u$K*UsqGd~%}N*bvZg3{bl{yznMw>I92Gl9)eUhRN8Kfl zmu&J&Dxx!TP;X|UG?B8ahga3+IYET!mr81fAXr#jE?Z~?td^91|L4TuZ5Md*-A z1^ctk`?)&;KfCIq@M-B(M6xHgFuITs#aw08fLQ@OXmp6UT2+hc!+cusEY!p5xe!jx zbP{M>kkUhIsP{x4_=5`Kl6#lN!qg#d^5w`WZWm`b_oi;2DjS@)^f9DBt7rmM%-#-H zb@Bi_Y?RX|JUb?%4m1#s__q@GDiCF zmkFJyjKiLTjx7+C$sX@!{>h2TTyDhJzVAn6Q{;VNYk{czox3tY6!4-a14FxI0uU)} znk<>KifT?=^&i-G739{Wx27W0ne1UVq7S73>Mj{81NjBLqWO*1un)e-XFOrnjf(n` z*77$VLmk9)`iG5KsAyt*@BMS|`;{uIN-0;!-_i6sqT-Ho#AGCuDPu)Y)mblK9w z^)AZzuQ%6uFFVSZ3GB??E{igL>{{+y=!SEKC9Q6xd!tP5Nng{4?@^|?G{e4gC7`D_ z$Fu)kM_HfWtuQR6L7rB2!pgmGaNa4i>`q}5RNNgDto8mp>>F<3x#P}2v%gik$pM`k zqwl(p5(Xmbo`63u;oUO}`@>!+VNhL9$#D=ReDb<)cl{_zm|2>WgO=<-n)z_IQe0!Y&xpRyH#}TFe_@PykvRAx(q$;svk^W zPe4y{vut!DMNsn*@zHOCGN@Jce!?l)b<{#W+Nh!a9N`CrEC&+kP*aqlD4&!kdOWAs z7U({W>PJO3>b7g3TDK|tq2t>S<)My{w2nTixP9$;cF8!LKdW(QqBIR9N*`h$qhZA{ za+5DTRKDYEE*2ZbV@A06eUxL}$xd8l)N3*MC=OHbD~(YXWn7bgYD~Iu96waMez)z5*-9=(7ylz5W-H~3_JY7`${>nr+0qS^N zo*VBw2m2bPwrV$!gZXB#whjzO4^?{OpRGKD`4(b5{NoeMcW&ghC}WuKNLkm{cVWJT zjA!XDpeL{58qImgs8QT|U(c(H=#f-&f%o@V^l<2C^nhg(Z|5sB%D&sDG(>S|!TypzP65KDV z(XIs&j1R>Yr<+52XT}X;Ar5UV{y%%0Oz{7R_}{!Bhw>CcckixWLh%NBl*BpqHj{=~ zrxRV_TqNg{<;tWtI4AC$C^f@lTw;FxKW2+zn7<^B^FkQz*R3X?SRTfAz=ILpgUrg(8*Hsa|s9MmgnIdT)(Z^uI zVd3i4@AmLKbm+WU*kS%e4^Gi~qS6N=*KLY)kgZQeeAE1C?Xe(ZRX&b4 zVPe!ixPB~Z4I5u$T z;H{OLI49wg>hozizyZuPzZI9l{QdL4ccvZg_ga?Wmm(P7S%V~=U}!H^`L7HaKeBuC z?WRsHZj=n}d-1Hkd16$8VYPS`$Mgi4@>7#=_9JPoP^k)Ba(&W>noPn3K3WBZZ7eC!jnCqGb^>yMwjUXF00VsCD}pqg0|F)Uxk z{isLtIh^ah%eR#AUE`+yU3qk0%BDUZ#4h2xrJvuqcXCT#zpUcDrN2LOVcpW_Z^eP! z1^qr>Npefy_t>ewrT>df+}pATq_jd%qU8M(fx3@S0blg$FCOsIdHiK?%Le)L@XQUL zNYFpsrf>Z`ZU^%Dcywl=6Ub{*^WS$kKz^H2(N5g}d0xWwisS|IUFa!$+j)@pS@))I zr)fGB#3p)Bf<+^1z$p%Z+owoA$@uMk>5%e>_|_ z#GCfVRkazsX@A&uXW&iynkZ6x zN-S=Q7WW{}r{Kq5c`c(l({TOh*Geve2d;HbrCyG3#*~Mj#7CnVaK#+~m!5z!T)>|! zpfse46OUb;F{d@(Y`?T+YJRJ~yKAs+VZJRYX}8AXHaW93z7Rpft?|C&k=+`9rnvpq z{iM_IZ{6Q*$MLQEl{`h+y8q)6_i&=5b}qkW3ohWZNhf~%i7Px-nZH|}f$^A~Kj?ei5{|;WxDdtol_(^DKSMe(3m%Ow3c6YIv&m~%h(fqA~{#sgQ zrq-9{(mUz%Mv2M)U%Po5Kg^wa>$mg^LoUfJePe{u3HrxXCwp2q&_{G^g$3YznDWAV zI5`RQ6+Z6Ssy5JHO26rFO`%ugd=us>QBqDd){v9Q=!i6yqo%!Y~voNyODJIXE*q#k|e!`5BS7EZ0Uc^fZuNF zgAAQiTlyivk_IT~i;p00v^yxMsTu0b$1$IXdklI0-~A$1w|k(hNt;R2=6rk)^%OwgJ$Dkm z2mN=izQC3~Ozs-n(vR&<^l$3R-6ME1cGpr4CQ@BMKA^mXJq-t}rzf6xDw8@Q>@$4?I)+0yURbRo|i z^nKO#wJrT$Yi4xI9?*7L+OiM)4_9y63y1w}z<*CieT4%hfIYFFxwF<8>c{_u&;a) zr&7Lwy~W$GnhW`&9HKv5)Zc+Uwk@i^8}?;XRw*l&a%+y2L% z?7Jiutu1?xe93pq{?mANe9Inm9eap~8%#YHOU{G680Uu%`~>^)9mk#e8n7qR%-oV8 zuZ(f8-8UTy*qh0Rxj%$}{TbODu?xLuWsft3zuL0T6@0;OesoEB9qMm`{Vp+` z`v|BQni$mBvhTeGk8IidLo9E={uhxDc?{3}bidrpp8>!JQtmr;Sp!~RlNHx?0Pus? zBwxs@c#tA+`(JcPw)H>-cYG-zJ))W6oI@mz#|M=z&{E2gh6ExP-?&pT(pNWAuu1&nAYjkuA zzv1W|*}`+OUOhw)n#K+t$?XQbM}Dd9GXd})d!^L~3gAI0;yHn2z=tT(cc5+v<(Rwo z5y^PKkD}acuQG1oN#iekw(zC6-iKRw(_c4{E&M640&qLPqug6MfHDL!j$7kRJTC6j zPP~cFnem>$n|PhBV?l5m|}QxgIALt zQ?yQL-~U;SH}OF!6+gU*7pAA}#hdtHjKof$98#kv82~@-oqzt}EYPBV<#N(E;BS7g z_d^??J?gt#?J?M!Ul(1<;&j~cg;~=S{LqDnf=PL~IKilu6 z9ftj&+iKt+20UTlaA6bB?9h*cyg1|Yo^yZyE&}~47))1(GyZ#F_RE72XUqgeCfr=d z89xr92~{1ONmb5OU_Fa7c_ijy`%mFav+0H6?pB;RdUq(}N+r(vOt;~hZ-cYH|25NV zGR7eP{k+I581{pjJ`FaUuUPEF z7ddV}^~3pEst>)Hu@;Kj)=$qThhx3ySDtT^a;`}Lck6Fb}T#zsvBi`SI z3%{_7D$@{fNr9T4eX=0``2-ieOUyXD`VtpSwB3Q102i$k?2L(9!o?EFRHLW1;o?+@c7J(Z zTyn#RBJOn-m(fmM-uC)92KgVEx?2weUSyV2-hxZl+${}krGOGI@?0syrRy9*Rw*(- z7pz#HPGi8w{`njohyU-ItZ2D~0Uskb9n=InK(5`!p$?bH3N1cbqu?@^uu~6HCUDtQ z=4su#Ot}0VZ=2K?16=vUmU@kb7L(Gxa8vIuz<`gHNIn06D|&Pe8VDW-8qe;0K^#}~ z?qKK4X#~3L;d4R|10L9WD6bQP{H-uC3&bFg_gy?l!WFYIlRsoDa3$lOzm36uxKg`i z<)C^HuI%gWlld!vt48cavshQaKDlvQX|V(Y9yq7iQ;7i&Tx9sP3xmAu;kpfet)uRb z`ArT0U3w*yU4#k3>(crY;u!GH4N-y&2Kl?X^Aa5f{L|Br5Q_<#${%!cBr)OEbFMTw zAxx;d^shSf5hkkE9XfMB5R>c&CCvUPVT!p`kJN-Y2K@6$?D#GW`@!dlk|prV)cqst z-o_w5OP@aL02&uJI1Bz9#!_z<^s`(mZP@3st)qu^vkNKf;wF78T?G@f)xh5SE8Y>8w1{ZW2MLz zgS>QUCuFxgv1eiw&Uelzj6qJyidBB;En;$*VsPJ ziviEim}gzu?AP{g&c)4sY5GIIZ}ywh$_)MUu)Z>BkJ{{a?^ym3=(pk>U*prwe#MeC zC!pWEzgc9SLBI8vSWJYVU%xYIOfbK#C+o%H*`Z&#-*isK(C_G~=k)E(e)&z;jW_%C zZ=m`E^IO#rrZWii-#hjBmCbn;y5H3Y^9%_Il*S=N!D)9&ASq#>WCmu%4*u8y=|ujm_V~QUU9#Bzo6JE?8F|n-*!_z`8Q<$=$&N>&h01 zug=4|nxMMY3hPY&QEZ}>6RfM7Hk|4Mo9pVq%!>_JR}~YQbh@yvZtA4YaKgIke0y>C z+s$=##CMMvyf>nCDW=vy-HMZqS%EG-x~G#3@6pajhzquCJFLl`}_&%8lX$sFJCW#+!!u)Rsgy3rZ(`c zvjfPD5a;UK$8g1Lx>Dey4Uikh!(%%qL2j6|?UNb+x$&M5Ya0l1<6-|DC%|1cI261s zD>voFJ$KP-n{uPdNw*Z_qnmu?({`YQqn8~`Kt3Lz>PsX5omaTrvIFE~?pqdm5s;IN z%?ACUn{v|5%ljC}$!k8Zr1?Qkq6v-gA&`?PS3hmb0XdnpvEXM6a>wJp_2A1CQKHH}^q`Y?{kg*as&L zY>&7B`=E}n+zWfy2hTo!`eZ-sgW^f8mCs=x^w+k}OM!h*?OW4{HJm?9YpLS%7Z)Td z81tC-!#*gUcs`~G_CeL`Ll2f=9~7w;|8O7n`)dZy50Zf1r(Ir@gZ-YRg-eP8bg4L@ z^&;&1J)cheQh?_l5GDI?7m0sH=;wYSHXa3=Ssb*(u=*!QQt9vS4qnPX?e zyo-L|tVyAI(Y>ZP`$s`Iy1E1QeWtI|=Kyc+4$>^ql*zz07`Y>N!eT;ryV_<+->$FaX*uV{5Vo z`W(kw%PYn}8)*FlfL~d1IAgyKdY#`?^@<7Tb@_lX#OL z{!8y>b7VZkgBjxI84C~}CUSq!Y8%d0;btBjb%6LWA&T?93|y?pG9k5m4&uw?d*mD= zam7jA+e>Ns4{>ov7EKpZFsW2x+b-t>g$^6FqL<|g*k_R0xhGE(;_p~u9fZ@M zpBj>wY8dnb!AAdyLqDlOB=_skPeM<%EWE!{eUyz|KcJtdBCoyNpr5w9K)EuAzvBoq zt@{c65H1~LfVhRy#xwK#jwp0k`bkPJWSoX{CKW$41C4KO49dR8Oxcju4rVd5k? z5_!{LQrU|()9Ggl9cHU@R_Rx<&(MpTI%f1ZW~zhx($s658dS@cuK65it2=+{;99^1 z`cjOuH{Ri5Ww!_4|FGlIFMr6SHaJJ^;GqDaETwr+N z^AFFrxL9@m$;ixITsqgCEu-g+E95T@D<2xdRmTRdTm5OogtpQLTB+igIQ!rSjld5~ zA_-d8%&#hRKuxQ@ua4Mfs?&tI|1pmFQ8Ku6ngORq<&9jjK7q4!-_$RvKE(wl;n^!G z@O(5!M=EJNap@1&!d0$GT%nw$mU`;~t~ynn+41TXCUmndyO+mc;?KO4#eUGA9wscE z+5R7_x5bTOYc1@vXr@9DR>84U{nlb4+i_~D0ol?A-hcC#suNU-xZuWi<~)vGTx{?` zHB#(1E?xb|*8JEMS6ov35_gb)3-ecdvcMB{O>EKLEEp8E|Ob-5_K zj8tZh4xGTg`=)29%m9bx_V{*>i5{m`-oJEFyBlZU+tKm##U)(eMlNe3_2FXM5#4i- zLGH8S0g5TSKX!Mc_=S9Ml|>t8sG1TcEaqN#?h%7Ye8+8D)j?mJQNQwmdqkl_ST`nV z7c2I?kUsb3+Z=)l?47BsgwAwDcc@{bS}#l`WNHu}NWaM?NT z`vnd#Z&~FJ4!G{XRT&3lpE3UG@q$?{Xi^fTK6uwh<+C=YIeo6rQ zwhVm_m2|+d9SzytZWTD~NHdl1bsL<+RTgJ)k{%bl)6p0u?#0C;;(Nl9xNup9u`x$s zI<8p#!7G0OVZyc=f%viem{>~prN;^Mjo|?HPha+9GFe+FkW*XXb)k9(H9-RV75m?@ z_b|b6W%7G{4+rA37s5OVOnY$7pEj*|`zBm?)HJJRiUjBi~Fs59I2sPv4RjALdDIH?3!~x>pof12R zae_qu0WYPaIAiySuW8H$oR`1n2vhtVE;8T28seLbODkm#uTA;liV{Z2%tNm+LG9fi zoeh6X3iZ?V72A&~Vn16QpMf1e+D6#@g%($vsib(MJ1T^H(wFj_F~)&&<#VP+^Eh$J zpXJqb56;T03yC(rfeXB3EY-+2aEXm%Q!~ivie10x-;%(7FuiS?V)+b{b-bjqBV{pV z&f-!lw->Hn3P_4R{sBMeqW;Op_Z`<*CUgCmsy_N_pAw!?f=X!2_eX-eIGq@^d62mF%BRz260KyZ24`SLYy(H`+0k6V4$K z%?e4mZ4Pn1-&*IQ;QYbq(;I2up-!HX@Ng|Y3UR@g?&?8ZkZd&<$DJZ^5I1c7HMg4` z;)p$_168Jx&!|&5(}FOxZ)G}`4srbxlOabf;oO$SS8I;uaK4P_NBYXWyHUj{p_UMH z$Sa$6Vo+qc2<;n%`BPtl_C3vdzl%frbA;J^wUr&F-_{A=C9#UF__7mL*MibC}@0b)V;J`|i_`>&((0;R$ zi^vnGgUe5*yEO>yFHBrnQbsXfB;2oOs34y)k;DFbA@)c-aj~tN@sq2e)t;dFsj4^&JT1!oVsy-+>|NG)@W^R^QrrP9G!PO)$jYqwM1n` z+1W}~rII)|QW=R*MuUosN;1mcd+%c(<2W4SIMydCcebQb*%4WZNJ!H9UEkkd&&Qj( zA0DS%_x*m|*Y$d#3oK0Wmku#n8#7s{9We0GVr@; z8LrWG0N-cy$q zQF3Ua+o#v3QPk4oYpz}3KQJ3R{4U)W(Q4it`3g;7FV5v^lLPeV2u(Y8wLU3v5bl@9N&hLuo2{@>3K z<`+ALM>I>8 zm2Nf(RCdJh=xV@i@V(0VMmW=ls2Qt%(P#FeLiIE32PUn--?S*>S_Sy+CcTwx(J(-n zRoQ>CTewkj|HL(Ow=*c(H0q~F^d|B)y(V_~zAP%IiF|)_$_LR#jXKoLBVk^~;Y{3V zn48-6jifrvhNyqpr>a>!QDK^3uZJETk;fLh=G}cDueC8;IJ*jE9Z1eP8$O9r4z5x@`pO2kpCCycm|<62r}COXN+E<|B{{Zw5H8a zP3W1z*}4r>tt1KF8jn$BaqFf|4&qSi}>GP_RYUn@i2?|C=+3cpCW(`l5@I^a>Q=*_i84qBA^`h0ksB z!SiL-{4f`IPE{>oxDL-(zQ>)&fM>s%Lzj2Kvw3YVa~?b!s@WeJgJ&1i9;!;1Vwiq* z?8GYJXT}lZ)Qanb$#+I#S~5I@pGLRN7dD1MfB)fx^Y7%nHD~j?-G>w#+hMVCuIw#meXZ65{yc29ad%t0nc3REZmbwN=-eXCALX(R8gys@2< zny}AM22(4cUmuqYdfg5|CGsx_&JV$VQANSTi9ZNY7Kprk8=Q!IuFN}11U?6oZ6f58 z<|xxZ$vf?8B-Cj~pVgKj6!lB@pA7t7dvBW`-;weJ_7}3|x63b4X{+@MjjRi(1Rqz&I3O`{^i)WCWv}A|CYxu0-~(3(h9G`|A&hQ zv~NB-uGMnQDie{AT{h)4uyjlBS^`>UQequLL8^;U# zN%1eOAn@-y-(7T>Nf1#D^?8kd*)8F|?#Jbb-uA*5=RDoI-^^LK6q-^=gQib>#`t08Ci%UuDH6HP8`|3X5! z;Nm6nAKbUs<$vidoJGlFQhG;)giy3yL|mNhC*=L;`d;-XQLu0Pr~aiU2lkD%56drL zo_0t0p6zn=uy6FuYwr62`^JU|AIl#^o@l%~aQ-IB9Ue%kZW2IQ5;dXkifT}bLeb7M z?tCbEBsM{C1opkpdQv`S%&5HYQ=!Zh713fYHx`k8gMXgj`b-hzW47{M-n6hlMLJhM zo*(E1zh^BDmm{}P-t|ttMDShA`g7)?FLypl8Mq)5dX*Q&G)5>MbtPi<~&tZ5(Y4@T;am!Kc+ht6ij-g?*{BE?_G z!Cb8V{XhABo8!?M8f z%|-?E@!Ya;QS(OR&V}Vc>smxAxzk|U{2xj-O+Rn+HVFkgvf8~3;)1zDl{lYZ0_YLv zY4fUSphu7{5;IP~+@XAd&UPWtBO(f~Zpj8cB7H=c34+`3&=6`xh`0Z6c6q8GyVciF!=0?Y1-HPz% z2W(;8F8}*?8)4l|ebasFux^vV*Uyo#ZrZY(iVCcou?ddkux?w{(aX-QI#; z5+FMyG6w5DedJxNgejjnyhxdM90?oUs3ALFtaJz2*h5$rWk z{d+v73&Z<{XKb7qP7ad#XDcOxGqwHNaw!Ps8Yk5BN3&wG<{t+WcSB5>_mMiIDTAq} zBfqdPUBxBxC8O7GPvTPi#ixGW4VQh=TRrtP4SS7T^$Ahr#!(B}4 zoOxmG$FJcpIQI%&jY+%|lh3=KJ{+lvDT{{fA&;{$l~5IP<+TVdIVOCQ5-N&ITPfXP z1IKXLg0A;`s0;S`STz0U?goxpA)b_Z+=G*&_8k~)GsBriL(liOzs9-dOS12eT*2fE zHZP8ueZrKLpM#9q@b9Mi&&%bgFfKXuH|9ysQC#|hJ4(&O2A8c8?!EeT9eaIyQQI+~ zjH9>s$?p!zz{x3NU!(`5apuj;a8Z&B&b{qt=&`1X$yYAl(-PeY`nV%&oG0k@moi)( za&F?1^Q8BE|9Wug@Is`kwGyUn+j>csuD)~G1*?@-p_@3T*%F1P(7B1srD;N_vMRl$?Y9%EKTt9{>a%gymAM0 zl(v+)r$yLXo2V`Tx@5HRZx8V^@bmVIxA`5sgEK3M>unMRI5#;`^Pf`-CdY4YSL&F> zh3a;i{lyiSn(4B9%AOyWq!}n5N$SI8M`gyJfzCy{d4`FL=@j;EVD3t#tmEiT`G)*E z**N9k{^?ut+i=!_v#!L$$vAiLYPrk1aZLUo7Ixp@B`!?6zl$ad_nCh!pDP@-!KFJ+ zUZtozf=&|E8)`FyX=4!`KQ#5QPrQk;KD0$(ab98!bqj=%}h{v=$?FL|;?bMQlwj-f+ zeSEu4p&Ia%rp>=Iz5C2pxp>@S;LMADg(7HIDN4&C1X#0I}!MQGj(98Ot-^0CR zLT{KRRpPV-fp+gHg}fd>XjX1&KQbUopluU=4jlo6riYB`ib4s58jdZGohOP3fv&A} zKg-o%Zt_83_G@tOJ}sRNbcU zlPczj>Jl10eOY6G`NObj>e~SzeO-~A0^EG*asLaZGe&N*l{sSiPTDyIE$BO8{(jR+ zHwV*MqgP13Ixu~I&o7nOKuni@Y}YR%gX#Lkw^JD5b539CSQfsDD~`+wE{YrD%A0DZ zzUsch)oso6|1uhJU1GdC&&me&U63D*yI}_Oq!Am**!RoM=%hC=2f4`C_bV+3`+ij) zc+r#vbCJdISA~+X@9*U5AQLa_$N1;nuvj0YvvnS^*lB|ORD-5C&+=lwF#U~cm051&S9KAK-Al_Lq(L3d|>7|6tCp3#6VBa$3T%i;Ai&s|+}H z>Fhwy)vY*o+0OgCst}G{gEY941331NL*NF#ACB93XH(+w0FL9acRu%X3dgC6wk=E& za9pq;r-hvjj^D>t*iZ4t35vw_gSTyQlDlTKV5A;SV=)h&O`>CBi#KKKSPrlz*t}~A z6I%sR8Cz}vKe_zJ_zn}>y@OO9CSYP$*~>5n4NQD3roHlY4HHMbb+_~>VB-4sxs&;C zaH=$S&cD?_oSOVF(`rx@r`=<^X*cPOGxi%seEGzHvz^^4+c!CJUiRSB@uCcvzcdgJ zb|(PSoFbZ1FiBas%=2CtCY_dkH}>xXCaI!0yK5oPzwO{P>BWvo+OwSdC7?h2s`}HO z=MON+TO)O2BnFdOwk&M@?1ghAwbPm&MBtptSL0DS3^@12+xf&4cT8p=SRCP%#zijI z#1b?bVBYieFV3WQK--}h;x1rArh3o-&gZ}3Q_0a|G=>+bJKpDFMe&2 zmvtY`mwOec%x8u3&lp6$+%Jps@2^a1>%uy%<3V-IYM6ZgXVQ_q2DqRto*}rY5Er?N z`qgF+;j%AsTz&0fFkkxmnKTvdW3{#)bMtfrTCFy5En|wdnEB=NVwj?n^ML&x+*9dg zJA?+fVTw_qq12s|m}1fQs{-_MikoDu(5q}rp+;PatrW(EEd1F+DnYog@7R|m$4X4K zcJ#3Jxr9q&l&OTsMqKe|>x;ajOEAy+dE$V56Q*)YNH2eYeVscYbg|Fm?K^jShs0? zgp2z;n3-qGacR1`Db=?h)49u)om4GwRoO3sA;ocb~76i=p(pHAPnAXzw90nVh*8cpdGn*l%bu;yUQ-FK9x5*aQhv1%J zsy*;$E)kbAdTOiZ(sB6(6W`DOAzVJRF)qa$is^3I*?!L&GMyVSxSH0!D+<-MOE@#2U0+$yRhYh%9;_~7Tx3{V(z&(a8%kdU3 zTwZ(fh*dRwe%;5!{Z-U)`O<}u^Ea0;o&TZ1o_y$&v3kfAS)v8~8*dcMY)WyZP!ZF( zl@P9e*xvZ=R12;>i@{Ay zYZH~1pM5Uq3v-^e3UX$$3aGsMaPQ3wn2TR>*z`1UKy-e8(`l_Ih;F59HDkOE{g(qY zM$Q;iDHLO%JO;ke4?Skbwaii70li=Og6S|9{rO+*bS0v-C`KPO+XOZ-1lGg*Q!7-- zv|EVQ{`sg`ixQ%BA3Wl+Ac1IatHUO~Uq`g5u?H9R9)b@|ih_}@7An7RPT*$zO;kQ) z_(1USHbi$9yv`uMj4F~3`ex~jp{m~E0vYM=s8)YWzwJBt+L%`c>>n%!ZhYdYjY4Ht zJ!&oqkD{_`9vm)3;Jb6f?VpYc_;=s(EXkG7LS^=`O@ssbsLbR2ajOvU3(CkeuU|NV z%0BFz`QhG-Xt%a`@_}zq`MvMy-a7q=-jbB6Txy3Z$79Rd0?pAA_!ZX>p~2j@W@mK* z0T{wL!wr5)E`PnVq;yb;>w;ZR)+{P{+#Y!SA?OL7K6>8A^-xK`W^KxJGb%|CW^y;S zMkVz6!s&W@RIQw2-nr_JsQjOWM_57s6|KKrUoC~G z3Z8YG&q@*XLhP&0?KOxRlDnnYMF>;nQjF}COw>*1%9~{x{U`>w2SGjg>ZkMD^(-U7KSJnCE`WCE+LBX zq59J$qljX8y)dRR9DD#zkzOR1B1$pm(Z~D0qC(c4u_9TJkJC5b(8C12ZPpJhzDMl> ze=Ys#sZ%wm!u6HIZmpvzpKn@sV0l^ z5A-(q23Vtf@eOIl8R#>YzZFxi!-4Y8yr}ZfhWS_rTCIpa_*=HtzwdQRLSzTK(e*bs zP(jBTxz{^RLSBsSsh7LWQQ5)}?WG;)rOKrzGlCC<5NlXHfu7%%K(7%C5J`w##rFJ4xE0@9cyWmeDwd2rP z=^>O;^|az-9r(w*&=~0uc!$UgkAA15+oK|v{k=AxA>b3RR8~JhLBux6knhpm!04Dj z*L6f}H#Ju3bV0<9CB;9^;IG;(B>1P{4kGpvL)a}|BI4Lg$=JS6oj+sfX#& zQ|Do>Amsu-LFExjb8xA!j~_!B`xg6@O{Gz`%T`P73q>d|JHNJX=?nN0Xf-%nY66p( zC!8Q}bXn;8(^SZH{ia~C`gtD3t{PEA33($rx1!`IPCu$d~M>GzWJME+M+n# z4|0xM)=-@4KfzSfDHIn{r0gkn9L4W{XQJ%HjuK83+|&+&yioUXlhqF!D2;{7jB~FR z_#iY3kDr5F=Wlz4&TCEpQ$ya!lpx=gk_UqOi;(Zyo6522dgS}_$oKCyEXZ#QW25^I zVdTeLPZ6zKL4N#wM4I(i&{d#P;Xf8g<2Ug#MVpmb8`^!H5^14xv!|gh$`0OHf8SF6 zb^?piD%8oP+xNLDp-yJJ{@^SMej{F&s!O3yzO7@pl~n`kqJhS=rZn6`-3X7^4RiTj zo~QKoeM7XKy3d!)QxUEIyp%x()XUj>hZv^Lp>k$bE&uv8xK|h%^Vsj$8rXhveT_u?zhC-{j@|oKZlv27$gV+#^s2^Jc4!`hcI$@L6Y~GK;%gLNzWz zy|E|MWl^9$+AdAMgF1NU?t$*qY*gmppApvpb<^iXf}ZCCR7P^E{dos+FFt0RPgi=0 zXx1kuuFmG7a!38`;kqJ--j-U|r^0|LKQb@OKBJ;1A`OB^qpMJfyJg7xL+-%bj-k7J zsKkR$po;P{w8 z3CK^GS>-T?oRIs8hE2l8sLXnT$}IH}m76F#v#lIO6}fL}@r)O$N#-q!Keip}pN6H! zDX4e+-dRViMuGF=X;z$wD$xAlXk!+l3OS12-`9hvBE4TufzD1nm@UyC33cd%@eVg} z$UQO)IQa3dBBDmPGk)H70a1UpF;A7BK*b|3jy=61ib_dJtJ+GA@IE#D%6@GDRh1t# zl~sp2cQGmR_dhq_bA~UD>xiO%h-`a41NiBUcd;0vT(WYKJCq0Y@n%S)#5|&y+i?G~ z5k!6s*p?VfEn2b6~5<@egEt$=)3_3l+$BTX~O1z zty{jsT!z_8wVXWgr&%-(xJN zADh`L)u_mOq_cG&?6XUg__h26@WUycYTyh6u5)>6nYX7h@{uK?$2p}NLMs={&nO+B%8o0?q|)26s~pi<=iA9y*f?b-4G8sl-yCCW(6px zwsDioo&n|d&UWclAVl7tGhW*nkBS~Guv^S!g8$A@%hNt|puOZaZZ+VWU7At%5b;$; z#2a=#sEZ1d**Z#y_|BrP#rGQ`4!?eT(*71AeiAm1?9fK3TX(mL+Z;ftilf)E0w5=s z1Y55;(G|J1BME2Qw;P+GXQ-HPsT$2^_W<;@n zedd~_FQC|ev1|X1jX+%-R#H99F?G)@s_VDZ5t_m3jKZO2^dIP;L-_H*Z4%w>=tqw9Sw6YvSx^@(RLj|=(jot(H< z9)bKMw+~oL{zQH{JrgU<`p7TkU0p8NprG*J<2Tq+QMkzH zS+6afa9-svsqUfx?d~7cOag8+H~K?AcQGf4e*QNuFFj}dqY=JOul$y{D2~hPvP9N} zp)dJG=-EnDZ(RPh?GQ`vGfWpyeO-CtHl|yj5DR|Af$2Ytc6{)Oz?BD_y>6b2#MMp) z8RuLGxK8+jG5wJ#_!5Ky2KeUZMJl_$+sStGplH?Y3hP5bRkP&V+$@HWvrjEXUB98-_Lst?&FG- z%R5{_2dsLt9`WOr6|TL+FTqEXgZGg3*!fb>CoOh=IU1(`j4sJNZ-C1zqZY3aft^{Ub$L5 zyoc?ub7~60C0^soVXrcAi68NC=Daj63FE%?p+gy$5M_?cd^Nx&HI)*LyNS4DcIzctHB4sA5da0&Z-Yn4KHYZ zyI6{;5s2GjNdr@VKHMeoBN7*nsI88K8ROFIM>(2ONudAyJWZU}!Byq%3m=2vefpx< zN2Qc%py^qM-BG~WdBUUZn4+G$O zgFb1+sshf>GB{sbH|fv6?Kt0gGQ|DB1?Z<{3I5tEg2~QKq}T~1T+p4oM|E)>7kOKU zI5VHaWlQZc8n?zU>C81XrS}cM0;i8ANtmQ5xi z@gR31A2Ao#sqm=Px^YoA@d@DC?>Id%qenBp|n@}dK2mZ1MtC+Qv`V&63e z)uNkLz{qz`?iXX<@7d7<=H1x$N86+PLj|A@9u(~=_=)|tMtXClBw)W?D@yc62ka-H zGwWxqh5a<-C0O_@v0pT&zGl}I>@R3N`jk%&2PnrY^)>n6ApdSU`700Tgzto;WS@gS zUhcRGc!%`*s3f@D1A6kG$0sQ_Vg?hprfiKpn8*q=As3EqMT8Mm-qy~(d-XNdkCHWd7ALNtfDxW4@iF|UL z?B_O)BOjXT>+tmF$mjX#%jUNlknh%obe%uW$k)Nj)K9Vt`AJ}b7N<&>zn+tO|9Sug z(3KAz?cIk$SOZx%b&J8jaLxW=MG}hnp}6}t`)**-mai}9C}tzvK6-aQirGA`MgP`? zV*Wfmrkdh}Vz(zRf9L@JGfrWynvfkRR;Ksy&nW>Eds`(?{)7>VeRcgvS4Sv{Gfbq> z)5~B!drO;_%`i%Mt8_PF!(WE9X8(D0E|dyjk*RLf6Z`hDylrI4|ZSA}LBcbNMwQF07!6 z9Wf|1{Nof(Q|JO&T+=Y;1u>2_H9B&>l zlW|Ag1>l6*BTvZh{$@3?|78pKo8CQ<<0X&s)?D1Gx6x4EhR-UqL8PJj@^NCtkV2Sxt;*Vq_zui`nl8x@RzSTFTCrK1}ge*r^3CzkaOGM zJ+;Kai;6moNXN1vpZEPTp$Pg!sXMnXk{2+dUYq&sKiGhZch(Gkc?JIFSIud?&!AuD zpX(#OWE!f-xy!du7lpt-({6jxATa0f3-M3{ezMud+be;+Rc|YmQSpl#kG6x4e(@`p zo`;%{tI(J7J5F#XDxMg+MD2$h(w~RUuw))aC5I;ed$Dy0m4ts|9_rsfrP@-5iauXL zWgVj&q|+}D{leAnYNd_t^H4KmI{czxM?^Z-DM_3i!OpZm}&l#mRp33n~pipnk@iM4Wv z_q{8k`7;LxQJKlVz~<*CK~JkTSE_*i&fDx8S@Z=|_OM!|`Q0~E7Snxk?Oi!4d#)ZX z$L@h>Dn3VkM}n`N$ZL^V`&LAEEt)IPx`HZI()jZOT~ST@lAFBiMeGxnPAymo}zO{K3xzjF0&3*oD$Q$gGsSI)>85ElqDfgdC-h zt-|SNO;FmboAqb)UnuQsb@7*aI!fQl+AOp)2c=8a+xF4swV*l%G96j&jew`gE{j66HST%6;<{ z`g{iiH+}woM|s4}kvMuOBJ)_*-+uWQ7498b8*_p_n#OO@N(j(MiyTJC<1VnD?(Yny7i^$LF6SY?B5xFgD#F~5-k$c#r)}2ie`8}(SV^%pL|IF{> zEeAdF1W7E9l7I@z9^WmbenXUuoa*1*PVnCQ@zBE&$fcCJvCYm<1pJ;)y^UPv2U?-e zt>7>Cq$1&s%^dhtpPz^YU!cOehYC!adZ@4ge>IMKhzg(S$3I(pjtZX}uxP%gfS#bb zC7vI0zW*6M|IYpr!92ukE&DO>(NH~+)C>CZ>bIRocdJAGg7GDj5%62k;lu$MN#I|- zT*&BU2)@{&tlBpNfnGd&40j;v%3*<~WN!F-!TLdig^0QiQ;=dYYX#c5;qqU26gg7T{phfPswWO7wRi4`gr4i{D=WS~kB zUnSXfb5!EQ{yNq522gv)a1%SQ+)b+!`WBrZWvttgKzC;dc5IVHC2njd(Vr#ASrIEs z6ofwLh~p~9leeLgJmFisHWsMlt?F@(gd$XWBt}mA%_CI0^o;*-ZxW)}sf=@8gZ{5l zBL_h<4zAfi9lt-yu_p!mHNx6B?)QMtWz)_0XQ|w%?4aExTghiopWPbwT?TzI z=a%zlRwbyVv+MP4|LWBwI99yk$=V_5`EV%scmtW=TE@5VJ8dtQoKK~XPv;G^$ z8RWc4Hjl*dQkS|}Pv_%=HxC#$PlVwV5l{c3hoaaocXx!NX%SG`eGYt@{Bm!Nt{LnC z_IheHUdMiU)GOwv)UhAgRP*WcCG1y7e{kUT9_&Zs4F97Li2dr7c|T6x#(r;CKJ?3) zV1LFLiB?-1?C)yNrfzW^2WYNwY1f{`fgcSP;|iv5C~wg6wa5hUzh=~$hV$(ZW7pmF ziT_bo_AJ!tp&jbt8fw68Om(;X7zl%Z_582Hxq4_zyNK0R3Bu6c0v5^bD}-T9YWB~4 z>4f1w*Q9Jj^PBP|&a9l*jU@CBJQ!~hlqQt4mltRlFcCUFrQ5`*Y&OxV{DqD)Fo2); zg$qh_cc5+3UZM;zQ}7;BDhi-6Xa)G?06T1|;^CQYz!dTK2KcexFgut!hyv;yW$*8F zMgbj4yY#;AM*$zb^zOJ*P#|Z!)S-v6DA3m9?T5iJ6eKfUwpN~vg7e@0dOU59!jgEt zy^m`FfAXxo!9}-#wJOt7qrlINa}(E5;z{kbJ%n|XsKlgsq}C36-~;Z6>u;b$73bSJ z3~eY;L&t5m4+~1voAWDAnnQ_J)IB0hoG3BACDkteElONCT`kcOiIVbth7|-Kq7?SB zak1Q=D0MPGRPjG?@LNB`(R@`AXfP)Q^*?hkE#OA2Bg!0-%pF(U1OD@>9h(C;Q09Bv zyXIS;pv>{Qy%CWLD05Efr1P&Cl({kA`B-EN%HosrqPLJx*7b|q+OI~VtXZ+fp8_GA{02kRl_>PS)?98w$V+HH;h{z_x}d zsHYUBN~tT_K8Ug_e5SJ>?yp!C{~C;OBMSG!g^dDfL=mg==1^5b6g9R}hg<)_J=UdM zJ`eE6UmUWXTVX(juX{7JPeNa1a+3LZbu(1P_at=2!5J0Z$&gG$tNbH*Fqpwg%vvil@0pgvEyTsi9l^*JkCHiic0WZBiN zXB2>Us>Vn`z*nLx!KSFVn|S24;y5bq5&y*GZ-$CrpBCE?f^&8M_4q_M-xhz&>Hp*6 z2j}NyG^Yu9=h6{3Y6k8=-A<04y>E_6bv)GA3MNrmr>Vmeg%L!zIQ)>OIt*1A9w*ov z4ub!DYqR3J7T`*_xUv}J7o6`YGbsWtMt;0#hlv-D-`lPOeK7{lzM2l|W8&r4Zt{)O zm}oJ>f189b(M6YeU@03DGd-Jw|43ru=M8Rom8~Ev44n*&b0s4%a9+m;tWZn1e#qpfNOrAoMz?Ep;Z9zDmD`|q4WeCUb z?_5qyki_vq?5l-*%s5^;Y?Nh3I*vc%bC#vF6UV!z^r+TC4#NlDJ1iXnIH7Rp_51J3 zIO&wg>9z?)Of+LC_?4Lj`2d|kOA)((QzHjMZsCB!{l1nj_W?a;f9-*<7iol7O_Fc` z_2s#DCYv~*^uso$je|I#a<2WyO$8i))57dcWN^TUQw-(PD;&ro+;%yr5(ir8Js_fs zI7rMmigdpp2j|J>Q;$E!VM(#WhCTI=cW_$v$ukBZb8Du<|R79)kKDEb`3rzq(@J@J`b>$fp(E(M+>D2)ss@ zJoyI&i!qU0&E-(A_>JR#RZLK@)Q+4rt{D_8bK!;CfFBAz5pZnyzda~eH*cjm=Nk(4 z*edd&AQ%O|*<2LQ2|*!_{KAVTA$OwGZ0PYJ0*X*K;Y}reM9DYwT{?&-fHq2>Vsn5A zVJV}wz}Y7Q;1`{25q;W-_YUN03~_q)Goa+#_6GwVY(>eop)u*Ex8 zFmpF>Mai^hW8>dHqZ9^52HQwil#+9~^gI>rF-E+^S3bm}bYqQF&ZjiU*SPjJN={!<3_GFE+7UkRtlz($Wzrg(+%C~W~ z89oI5Y)+R@*YR5@KTPs`=8h`JO$<)D=b47cyW#FS6zt00C=cfom9 zW{-)2swSMDjqB_h(?Q30S?4L-0(G6?`~`TwDyqC@w|USKJ`c74Kbj6Is(#pU*$eXP zo*b#rr8=OZ#)2IVa2Hj&rvb6`SI|1 zIOkq7%J{r^3egy@_v!gCfWCoG2Wy2uK1W#ao;PQJ?O9WY+i>=X;!kehVaR1+ar{#i zgtJHMD4(B#5ADRBaE~+-oIP98+qr`gXRnT2{XTOalURuhJyLH#zt$IM@VSmjR7-sK z@fMtO`p>ELs?Ru=IjsMq!XnPg6J9r1)xZU>9hdF&ry*}-v^vzn38#%PrJDUF0!@jk zI~{>*ygK%vBacee8UO0RX&)lDSj9cYX;T_kn+fl5+7~Z=EnQcf_IJ7Guy_tm7o%-S zy4s4<9SALEiNA2hwz3077CUj~p>_A&o|ka;BO%rJvt2kh@UEq_u_ENB@CeO^C}BFCixUa$9`f?yI8n#? zt*z-RoM=gxxa-P^6QhmRws6?s#5vXXPDhX7q#XVIzs*~53Ts-{yP6U37jbPIkrROY z8wS}WqdXu_8*M!fc$RqSr!z3K(SX!~gZZ^3cs9atumGvkx={=VAJF#P8}%Iri>EZY zgP%*V-1q(G|7qahGY@9pgu}CAP4ef_Q5@V|X~J~qCJwoim~8j89EX+|>s0Tq#}Vq4 zKO7Y%Am8R-ZaV`5kUP8&^o)t!^OxUd{*R%D+u4D;D3l2rUWF!L{Tz9%u7Fj;zYbmZO=AvPt^=);RwP4$0Y`8ml9 z6Kb?mB_|J@g}k1NycJ*e18<8n?%@Q6d-Qe=0N?$2!g>etfo#lIh9XcXXO!T&0O%83 zZ>@XW6;UX!>EQcUf+$o}&-RXWKMFl2r_*LvjY18h8W@E}P-xo3+vD5+qA&%q|0;fW zp>XxnJc=(Lqez#VLMbUMkUzwgMY_ojl+LZ4Ed&}q>-;kT%xUyd&_pTMlz-jJh1}=s z_aDCGf@h1@Oq#)vqihwq@X)dkrQH7@(s<|vO7V?3^w{4SrI69Wu?$_5vck*1*H0J` zBex`;6+VMfi!RFBtb&i{$|6_z00HW7>_^%~FJQHj=0Xl|{o#MHQc#y4A3nhT3XynR zpG)qVLnOWjbZM3Luz=?*PDf-8HrqvVFe-S&Yr~MHhl)~|!jF$^E?!$S@+=HaFZk+c`K+~vx2da7v6ajM<_1`Y_ zKZiV~#59wH7$E(k#0~JT**l$cQPm%Eu5>Qy0l1Lra<2ih#YB)MtHgX5aPj@xymepzW>(gQ5b|XryrjyI1Kqz-w*#duVaq0_MJ4h;`)fQ%&t|7x%J|#k5R-yM%ZWO zUz!-49>F;Q$2!-Z-o<%Iw+Aic6mhaSQ)r?D15o&q)O7+-xAepH|A3?)Iu{;7-q*P& z>6tM&`C03=_PvW0}9lolB$Tb)(%pZkK79W3^A&nv(@mP2G_H!sZhEF3HAe}I$! zTwrYR+=o-Lwg?A&c!`PqO+IR=_Bh=rUA_M71IYg>^m-}n2yBcqSDge-{#K3q0Xbu` z<$~Oeh=5*E-y2#bfJ3D>6u+@>;7}d= zZ$)9nI5eTA7i%Dm;cAdH%c!2j~vB<|NC>CgMq_yK(;WS>u|oF+q}f84sj9ee%wY=ZE>on`>v*7Gq6335 z@XYL8p54Hhn{OT+L!o;`=-Yjyp)Q{@Za4XZLia^kP}qiuL?&O`TD=8uQ4O{5}-vbn$4F(Eyx_Z%33_ zxdT0Q2jxnEl$1TSR=~~rkRBS z5Sh38^={HM^o6aCI~eQ0{oi%zU)x!M0Vxg6alnq}fA$!nyj9(+{W*`}UhoppF$eO~ z*Uibre78{E<{ew&Q^;B0de8ZXkT=TbY>V-@(v9+uoiNWh4DSO@j1#3{!YKdilT&7I zmk@d3>zMH%1EP%o_0BG1g!$UCH}2jwkW*mnOwN!1`o(>YLcrb)NeeQju-@0S56Z+8 zwmfGo!QGg`$@C_)I|ftsb^7IFO-vEik#CCcz?5Td3bYde(AN=UJQ|UJDfxBzJ)e=;7IpPepT9$>=c2JI7Tlit94weH$5-_cO^fKUZ~ zVvUDYw&{MsI5eL`1G`& zHwzaWmrTWsinySZk40kC9#hhui+Q>w<099;tYzQxA@|Ij>E-l@c*>QFU0pFgn<$<{z&NqiPcd=p;*NgIiHaaHpG+Z5|a$u4$aa+n4 zO-xcaKv~*0j7b;i$ExpaVp0UldG=IyoU`TAqn9$>ILCKe@b_pR@RbtTIN~6P^DoB* zXfYp!d_?z^o%c@xV>fHq9sp~_HNqWmiV35V8vJ}ICONdnr-pHg>AM`<>WEXWp3rvK ztBg}Dz6YP<_<~dH&avI%%fcxh-)qHG*>OsafE53K6F6n@?cKPw&zKk@5%8t%5Kbkp z&B}gzj?=$oeK2;u3-uRWUA+ArXne0aL=@=p&SN4T*zUd0{V>#Jv*U+ObmP!nK3yh3 zrBI(criZ7zaVWZ>Qin}VT4ap z3|&;Q#HQs4ksbq+9>Qo^3`uRa6$MMOS()z|2TCmzRD)h2X`J<2Aq-gJ)%f<>|50?_ zaXEKk7;hLYMN5OEl29Q^rJhr12n~wT63VEwG^8}OXld`g2T~b{Bce!2Dx-lY3N0l< z-s}DA`?=0_eqNt9&*?n(?;eO}nC&UdT2De{Dht<5+$EtKOyXh%k#W2!-Al!9f`qD0 ztVvMbPeP4a+f9sBNT~lx2aSc1B(%F~pu>WTgt=T>V2b-#cN$jhX(#B;mNR$x@#Pl8~q?yfRmkB#cMDe9N_yBo-f)`64(#lKEmCR#_O4 z)Q`^;`Z&hX2mfb^v~4Ed|4F$VYb^mi%$!y6o^X(-?9J_Lg71Gr*S8?=aj3|0wZ|ut zHfpu2%$bFxeb0#Kyl6|(7nb+D-E)|vuWK1~yqQAMJ*BNHb|sMv4kfEXZ7q_y>G0;u zDw@dKWanE}_k-k}uUl?<5^?EwsqIl?iD37eWoBt4`@N2+S4b-IHCEbqVt#M-hsV+h zNCsC=n+sNzqR->ifu#aTVJx;q_bOUi1=bS7FGm^7wnP_lfKgqc&wfE#z%)erM zvwXJ%?-RM=B(BM;k^I67=1CH`=XO;1JQjOLORuEQz7#$WwnZe0=+n}x>#CpX%Y%Kd z)hu??(rbiKF}j$R*8cOb5nV=0>%C3wR_~&v4^7^mJULEFdpSw=pDJ3mh+V_h^${(z zd}u#$qK}p@HgifCNum`NWfx`mH`1zqYeMvNk>8hldF^qNbXrn(NBf415%}p^r{Yb_ zA5~=AQ@sIfwbuG2LQ8H;)3qF4w4{DV#WIV1wB&A=dQ5^nEopupc}nskEqUGCH=DVJ zmdvwr6tjBJQa!#ceHOm7w3}^*&=mTnPPukJzu`tJ*QfTEhDFn>yCl0`yGzjGg=_tO z1sa3;h_DKQ;gZV^d=-evQ8=KpB%S0AMdnLMn)OYKs4KLPgNU%sCegwgorzDznzWex^$M@` zlC-quG`o3FJI-IOv@>y^z)jz~j1U*$J*~9okTf{GP)b>X=I~8*^+a!`IRf8g3#CSB zj&R>OcSX$SSzRmDDSL% zN!B9@o{s($_pq;RCf8_^eR^BN32mC>a?f#twT^9U~9rKFqAG6}T9er+;@e6T`(dVnuQa6De zwXwTAz-P@{bX>u&>|0|6zIh-ydHpWqOJb{;;;s9PZ);_anSK7k_#7Uf z5@_{@F}3w_?X1l!#;2SIKLRR$GCp$JmxU_*X1q~)*U~PI_k%TJ9^S*7LDic+XNy2* z)z-6@!A^6Oym%x=~eG=SSGAz(QN$}7K z(QKt*5+XRnp8%BmghetNQ&v9$dt1yNXq`=nXw2l8&NPu? zN0NJyIoa~V6fJKqS|BX21?+!R6RXZgyD zRxl!xboVRJ%8NR4LRWq16>-6j6SG6~+UgtTR})TPeskKJ$JhG62flx`%xI|tj}`lA z{C;rA?_FITM@tlX)=;Z!M#rfRdVxJgBi}^*Wz8>hI#S+Il zds=*OKF9(nvN>UBjr2e=m~;C`%r zx~2;8k}`A7Pb3D6IRAVx?#IYQ-js{DOL^X!aaJjsU&(jzUjH!e&oinYBqC^jZJzlp zAp@FEn`5NoBx!z+V%_B4r?g-J^VqH$_5bhB>Z*zsw2-GjJd-Dy7J1Z19+=pM`|~9Y z60-sE3uEHxEd-w7-#ob*yjOMfgdxrBF=!9VtUz4D?r%YH7R`Je`(Q!TB+cx9cjFdg zmSzqgeck4fNi%09#Qd5XXqM2~l(QR{XqIKoHqG(-G;2uKc%vHPW(75=R!CCO?NB#8*h&#LNT)ifk;=O-XShx>O zQ0e8m(+ZzduPDB6LlbsOHoMsVp$SJgCq$Rv&xuifY$L^>38R{4B=@hRiTRmnm5V;m zWF7(Lx<|o?KTE#-p(lcQ?(6Kg8ias4HCMbmK%YJ7;!nZ;Or1hUyf-Z5$>Fi3!KL!f z(Z}A<;0pBv7E$|XaP>av*Nt~*@SWBN?t4zt;Fmw_Ld+Ft2zx`=c#swiIZ_<>(sQ1k zUw@MAYT7v(nyunD^W23-TncR~h@^}$(|@U~=*4Es|O*dl(AGis0o4kjF_s|zJT z{BO&K`{ut z8)DBPNn%-YnuTi3k?(A69q~|}#4he^knt!avE0{ewyoSiVppiRbqHJ~u}Zh{54_t+ zVx1l-d>ed8Vqc5g_It)p;>@g~gkC&A{@u&SmUv+j-}5#?KO%=DOEv938f`!;_pJ%L z_;(Dnld4$G2KMM2c#%UZO=`st%ox$i{SNb6xhiO-`HQEPUp#2#p)41Zad(KJis$$*EC#wbImV zMzx97q~=N8Zo7(eSZ8HZOAP3BKHR+l0C(h^5m`$k9DY>4-q4_5RZ1&1JXoCAPf6KRNtly|u-ZGp+OKx_Zs{Exw zOKwYQ4tEyO5?XU+>RUT4X}P{lLlS(G-MQ6u74FZq72nuy($bxqL~eH|)6yQ7SKqBB z@%x17$+7ocv~t6q?}jVcaDP5=kvVr1ag310v$Lnc67qyU8T>TS(6ktF4f|`VS%_!c zweh;k+eZuU?Rl)w*+L7O#EOOQ>(Ij1^dC>0+-TvO>{FlKS<}LwlhLc*pznp!#trco zV`)*9$!1oca$20Re*W~uho}!3s^(gfi1^0DhFrvl^Y~l65AQt-ewL9qggCRn3it88 zRba5l#@qK0ciz33YxWP#TmI$|V|X*o6PbvAD*2G+t!7D%vaqCia+-{WO2nyknmuRl zy`y90ECoL4xXZh8M|Bw8tuXy#|(X`%Uja_ZpV0>2G zIZ<#hx@pZ1ycaz8-S({*P3y0=v|<}W-+lhAC;30qw2x1oh)3+8X=6O&;&)U8?OjOQZ-*ce#_N$B>~J3%ZY(k#96pmNzEkpBvr}zGSH~VZ-}D+jovzYml#D zvV(V)0lMjEEiVU4X7Q#5c^kaDbtaLA!TT}atWO^K8(|rSUt*EJQ7;xHgnrB`=ik3m zK>o-2_%)e)*~s4*Z%)wHq?f$b&+fifO)vFD$m)3$8ebe9`t^A}O;mPT$aSiKrkIr| zhe%_tQZ`?+_`_mQp;G$gInd$HPK8?VmDf@wz)5AFobB`uApP zPiN6^{*ao*3nm$p=7lm!+)QA4mKyz^VSkqM{7dXHp^MgaUFHf2=c5uD>U$1vR z|K=`ZGQP+2@zF%a)Zu4$_nSRtO#IRGb14d9Os(+UyJon7@%8sYj*N?!851f8j^wBH zFvgTu*zCeReZ*3IDC-aEQ;NPUSmDM?{EIhqudWpV^JW6~-68%Z;qfl+wZy;7pi$X) zIq|RTp717j3;5sTUeGHKTNAkFScbZPY0j%KImbhRr_}j#pdpzRR`1; zL@v&!Rp!F;g)dvshvZqvaUBNcILaSL>;m07Hn7a#T#Q}ZFuQ0yt$KWBr_<>;dRZ<1 zQos{+dPPEQL%?fYde!s0&G-G>^qTtmbB5g-w61x%=oK#?oX6PSTg* z*{~^!4cb&Tr+b$<&gT#QrkW$P^57o*&2mw+(w0|r7t;rv&oTZ>f^fb^cq&gcxYNqJ zQm=OR#Lz04D9+nW%W*#IY19U-#`zp(w>5g6R-azsa*?s^}AQH*rfN&c*jEuBPm`Xa6!8 z=|21x_vh)J7f*4IzQ8OgD&0ye^=mDJ7ZuW~W~r522L|cYLk0&eS}`E{wC#unT^ zZ|KF1PJtsmHI5%>X|>MZrQx`@R{vVXYrYWQlP!Jzp7}{juZw1=1hLT4+p(Lko&QHm zAGz$dHG4rz`}i&WlC5ajVhs<8XL+>D+UR*xLn19_W0GxtC_pPL`(j!fuhYv+;;TP? zb)(gJqM5;NxW952$F;|zUk`U@`K&SG4m^@v**~9x)NoVI8Ctw_`ou;#)CuxgWQC@s z&|)DmC7$2zh%e;bHTqaVi??RY+0hHpFX=lnluS zWzh1g-UmaLqF;+{c}&=~D7*(eW%Sni02tpeHkb+ad`~{~5$^>pqX*Wo(fp~y{qaN3 zY5ugMu+@My&Hs5ue~g2R7BEF*3_1nTf~9Z#&P@HF1)Ih7R|q&D?!Yv>rNo35j9FM! zoEo8pqr9vYBlvp`+PaFk@8R~m_ zY4$+;W>L(I$bSDZw*Rd)&Hj9D)t_WdnmvbDit)3L-yUWtR=|bNO@*F(SrO9&w17zvdE)5P^oRQ4-9qKa5)@&lToyV zg{Bw;Dod@{h5Wkau0vAqY0BPxohrP(H08jF(m`(-nqnIkBE^0L`E?Do^=7C)%={~y z_;`}0d{I1Tj5@#6h}nD7?taLx>l+^t-i!P?HQT)(#A$BCmnf|pUNmN+sWmWjkj6|d zaF|nP0nZ#ZQ3IzAwtMwU)0pYyckev4p)s@3Zzb!TXw1CJ7JIfx8q3A06!v#9jg?NS zTKUSG##&hw9oH11u`L(Ug+#@W|Ge*)`@L~`NqW6#LYe@Lf7Y+CdOiB>iTxR{Nj0bb zf$y)@mUUA9Ac^?f+q=Nj?$nev>L2WXd&FQX^*^r@UeW%D`iDPb4GQ~6{bOFM4ISa5 z{+Yo(JhRw$BSFSUMuhrLB+0eh+)4wieS98PFQS1f?+nDRh@gQ#UWfS>>_C1VTVx78 z7h&uYEPOxLF{YF83jQ+_sN6Cp^FKGN;5qX@x$Wh}!KCL|{K5b0D|YIt{}|J;jyByx z;7Jvab&ckX=^9?Q_>l<4^b@V&J2f(lA6s14M=395%sSfMdvN^)%h`4s-0KJ++-TsG2RX}ige{>lv^A0CWBFNu-*m5V>; z$al`cEq(P`p#6r`2W{CQ(qn2NGd-FU+c}$0CmnZw5Owg z(5o+XI_+SY`-$$;1o!NqEQfYdnUs7%7kO-z4NRI%A|V zadyAb%Np#L)JwXdjsLDka=Baw{(L@e$r)QxIrvF$CL#d)ZEgqbLEqSx;NJ~gcgLX}W?Q6&$>oupP+z$;@RWh(*co!=^Vgoek2auBRN{lB zGx5+jv+Fp;@bkDl!J#jTePJhUV%VU4(>i}Hgx^^oa-s-2Nqa08bql&jnxxfC$mOP^ zmsPVrLT_^TXfcESImOb|S)QQRMH|ll_vxpE?k*sg&mOc7t3V#_mzaZ#yF#F4{749X zzGpQiJ}mbj71;~IShR0|vLS4jjYuW4blj-638`e7+xKO$E%J#)##=+ONyXw*lCI`V zq(auNq0+tpTKf&(+Y&q{bUxH41oK$cmKoh8cz&tdXwhrvW#6BU{=z=<`TL?>&}&&@ zOf%3=#N6y|z(X)lx=7cXRJi?}Yfn~zzRJ9=dLE2Wh?BwoDJQb|!%9+l_O;T5@AKdl zC+VL*v7Ra1_w6Kf(_Zr*sDE4Sxm!@-0jaXNShUXweXv&R98(n^A(bBYn-)vq-<3zQ zTEKBLtXrFxuEWopa4cW+0{?D2Dg$@uJSA0(zJ+NUP*=zJ&TaG$eZ$*ahcb5cf{Cwe zdLEH-#%mk7Ud-ENT&*x~u|pnV!{ag2lcbD^Aug-7o0O>t1l!(fffjx+A>f4Pf(QOC zeNM`Gg=N_qd-2@E1rPRdlJaF!uhrZM_HCHrmccsjB9{Dg^nZHrNuKA30V!|dh_$-u zg}m{7ZMkc;Nx4%Wa}xOr-gN6_KaPDr2d*zUOe!>aM}8k%iM;S{s?UAY;XhHiDTV$m znoPXMPRf%?U#%xx-z!Ol&#oUm+W4IK3j8eQ=pp5i7mwE38i7ZSGp**sy6oYD0h**D zdKd5a>(*HJ8nV!+hF)ddeRDUswff@?6H?;3CWePS57gOldSHN*u8_MOv}rNO_FlvH z7xIJHmV3S2Ns2>*@BIrwzW?X8A9}fh&_|+^SF7SV#S@Jl8l@E|iO)tapRCb|vm zjP)T8;oH~SDD{)Flf69Ut5m>Sb$o(K@CPNf$oWG*IbxH3la!k$_6z!tkTOyEwtKtN zp&jeZDkVwjrr@UA_pCwdCf73$u^zblhCmo8bCBt;GcCrtt9J5=OVG@36)&lS0yduR zm~#;`G-J(llN81>YkN2uk)mAN?(qp*P-Eq7@w3PSFwVQ3XGIF~=TfWJPoY2j_J>T* z8=wc8+V^5EK+N~d&)3hBB5_?7r{Jx4&e*3r;uQ4S`A2qM*!T4^y?YXR8&ewcGKvi! z{CR1=85|I_TBkz_?`n1LPq;~nPK&K!mwOMg`X;!d9@y|Xds_2$%=?Jnm+enLPserD z$?%tU7#dDOhYWmNK8k$WH~s6ZP%ms4V(@9DG<4nXgHcPd&ob0iLmX87a{Uv29*r$d znjV^@xWB1!E^r>}yOk3XnxXTie{OmW;(}@ZjpV7d-Wn(@1qc1^Rn(LGZqWt%F87oC zuKAkS-lcf&civL3sGH=TR4zNc5c5Y&#}sn>wnDEyS-n6W&%G2iDper)OOJhF)@#J` zT)mUpKcEc`%fH!+eRAya3k9Jqq=lBTll(v0fBSe*m-5HrT-qO3@Uf*Mx6$=k{X!96HLS+JaiZOLva+jKB}tf9JzS=&VU0S=0eO;GRvMT}}$b z2g3E_bCFLs)~nM)NxseYDf+%06klbpYk~Fo5$9vb*Z$7OEd2k^*+!n7H<6zdOie$D zl|GJj)}by*Ht{`SYv>FVv{NN3!wL^ zS)Vf`*^;MUFK06YlNw{v7veqd$ndy|Hpz5N8P$~?0X-f)Zs>%6zHQ%gxbP})gbc#YN#x-WVCt3eS5A`l{1RKT% zJXT_T2g?(VeW|~iTHAU+EuA|j-jG_KoTE45NBGGjX4i5yDFJnp&wNEHsHOu=k(fVUj<3B z#uLGzv!Zxz|DpiQQ%Ke*->BoHkA2Tqe%>|@T`wtc8gl_+FQmoFy#NdLKlpVA?{9Wn z{I35>5;a|WWGfOtGf80*0zY}SETM&@IzG7T;#de4nXEk*3;*b!{F#f;wGpizX(S_6 zS&3|SMW3Tp-@|_lKrhL7cUqAoKRfO}O}HP$6YcwU;|z4*x5HF00Ce*9>{ zUi6RmY!u$|&NTH7#hT6eG1>(yA5{9a*(i1 zmX|*2w`1N#bEX;3D`?fayuFL@T!6_8lNO1t>yLWzq65z*h#N<-Ltj&QZ7Yj?yCv_p zIYKvoIFL3^B0~=C8y)%!o@>;!U`O2cYfBU3G6^3_FYcN<3i`6jKU@#r`GTPM0us08 z()yqX0nqORw>E`;p_}<_Gj!Nvy+|Ej z8dDpLZB)pSGkE}rA$ ze}(zp=OVPG$5vm(b8(+feD8%8oGbpqi+!h==yhjk+1V#yM~LhF#s05&%E1*fwKp3P zZz*9Od^As-AB$h9$oNT|TW0j?9WCK6d-2Fli3C)P8t!RZ1k#T3-6hz^@w$7(9y&K z>j5kxZ=^~1;u*ezlP*|aRK3{7jygSUWld4^17{=N=*SbNVGW0^9sfYSZ_!Se^Y}vA zXl?`coqxB#&7~W2Urem(7AQm4bc?rb#&hp=mGA6l{P@ZB!(KuN&#m9^UaSS0XQk11 zQ|x;p;4Kyc&CUMiLJxHgS`u;J;X0_Y=;XFWd=G1#uAf*$o&6pzwRCU*(-P&c#4Co~0*2>13s6n((je(+ z=ih`g3DCAIou55u*h&cj-E|hA)(^q`k(h_Dxl(YC>Y6u%s^9LI!+qH;-8VcL)UmYvf_msh zUiWOaJOXn#`94^Y@)lG3wUNc7A}cv4M0x;p4vE~l8v8BJj;S2Mz6(RQaBr{ZOP6|) zk9%&P>mq$i^efE@4i1wGfDRRi3D`ucMq(^ZFOvXm8V2U{$rbI;JsxZV=mY!Q;@HD} z=zSCCDJ!{r=0&&o|NSUNye^h4ybhf|s&W?nO|_lG{ElMo)|uOfDm!d&e_Y|7_yYG) zCkp8p=^Gh@p_N(}z?$VKqG5#kQ+HuP8M*?VYx`z+C zV`!D-p$k#hmAACtXXOki?q)vOjJ#K_J8XBkNKV$EXHi%M*f?xG6b)af?AJmhwOWlu6ly zxpu)d{D0P6w;~t9rGK%8d4TLE>X-Pz7rFm&hX;vg9eH)okOl0C6Ds)%Uue_7`KZKG!xO_zq8)yx!1&NXn!8Y%Q1=7LR$*;nIAzOJakd%btAA zx<_Nuu4p8E8UP1Y&@Jict7W`q(d`v9VnK?NgsC;?&bQHJ8~jI?%cC1;*ss`wJ4(wy zCsE@48$M#1@1H=QtJjR%N8>{y`Lz$)g9X1U4isY!ODxZp@UJwUIbzC84nFg#>PUAx z_{rh3uNKkhLSFGjPxsL1g5j2JH>ctI?wv5|h5qBQN-LL?ZF^&?RVqcw)!RaA4aUI2 z=L*dWNa_4n_vME?N$J0(9h%p6kkYG{{{CTRA!Sd~Zsv1{fu2n}Vv4Z;)`rs;e6W8$ zPd1_t-&2KqSqBnG`O@!U3H>+^o`&Cbe|i|}i>|iz1y*j} z?NvBOT5g|`i>d)jg3C%5fG5)KXZn(2i9W9Q92@YVo1g6-tXF$~Nw_ujWLEf`q-`HbSiT_^?9#1Q6oaoC z$ZXO}vVQT-ES^vySwDXntNqo3Kk)VQRWqzFlF0YEN8kXi9NX~2TVW(Wmo-J`1gD@*egilw(X`f$v?pL{CCWw;S;BjXOqwhwXeM!iRZ48 zM$w5Z@TOcXcPjG7oY-#+DiQZ~XT^mf8$e6F$a6LDugo6*mq9|BvYk}B&Vf;WEqm_5 zx4Wws=mMSO5fqn2-LLh_zunmlPRLv+5<-5(s*$m$XQ}%YH*HLw0&RA+mH5IRuBiPn z%lPWUGcWD)8CD@iTXus-^R_gp!RKD8%*>!c9xj*PWKM#X*FAfFz<2N6`nw6*{#vQZcbcerIA2`y z3FvF~@th#y_Ij)X5AMxhu7&5dlUl;zmH;qyp(D9DHS=#%68>3oIs2-w`VS{t8h zk*a}>XV|gtooP*0A}ML_^L0_k0_!(BPgY^y%hF-R574a#TzJ=z@=)tIr||!|HD;b7 zPU&?^(=c-iec(548Lvd&F0ZJQd&^1!~X^`z%wq;OBQ66l{YI zsPpqI!te2z_G?YkVA)yyL2gpmFjQKu5kra%>Xd>daDOn!5H(wS4}PYUzey10=oyA7 zBcHGM%jV1h;cf6sWxf_ELu)L%h=|_#SpmO<+1n0rA6FfLj*@Gj-0+8^h%33g=WNFJn<7^ge~X26Bu~CETtl`8>>_LQOx6Q?>nHku~n#5kW0Md_N-dH;M{KAv3%4wF$ahW_>;Ie8nfaFGg!-e zugVzy^s6;Olq9{MYSVgp6#SsC_|g{stq$kgrO;nE)%Lz8-r8DwEbF*I<0GO?#i$1` zc)Kk>jd&V#_K2}?fcH<_9dm@QZ??VR4GH5k6`asG4QdCf*}Q@OB**#8cIZ93lZ}d~ z=eD&aCxbSD%3_`+xyYNfHoBVQM?E*6e>q&p2YT4@h5v)Uad15G1miPT*cR7&tH8Jt zA4OI8ei?rS*`Y6<^7t)Bqdx{;Um9>0%#vujwHkHJbAt+RIcQYLL7_Xu8B}*%F?1Dv z>{o|O0~&JUwdUP7lVJ0nU+7O8RkB<28*eOhhn|(~JWWn#n`N7;2gMtWO4*QyVZQWs zlrc?;G&^*keLu*^)1NPe&)+Az_b|QmH?l5un1Wso(@%cE-^~=ZfC)NqsqU*jn(4U2 zn)?9ecsXtg-g6G`A$tv0Y!LoTGuGspufO&aJhwepT?@Y0c-6`4G}S(_;zT&+)YyBe zf706rKURO}%u47`kCIOgH0w8G<4{T#=$QYKt%Bz4&|dcXF{K$vafZwsMWFpP>41mu zO-F2u*U)s=mz67<#=t9?in_+|eVO=>*Oc!1pm1Gi4$VE5{^a9rVelGf!ku-P4|gv2 zu6r)c3F-QDZ94&rl7{bYf?w>YrnZ`99rhVcn5&R9b4p|n_Jx{Gy*Ge%o@|`Q_nLh_ zS_{kXKnI^riNf~}t^!5*b#34+tKXqABu_wD`PZxt>cv_f|I+;m*6iG7s|x?JKL1N! zQt*t0!>Q&qDQF+bt@qA`f0tdzBmsJ+J0a;d$w?2X@L+g?g$(D0q;(j@= zw0#98!ImpqGta|Mn4U~9A$ffQ1-C~>K~|w{^}X;rd|tlZ4$Wo#t8=>lZRXe@+n8 z2&HisZ>V&~wt@F=X#M6zoq)NV`Y#6>$8EYdb_~Dwxpy-7+L_@u{ER}KY#39n?aYBT zFz#W~`>*f~^_~wnL#HNKudt?RO2ZF#4`W`H(jUIP&To-dtM!T6e4?q6f?aJx=!YQ5 zbaeEv5&TIf!}27WxVg*OczzZ5Kz8*8C-|J1R+9g(x3;P9KcYElYhJ5PyaRPl)@FGk z53TXdzwn(jTP!_a@Oue(=BBEc5qzc9-p%W2#OAGRNmK)M@;QB9v&yeq@ zbupHKe98P5x^u4o(!uqm&HYXAS2CwIpP~8O>MbpWQ=k-Mt>`#><>#5sSD-hudcSic zdHZ&_h5O_8eCN&bwd=dU%meBhKat#Hb^J>0UEotQc13rR-6#4|{sTVWs?YW7_5OkN z=Y?{_vA;Y}LCzZc?$zb8pq~J@eDcRjt3d${F^bQj>cioY)3MO2JAz8(NRczsgr0i< zDLVDe*j7m!eFpEYztQ#?b76GayOn=Hr;)C|n@I7iv}u7c6YQJFHR(DG?Y&xFs2+Yr zovwW}bi{>x)-aOkw0oiQ3d|RFa+Zt8;zi%c#f$C5&XVj^{oB?($OUij3L5Z$Zl$e4yssO8*V$ua+>kXx%-M zx<Sop`vH%V6qI{u!bwV6#n+aS9WdCDr&b+S(E6|M~oLX zf#ACeu@+YJBf6>OVBkRFmgRgp%i{_rbOk3#!++uNi%*LrZjD)J5q}NzyWjPv9)4Q? z{Jve#p?1rg>xie`pZx_lM~UZ7u7_9sWYD)m?$&tFDDl>mmi%yX02JbyGp~ieAi7*6 zf`qY|s6E{M1>8}{7i|WAm5}p$edyh;PENVhdz1eAo2RNkbCv`&01jWAd#b4JKJ`|3 z!c#us3EuvGEBz&WvX<*JiTWKL%NA3@&t_9&=Mn&VAI&b4aY>uSH)g zZn>pKjqjn?9eA_-I8A>WTr+jO15DO>{%SMoqnMmHWIJj4;d6XvYQ@15wU{Sq#^1p^@Oh`99y_@|lE9uGl_RBj2ZLB8pUyB=TACqd5p&NDUSS(RTOMMe}-3q**zkze4W;p2f*H zZ|3$%xvz?VK4hxE98QbejxF@(3r2mo?6P2yJG{iFxsSsrKK5EKI&Mp9R6tw zha2p)puNlOSG6bDz#(*GH+)^rZ7So?Eev+{ceKcT)AdH}8F263<))ZVXUKbLTsR)} z&0eQ3{ILTM9Jtr}2filj*F96TVDjOnge@1q;$H{j9pN9dU-NYn^mYCpN9Jhpd9inP zOsyc{cjnK+oZZ^jF_+KNqU_0I>mRQJJE|lf@WPj$JIPT?i*N|^jTnM?+oE4Oz<ie&0qu2H`(Msh-?`{M-?z=z=*he}CW_c0OgreyFU$3V6g`gQNwcq z!nLec-@I3o4C%M(+Dwwz->+c%Hw*jD#8+%az5S8ZVqO29kgUVAN1w?az`jWXq1*Xb z=hECKh`xa45B$}YrofWI+&?DxzSKMSj(-GEyIVKakQ98&TQQT3dU*4? zOD@6%(82Gv3=Y9>{mgej8~W0G;=N3gsP?V@uEaKysJ=MyMZ;nA%e72f>z#@@=U0FK z?fwgT$QK*XaA4dfbE|-Hi8q7Yj32o&SIRh!>NgBe@W`hLxk? z8K{+##$txPl3Ja)U9BXl>bLT}4j%Ar)VkS~@VB(>eH%~WnXF$ecAE!xMYB3Aga7S_ z=h0+nQ-x4xHsb!!tfbhg40K4**~O1OZ2GQmgPn-yj;)hziMv3l;D@0N@DH!@d|^Xy zlQwsk69U7I*){xzFI%r4%?cfR$kCIXdTy06+1yhBZhaQhdxeGy&rU`t2~khw4dssM z383gkzFh>q>?PZSa*Ve;iK9vNN5HC!!n%9lOFB{alhAppF9XeJ+>$f?e*;Cp^GPgx zs5`V^ifzo@jK2M!$3|k%$NxgV%Xy<#`2Laq9)F~v|7Nz-en)?#e?v(=x%=UN*r+sa z1O3e|MSqH>+pZdmZe|0w@(-xYAb)Wn@v`$ZoDWRH!>g2N`oOmXKTbb|zn=LzQvgls zJF?bsS_|Bl)9613e^zWvALmG)#nI$j*)%V5em{#V&Wj6Nf2Thepe}TepX3MJ`!AR; zypw|8-xu_)P3(~$eqmvmZ{<~*v#x$Um&{u*?^e0EKGuz^Bm8}!t0sG;5^3QhB$;xj zfHihY5AH-ARpi@nE@fKid@n*)?FCq=GunmE<)bp^<2Cpk^Cta_+?@%Y57~0=JN)a% zIU_KKf;U=yz^;WBPuSSb6nlW)6QzRpQFjp2CD$WOiwzV{IHN|Y*g(`U?&%-+jxy~7 z8MMg7ZR?Ix1E9sCEv=j3%UA~7#vET4`>gGm;j~mU__4eP>W4M+#+RJCg8bZKvqx;j zw8Uk>-}?sdXo>TX-ltYp`0-XNe;Lu@FJhYPexV@qLAgD7@Mk2tx!j<6+C=RVXz9kr z3%hO{0EaJ%9mTv4k@-7{YIC%tG0K~vR}UUf61@}zzl)M65_Q2+ez@btvaSz4y-I`r+EAT1R&%^7kS0yj1_Oz6Qk zdUU!=9Cc-z|8g!o4)WAShLyqBQrIh(3@!fZi7p#S3O-OF#otL%$L%}MePIVRb}2O; zAo1aTi?tBXh!0PmRDCRjxdm^9P4-%n1UI(B<9bRY!F7!1<>o%@H{rH8uo3$r{TRt7 zNV00%tAEX9VAYon842wBt^7gl0`#51T&%_K63Mgos~ymgz`VFb zrVyi5(1%;(Buq z-xiM?LZ9#qpY3$mp55)$Os zK76_64p=|gdvG59dcC}+Dd?uJI*SIVdtFRm^5W}YUZ7cBJL<^pEqACr!c|t0*jDiO?B>Yr^ZYR-w5Lwdtf_~|DtfcfD`etKa!ZL zV}Dk#C1JgN<&Aj!{uiIqpIF63%gEnd3*D7ynTBXfbk+#!thQd#3b;c{KS`R0Dx*&I z(}JY2$I0-yBK0Gd(o(rIir!ozpq2c=yF&2!W>uM0pdB`Uwil-5j;{+#cc5<9@$c62 z_}*0Ba@J3n_a-fSdWZRsX&RWu{Ze@!{4Y+)=Tm6eiAS&b)WpFee?_l@@GIC(KJtXV zzM=5oc3K`OEcfdS>V6}&Hf%GnrWHQ=zE$5`X}P(->+&3KaKC|k>Q4A_m8nNiCwB6d zmuB@VFy32vQX2lrfdbKT=%OEY_WIL`MZ?<%{l;j;V(!p)4bZYW(iYuYX*nZ2=gfuG zpv{-!bC`#_XwLS1=5<=WEMRoK;WzML^5uGC_@{MZLr`C_%;}!f`D_yP$>x1S=Q9$| za=l6Ao(`B1(D!_Xgh@*8uxzvd_14_Hau0J_Jnb{$(C<#JVCCx#Nnr4Vju8*`mq~Ey zuf#s3+6&5fe^JJwF;cjiM3?pq-EWS@zJ$d*>U*KTCLBpH>Dm7oGlCxWOTJG3i@8bLR@Prq{18Cg2}!U(ebxsB8I^-fyq;z>Jlp zCYJEqJejIe89fn?9y?9sfm6~$SNh-=`LzmkLie3nXH00M=ZE@)RgE;#i$y6qBo*&R z4m_GJK8yDuGpY(VY`~XUXBm^&H}x}aZxs#lx^*|Tb_rN?uR<^b{;*?@?^%ND@S;y;JJWTJIGUXL)}EsUanRJ}WQoq3@Pk_;t_dQpDe&^q@8=*( zq|{&?{1@kv+ipQ~ZSow~qS-5)!imKSFvctDQ3(3CMgC3;drEUsmW)N5)1o=a-wsN3 z-h+S6e|Rb4k%|w$TT2yyWsTcR55xak&{N6`edEn8wP2e6YhkIHVjw8G{uQST`W&h6 zTP~DJ3mS)HPLI@s9TtMOn&2-zc|ja?c5ih5uxapuTU`S0c*B3wsI&JTw0d2We-ka< zv#4ar=?qZ(ezKt;`hr~H=2~7)i^n@s9Qbd7Hx@m7iT)gW_-dcOdrga+FZRw@o&`NB zJ&KmWfADPik6qA#+KNoNv~*ZMZVmddl@6aUNgQuL{d{>;lBOZfkyjqgEmGjEnZM&~ z@XaUtolI$|?7TqS*%)we$!izX*^|eLM|zW?CzjRDEJYu@Qf;Pl_rca8m%}?yUn+ah z{Sf*AJP_bpdVpemvigH~33zMz#&|F-=QkT{;l<~gUuo*;g=p+!J>qk_23pVIiJ=9p znEd(OjjfSZOo`uTdnJr|tVqtnt(beAb<6JKN*(ah@hs+T@VVYJOq`+>8iyn{XIOzM z?z8T@;1?a!h-EwHDs}u&IzSiSOW2Lhkt+Kgn81_(%R{HKQKHrrL%5*PV zg*sc0+H>a-$|QSf^*j~ul2B^EQ(D=e z;c6wZlvXm!s+IY7(n_X(e^dPK!1rC{xHOnn^mAW0zOaf`^nG+v^~%6L!Ik3YnxTLB z8sC*7es9f>*BnM)03w6Io~|{B62?%<>&IL7W-EISjN`@o$s4>^E`=3 z=JH#_wwuHx^(Pg6%OeS&wI}+Iea8IQjcpv?7tgiHd4tR6Y?-g}U@~;s(+y$2Jt9JII{*hY~H;s=%cev*ExPXP->^v-B zV(`b$GK|iW9fww2F9OeP)MAmwdVPM^)J6p+>XW>8EvM#QR2E_eb@cY~_*yiA-y$F8D2{Tha=)oJ;ZGYf> z=u!7G-G$_xaAkGsdp7v4+5A5U-kUn?WLduj+<)$P z%zgOlV|O`tLmwKf?K?{|q|_tazbpU`S2WZLqA#z>_-l z^ySZDXsTVzxurJRpey_JR0`jbdu}KfI$+09U-XGoIsRv58SW=4{`X%!G^Y9EBH!C2 zN@+f)YUxf>^rz&M3W%Xh@J}D|-FBGf%8oo$@Kgc2zcEK`hQBf4OXNKC+rD(BI$C&f zX#4Y~=d>`2Df-KjS@d_)sSNAGd^=Z_5%!K7;3{=)y&>$I`Z#dXjux~nQmL~4BvZ3UVaGus{=ntHYf>od?Ul=I>&GiX^kCNzEv2kdH$~j{X&}K znZlzqaG%iSoL3eEC45V7eukg-iqk)UmK`4^rXA?#alGk68A~txtvg=e-$B{&?o0k7 zI43gS4F9lSfX_Y4N7sOMoEJ-@3Y?bX9QnMf#o`8d&u?pQ8upD1)wnyLeteL*=~z72 zu+Qid&X38iqy8B((9hO$tYxN^gZE2hI#FLeICg4R*iu?$>dAa`W|~%h*u>>5Jqj++ z-6@IwAcLi8@%C z0k(hn?l}p6%~6{{#(yMTcRbhM_qUSJGNMotS~P?tIiW=&5h~e~GNSBFl)d-fo437P zBZ^Q)GKvzFSxAY>?|i<$zn+ihJ=gpF_IkhXx#ymH2J*=|!Jv!MZ6;0Gg|!Y~nkD>A zVu}Zm+VxhyEHRChyvrcEig<^sbl)!GG$_S#eFqCM9rv%}6=OxzWhhzSfb%&j6|^Zh z?`qTgd`9U`;qZg|^d_V`k8sHwJ->(ZZ1hcHnQ;7V^|=V_Z|7%}^BPhS#f^D`L*OYD z91NN&#(vV-JiY?+$ag-!M2QCP6>Uc@vV!xJHm=;=h5WSm`h_u+3)z`o;YY4GwAs@X z<0*e+#$WIxUPbKhe9`0W{|QP0gII|7?uodP_x*@1xi$QuDBmCxcHk;;Hnv;KH#&f* z_(4gpwUSV(hub92mLUe-vMfs>5pKIQq-{1}JeB0uo4K11_w2cL z>jTQ&%HOQ!VSJV4E9FW)#0$nRnKe-^6s7L5j9iOrvt9#vWDqL1^apR#M`Bfl25 zdV-TAxj&E#@#IEKN@T};oG9`m-p1^1V;rlO*V5Y#EO? zMRZhN8+1mwduG)zGxFf07Lt!hYLETdsUfW2(i0IWiGGZ98L9~Hv!6&>Qd|7g!Pkhn zt+HPwQU2t9D0Jez%Ti~g)egjA>0oD9lvfq+*hG)~%Z4!94w8{@Jt{K#E253+&AaH| z_$;KgS1q1odJI@8ZO8MBM}-u}>Fp>tTDEh;x-UG}C>wmXA&Tbg_%np^HVu(XXXJAE zfwIdaduN%&XZ{JqA;ssf(LOo3nc+yOA<6zH*g9gthe&g$_SJv$+D6q^ACs)Eq36_` z?ueC6Z{Fki>K|L=%Oro~FH&Y4{*hd%pR%IQ{7LSa-9KlK{v&yZR<}(F_mR8}zvHL2 zV||PbJ=gA1_Mn_GKG@*`$=#+BHsh*_co^bbMNvL!oBaXL58I?oT3pYOy!B5!Z$boc z-`{%ss=!{7Un@i9{DqC=hY!uDc<3P(th^V^$9cccgpTaPeV@-<|8Ew_8(C5Qnkk3! zmPL+RPjGy*jzG^3QlO;$514wnaascN zqT_7-h3rQ(;dz2}77M4pzFjl_KnfiwTZilI5M2d2cl;;!P>|b|i99N{&!mSGDhIqN z)xL(!p#Qazw)vXMbr-4 z&EWXrph-(5a)s8APzCAEqM{ouItGY}zrUSZAue8w{B75}F<*DMty?8sy5*PV+`AV) zh{a0JA6j!0;ySbAHFZ}$@}v<#og?^nE(eFM9UP9Vmr3mtq0=FxAoKj{BJ%-ru(XpG~TZ$3BlBd>2c z@-&YGhCbamsL_gegFRFsl|1=tFz6Qangq?B`+a3I+8ckR&4kX067OYNsWn?iocAEG zTm|`$vDupzA5gBsH*k*z`9gT^QUQrhJ;Nr5{pNSV_W?v&j5rIz;6X zx#$lh&Ogb(fWDd}ojN(k619%}QN{3Ee-dlbySw`!#$hZOTSfPxpVlOoI=P1p<-VJD zf8#^munySjT%rs%Am{m}Ws*iR-@dnd))AmS>l!tTg@}EIIDQ3TGmE>CdXctV0>c+)xCxyG|uUj0CB!x}I{YJ^Su6PFSSGaPL0x2F>`kz=Q zV@mO8*xy`IaQfRlGu5pqpVti?R7W}eqZ@Lc7kQL?IuXm*!X%h3nZa?in50Lq+Gbg;Td2KwfsL=Y}FFvewJW zEDc1Abr^Z zI2|gwKIG0^PkrW*Z%kyl_=^;M?K8?|6edN|%b~eZ`iRYv8;h$nkx3uD|`?`!*$+|L=XRZ`k7e`q#aOtZ?3&o~ZFkx2kB;?YF9ab_HclI>j7P(-%Nh}3Vy z@k{UG88<;u!~0KWhOCIcLa%PaeE#-e%HoSYDBKj^&h|hUxi*iNaR?Mlw!D}8C65?3 zzNb$R$8GOOabUi4#s%5Sjm$WnH&$STbpbNi>GyB=hbWwW%76|E4$R&!-u@Nq`?Isu zrS3#t_qeo!3i4^|JpJC?K@4h>ef1K@`|U)`mY{&Ho^`LK5sqi_e^K9sJh0;1jg5#I zlMF`UkjD_X<)iotwvY)u8Eh$dDb8%~HdDJ8>Rcv**&0S4S_3 z4BDTT2jQRJB@MVl zL2$oef#_FXA z0iF&lS{3Q|;P{g8_$5x{9Sb}BLJ>!c$Cm@al4kLXc4k|B^rjhZ3!hfx13x#tOO}2S zZ)QeAZ-8j)tk!q}$0z2?WJ=*d>`?oopR_n`WqsJ-GIFBowO*Yqh2grkvp)y*z1BgWOYR68LPuxFr zSrd7u?IHSP66{)C5#lC`*!P$6N|)es+|O?kO?-3?){=!(M5@jD&$3b8HoO=6@I39K zw-@tPB~N=tmjj&TP|h|Ha!UaDVx^w@OA_t!Ui0VOn z`G|9eXnj`+{tovhv40@=JK9||IE835X5;IR@(*TF6RITsHsy_?eKMlwm*xO!lsmh! z9T!_rU4hn@R-!I{Gvx}sR zj!<%{#t_L}_JiIi=Q6HnnLysXvS@F$%)`PzWU1w;~6Yw=xdgm z5ud*je`tjAoB!^8cu6v3BlGrgTtKv@T5Fp?`Ov+U(s1Nn16wWFNlvXF-@QU2`Mn8P|LpnH{-F8mNNmEM=0-G_R7ACyvp8c*CHvBQ+TJ7c@@$5 zM(a*VQgkO|G;P|0;689sD;w?e_S>c54{?8$Gvs2?X+?Wo@4(cZ5X7UiA-zvfZu8eJ z;2ZKwzV!)Agu*O4D9PuBsP!wV!IBsTyvd3==6N-pKK+fU@#E4_O(OAb7_v>HMYy|hsSN`nZ z5t9$vn(?Fj$>`+y2ZXYJ?FettDB_1M@j(0>5(Q4~O}@zI{^lheArz*z5dKGXh#x4w ztYrWDeAmD3^!o4hrs8%4{`Y!v-XR<)?@QUdgnz%E*bEJbBWAFd(=q(_dXd3>y~s;0 zTr}G)otGl|Jn2fibY5~LU1eKU(-EZOMb+Ft=rCOZ>Z{F=3X=$nDlIGrq-nlP+!N{~`B2%gdim zf}PX~TrVF%l+?Yz$&Bm&u$nn>LA_ygqADd0Idw*61TT5owPt?$MkLO==sjMXfV}Uc z@a`Ct?{H?!RYLwHt4s>(G1+4#VbvEz7dN$mLR|mv2DK)oS<|3y3p;wCVqv#%z%yeHeKPV1SrT$!MFRuT{ zUY$GZs5hcm_^)7Gc=Mewkr5pdukq05U%)<`r|q~BBaZw+IRDWzD0dZU-&=(I_SWs% z$4OcghiKbxMUob|!l8xtDXH5IpH1c{K)umlZ6$vO`R4FVU1v$k2u(-L%w3$nF>`zE z1-$?G?5t9;j&kmMYKykWf27mnxhk`JqxIhGEhMw+lPK5SH@N<11tzRcpx)56jeSUi z{KdR%A?gijg-@$T`ElN|TH;eH^ys)FzStjvkf<5 zkk`|<9KK2ls12(&G8f~#mL@|+&!kAke$F}T4dO*} zk#?-#*&f2Bw_uEVBQ#XL8U2&(+E4rh?~%gP_vYR%&NxrEU{E3sdH&G`(u8u`9vi=} z$e+F9OX9`#e)G@^TC6|%N#F$+57ybMFLe7!p+a=r>mqmdKYj4qGFSk4c#ougGPwEE zcNU9(MBIB(Oq~CJc0y^|F2MbFW`al}4y;}iiAOoxrX_I?cn~IO!*EI+anIk!w|}90 zVu{Oc2D$L5Hq56llJON=|5k~pQL#|+|Mv9dq!a(y(-NDTe!zeB^y*&?D5|ekzpjkq zG7o;*_58=Zeu>>cI~(oleM;w%CuO#(*+Rkia_UAgtV=cCn!a6mH~eQ$f9;t1pFO=@ zhX%Pe&%-wxp)hqZiRrHr&U>H6EPE7rldjLqJCxhrIimav`OtdDk8sGR+THGd{wUt(V}e23gI-Wa|^m{*W| z;Ya@!4#*u{ex=9VfO6a6JA&U(&Lk?6<^-ADvX6>8$`E&pYDuZXfA(~KrtyFF^u*qe zLdX-Q8qIVd`&_HU>+XD!{8ET=7tMz2KV0GE@!+eOR&j1hx0o zqv<2MprLz%llXldsJT7(^4m2Ds93MAS^IPf8unbhasl(Z>ZUKe7fWA&M#nYEru!SA zZf6P~lb!)o30b{-@X`osCZdX0f6zjm`_g){=OJjK;@RHBb_(hSJ-2o76+>0k)~uX! zE8uYBpDg+@bx*RKj0q2)koUT+KyG@d;j zb$s0(YMCwkub-NM8f}}J(+@bI`O&L)dg)@&EM_yJBlZ<)Hu4v&I~zjdwPR&e15H4p zoAhZI*q~W!i_?zWN+5^6tDdiHgc^~qG9H@-AbNwtX=79PyjV=TVv6v2b*_X`kK^+y zX64{!!{C`&viEy_ilWy@6?!m?eMwQ0P|wbf6u>k9nYskuX|*p`~_${C-w2(^GT?^ zcO+6E@EufE?@>}!X@mOPhTf*FoKRlCVs_(6GSrqG-0Q^o04m+Lz24?t0cB&e`*%hS zLml5B*Orf-&~QFx+uep(sJ2cj_NJ;oss)lkk8FS!2&6I3NoWX|*iLtUdyuiq0@D9^|( zNY|!;D)+u)@h$j1hqqeRF|0xJ5tZ%3HzuG#p?)mZDF&+Z=mm==tf28-%^r5r098Df zD6><%(C~X)om)N`nl4XCJ$QlZXQGc`NIN(P+dbO`R?!yD9^3klYsfyrIydjdb)U^ z#%YNflCMCWnl5-0X+UMdsq<^$0A-(JHt!s$gNlgBUju(mLzSQ9h{tVXD5F_-rj0d( z8u4F08u;R&LdO2vVoC|r(9Lx(Ep3F-R%Peqdm>P|bMvgK^FgSkX5Fe9>jY(%*1cO| zc0X^mj2gE}MSCO)DLRmwRYrBTrsAe3Ah6T$-(0WVJ; z2*ls_jYH1LHaDSB<7nsc;Eho8`}IzW*aB2u_xZtCy9%{4pI(+e_yl#5eLs78k3i)W z*#M23RZx~HNHZpR0jet81g$&7phVtu=CX%6RN58|MjTay((qeK(t?km__=Y!1+%YE zW$yH6&|4B}s4iXR7g6-w+Kq<(c3 zLe*yduqWwbP6(T*)X-Y&zjwkC->36MVfYcK>+@HXXX1gf#Qot$ zfWJR6=ZviIkI*3L(?2nI2CA~so&R27gz|{rMr~gtp}P0ob*0QbP;Dgrk?Ra6l;z19 zJM`H=N!SIJiiI6eJ{&yfU!nz+qdR%~yPctIQTq0eld(`Nw{O#)2NO`#;kwvMoS^)V zto;M;r}@3)oC6m7A=XnINtyz zBu||+!5vD6sqg#D<9_mraYKq9GgKb+mFmEKvP@6vz^Q}2P@O9C!0c2!l&Ig#^d0^O zRk7Y%C^P&}d%i5WI{ZGA&o;3P9oB?W2N@o_%~zpPQSyWWzXDVoWGKJHBM8OihbQ%n z`hjxNC^DRzA4(|veFmyKA+I|Qoa|;^mCQ(oVW}n;j!}cO@|^_$hi4YGFc7ZT{(1r!eY zQ6ITbp!_4RB_t*w*PTjDa$qau9C*UGyXXnzwo=n)-@-bsP8T|-$NV8%K`0|dNdby( z{?e6*`UBZ34feqh4TVGEwW=KYkd^BFJ+Y_|^14FoCQY!O?eenOK?eiKS&kDN7qf)C zQ!;Iz+b%=F=a=5w8%3a8zUk^p`Up@A=R%(yG=jq2o~5T{MWAHUk>ca(U6AwIcimNM z7)p)^Cu~xehq5iYchB%)-JQMpN1_Ao)S0^Af$EGDF{S9RN+T9tWw;%E{ueCMaI|La5|Ax5_ z$wG$5DD%yqT#&83bt-uje@BY}$6qGqLk_2eyd5PEvR2irmer17U4j$z((%%eR^G37 zOA_nXF7nPw9mIQsVFrO|$>)$2BH=NokNJEpM=55Pd+|B*mZydOfegiKi;yV=2?aY0 zCQ6bZ>EN*K{>y^ck6!bf+wN3|5~IFl9LWbM*3IjC-Q6L&;dCCGUJAr|P`Rrs2tcak zw~25aFGzEc>l=022ytTEu0z95ApXsqlXOQ0Bv!OQXJ!~Ae-WV0=)VMU2?kA@bE6^U zlRuli#Sp}po4<8@{Q**vH+{_da}r{|vOm?{?*U2q6@I$+1tDW&i)WPQWk}xA*fODY z8IrcV8=%q_g;X!W(*>cikX=+UzhTxFl2`Wsj;U*g6f@qm)2;rH8ahj|hAmW;0;rgcNXsB9Jlv@o7Z zr1=Suy*>r(EcqS zoS#cDZOI=2SGVG-um1+67kF*l^J#y8tx9acsVmc9H@l~WWor;P-pKp14Zl|#-mJ6r zmV)3k{O`)UfkEt3z-oQ?tOYpT_S!2FA_3NRbJ-pNgJ5r;b8KFT8~pE4Yp&ij11}6# zz4AF4?7qln)uwHOr^~7)7dDo`V-72($>=ZjEmU49Ml6c>I`RA+waU^hb(3F$Iy|I% zocv0%?}mdrPnzM3%`El@JMp7qVqW@nr3{U?a5p$K&9qgQ)`1&UQu!(40`jzD5gR1Z z5hu1n#SuX@Vy(nxo~4O>i6y6e^?&n`AR{4)2=gcjsH+eb|L8{CMV8X&QVWRvj)$wO zo_B~{{rdC`?n&Y&*ROpQ?+;uJc-FspTVg)vInmei0>ruM>8-Ytam4ZTxqVn}kXT>i zt(>o^AWo-sN*JVFh+Xr*h9VzB>7_5-YeJvzNiUnm&&4`?kp7WAS}eydMtti|y5^b% zlFGmRL)};A2x>Puz6PZ z9u;4-n}gboYmCv3j;Q_UhIW-yH(k{k7Cf)rC_DdJ813X*Zirm~thxe8?hQ>mw2lA%VGyFTCa3sktB?mk+;jGVXY_3J*A|Ee@G zL;Fv{=;g~3)o3R%y$GpGg|cG((QR*daol{wie>;RXPD?8d!$3jyN`*-Tl}Hw7Mpy^ zFIgxn@-S&^djwU$#t`$G5lX733|@Y3hVrN}u9Z`bP_1$#bl>gcP-^i#AhvJ?%I#c) zhRRr>Leu84z=$;zi~ZhvIU^m)|DKu9PB;N2jy*<%P8Z5w=J)XkSK)riwM3P-fa1m~dYmih4x%EAPw)%Jki9Q@q#F znU&$_%rXo)iNOk*O?5yK9Q#$;fc2-DFUQNPN;_nmlzWs2)uxLdGKV0tsP{f zt8NJnI|<33g1*&ncmc_ryBf}39ECI~M~^*NM>)hgB_@dGH$)!2=aeee1-{B^T+!NX z5YfW->Q9s~1P==ewe3-aux>wtXZ#hAu;Iuarf43B^zkTAQg4T_%gk2kRD2LqpZqKI z;yl<27{Bf4U<2m>Jvv{(cUCXA+gu_I&Z^vM|!f@{j})~Md`VBTlhXWx)FP=v5xs1LFuVRS-VqZ zRV4V(-I+|*dnDrA=U1DQrb%=~_UfLO*kApCjj$2cM+o}c*c0OamxPvug-VKL6aQQ0 zMS`hYh?mR4&Xi_O5*oOjciOCyJe`zh&E%wpO1JUb!#PjzJk2`HGkpoq(PdcHy9&>F zEGDAV+wj~s@+FA57SDm29rdnw&KIAXav1i-bK(HYb`Jto@)O3>{8V`E;|W(}OThCW z?eFqS)Oa2|@A2vTX{hATwCGDkCz=HZ`LEN8<6!&pD|1@z3nH*)UY>Rd%!-*8PfxQ>lB-c>Nd^?krR+oKiN zcfZ`n`t7*x2YmMGvEcePGKnEup;(hynets1D%f{(7mOc=lJdwy*JqTG^B&;mE=M_+ z-LX1fC@t}<6m>fRm1or|-w&ewzsu(5!i}Fe?ytb4ISyqR$4w%&R-uTSrz7S&CzLv$ zPdBjQ2FjJm$EL0~pw!5KUCQYz6uuqee$}i9#qRZQ^~BVmto2xSwD1$4=+n_EDh)!h z;fOVR(>o~fD;*0C(1F}sCftpvMh-PW$XyxOc8-A+C~9Gpgix%9c`SkB%XbSX zEu^O##Xfw~1Ua8~3rvJNLi(FijNH1WSVt@2&8_)qC{S(iO}}{^vOH$C(;N_oEKSWg z?Qj>!)lsxA8&`#-jg#FHR&>~}{6?(m?<){jx+x>@9S@`yK9Ss#Sc>)uH>KGE>u*ah zizlRD{Rvg?P`d=IZ}-)pSh|x1l6$}^cK=^UXX~W@qkRTKqYF2)D6&E1XT53C*9d-( zAC5nysf9?>%kEn?O+rXNKhy5-7^hH^^3w1~10;OUe7-ec9ik?aZ-1v8gK)0C>kg<_ zV#f~hXao*`T|#w6_Tw&aakg)081j=IWceV&s^|dDejn}pxKD%azM`?aoeSXj#75dt zKmY=U?S4u;rGY02+h~6C3xUHmb=ze3W8h1*S_H}O5p zEIsy!TPXjc6W#|V-CEdumqawGYrR-#B{3%7=u1>QNkqu*(t+=(Bsiq)TbY753A^yg z_L2)X@n2o;k-61Pysuw75LFyX!nTMrnJJb-IltG15s)noE)ROMWse9Y08f_i3BFSQnB=(G!V3 zY(=8Supd*;B8fU`2gk;@VSnd{s|WomQ4X6t(f`+8v3hbv6a6kk;*VMa`e9UlLWm*yWkd%)zu$%atGuN=w?Oo> z?9!7`=S2UDw!oRQz36{YTS#oSLBEVY^}A`bSEl1upNZWWhP-Kkq~VMepN_^3Dm=Bb0wmZOf=Hl6HRGx(9N< zT;%+$iE(TJjWk@xk3gPg>Ba2+Zse^_>7iyQx2U?2SqcTK0ycJ=X`o~?U*)MdJG^%) zv25f&gyV4F>=ee&!CiT!glWj!AT}A-$qBhp2FZJz@LuPn&g&aJWsv(Q!i}#y4>F$j zT$%TD$GECZ{?w{xq2P`G&I^CVAX_8Zlb;>!56)fRm1aLd-X>w@i!;~oK4&(f!mJO{ zj0AP3BxxbOT`Mys)V z$H`=fh~Bn%_ZcfBzHaK#x+DxSdLPVAA6|h7W|w+BJa@-4{w?aIT>yuRbo15YhTy8N zecC|XPrB`v_T`aN=l zA+B=gNP1dZi zes=PX*9^}()ky-a+y$>JXA=3iNLDhRmL%oy)KQn;BQZ5H&rFyMNotnX`?jZxBwK&f z+EwTu$==en#lftNWOL+x;*G<&W5pvMK66Zy40rpq5NFI+qW8F`GRIDmnU8-{_Q!e& z$7jcBZzPjc&odurb{)oiD4kIQZab1CJ$qb^CzWI}Msmj*jFXJZ#eK?q0!h;TC;!xr zNs{!VJtnMbMI_BGqA$DBo5c5U{awR42dS2fFRmWN&p)~I+b$C>C=FYlP0#j5f3f{a z-2yulw=FmuZlwo`><t! zGI?PY{rm3p(+Z~O-`}aB#>xg2Hx+UhDd;a(Q!~kvN`T7v=MV1wXBSM4jil#aK!3i` z;JkA<`s=r*6f0xDqYAqqCg%k_FC3B}q zqrS|7etOf~9hcfUq3E@vXx-FPJXa)8Me%OK^Mgr?_Ty)ed-RjRuel_&CmuG*Zo>NA zD@LQw#uw1uIQJ<01IA_M1Ph9-y?_FvmiE7#d(gh%p z5vJ~AUF@4tAE?~uesc)*gJJJ0YrNk*xu+p{L=*Lgiqf`Ck5Hd5D7qd`glvxH?vgQn z)EDMj?3>+CUnris8CeS17pFY=2U+p{`UhWx4cZ4LyVTgcc0!tU+gdU;JtUkO$QRVU ziF~MWc+*RiKN5Y=h5bRMH~8M%APZUBN54@;M?;!;Y}D9+6&x1`6L)(689O)n3Fl+o zCqw_BqY^F)$$6_V5_Wo#w+ z5c^>B44=>{M0D*;T%3r7_}3-+MT_;|7}WK6=t>{Bw&&6@b7e_C@-5naT*(bw^(J@r z;qSoVyjSOj3Ndg_W=r|J_85Y^4W6xH9X{W9x>Q!qByf7U@U6lA4g^r`*foy%L=IB( zyk=fMi0fU6!z>zd#J{5VLDF74S`6LIi|b5EUH#HBNjNI%l>dB$B)@L#w?E=Q626z8Zg{0a zqQ+IfGZ@d3WVc^N)e+lC?0cW+O9wWPw4D1ECr^JTIlLUlZJDV^_KNZ#riPL17du_9 zOq?NULdRP9{;H5nU40{Yt{)^LUGmKI$S6tvIO$$TNhTRTPcx{gN|3bEF(>JN2#~B4 z!@Fk9$)s>7Y2Q+a1Szn$d*(u!B!&0ORldBwN3yts-M1@YT%W{*5*VqIyv*YsKJ98G zgI_momq0toea1KC6m*?r-#)VP)$$_AOx!W;=!Eg{UNsjZ)!&i)g}_}4El#B1!8_%! zOpH(TyZB|ros;Cc35Qp3VxGXX#-ruitR!uw*3d%HjpVqnaJ8{gNY;%hi{AJ3P%In4 zdP3F>$`)o=zc@=nQ9Hc-FcJj$7j?cRpZG>`LX}w`_m{C5sCb(4)JFvSD$NL$c27M<{{l_-ly4#AGI=uSVO}9cu$cK} zJP+g~#5?WN$NpgIPxmGKy@&pW*l)^% ziCRIK1;&2$ z#>*xT%g~PCKWp^>{T1(DT@F8U3{v}U3XQ&yf|RadvBzoyklwZQBs6Od^})6i!iRey zDxrSpZcPpZByB6NqC$UZN$YgA&vHhQ$?EK=(8U@ z6+fZAxNOd$9t1(H{ZYa(%it$xYjZ$)9-LFov(2|VK){0wm)OSl5=Y0G>u2KEiR)|S zvVUR>Bp~@u<_PBPx%LY8Jr}VfjzLw$vyEfKIjL#hiOaj8gJL6f?i5A3i&Xy+zNA5% zlNa?or<|o9yS?AP>(O%(&LDNC#VejfB|j93%~K@t9crwy;Z7vV{Z^Qs^9%{A2`){1 zkwGH5OipMDJ|jWCLeKkU=ZJ4~!rTY-ViFNGMETh(N>HE4YjlQ_q=t&1#7d7k5CRvg>ZMJYI+nJ=Zg!8q8T_dXjM{?~8%(`swE387H!=E%KMMG8KDGMS#_CV9n7>jBs7ND0M6cB{g6 zQe1xdg3wb&QWD<2=U~nqk|z>+_m^7}p-9sAPlFSo{Ocb3n`l6C_J>&0-NCq6j!g%9 z%P>#Sarl6;)dncAlgW;d_QLzn4Q7$2OCc{wcj=YlZpca=V%f!}3x$Jc6}8gSA^TV2 zVeQs&yw_7*^u3Au^QFPfGj!rm^soGj^T%e$JNa#Dl?LypmID)-0$3sE2e;e%1BW25 zGoqZ^BMAy7GrF&c9L0O-yIW(kjDaHjD^wuoJKkSkT7J$f2W7eLPQBJwp(Lc$B-=c(t1kicgE=);4uQ`P!4CS=$+)Ozgf7yT~U<%ei>HEZGqKkyOWC z_HBi<=W|=jYCk|uNbF#!(Md?Z9JdzjRRWnhtqDGjAJIQaed{xoFk~u7(lufI?#!tw zW~S2xkaJ7$L)e%gB>YHZHCtMR)Pk2xm#L&7uK0*ad36P(Q9qYZRCR`=4KHulVBALX zYgxXFowp(L+T5sz5d)-rIop5mjSTuV1Rm%8T7`7h`4_ih`XP*3dq=ib2}JE-*y7sg z2mbB6Q_N>jf4IErY!hsSuv*t=StD8y!8m5YGkX;hU)72YS<^v`E(??FR2D=;zWbc} z9^=q9g{@E;ooD-720@l~{|976ZrkasB2G}3}g?Zer{YKBvoSP;A zDcXOnJT4H|o(-*RihXzvu@G3XU?a|{-5oRRG7Wt&H%!H5F5NP0IJe9!h5Ca3JnP}g zhBChX7gNVANVu`whH9EV5>;M*==5wgNsz3Nm%QhOJSe@Me+vmWk{wB-3m}mjNx~zhj2VrNo{)@33xCy+|>|ClJDZl+RK}y*@~{oM`3=z$+|-< z7pF*?@s)jhZ-$d(8D45Nvv`s+?U$v|fciy4u(4<$jl`OzZ|3I3KDpfwcMi3)q5XeW zhPLMy$#^dBeu-z0o{m2}5Qu1*x^ zrm=idPn0{rJo6;LF+7))G@5VkxsZwR|BHgLd*%sc`mOJyBU?zZ z0~fdC;1!am;@N+yR*6s&t@-}RoF_#)Qd2W5%Lqj-`*%;?0x6d>X|>V*OiCk;r2PzS zCS^;CEh{kvq^P6irr-xbeEnOT)vOhybUavHrTPIWyffUW>xO#8R71j>?gJ_IG8S&$ z$4V$ic@33(s7d*Vgvj}29a5GTUTrbEN-7RoX7N7TMkpuEH61BSq-3Rahrs%FQl_{) zHBdr=6mHBkWEVL@N{?BrcT0MZ;@FMbC9yw6_7?HK9hc3a@SZI#t^Etg;-*g1!kp{W ztlRHixndluzJQ!SWj3V#*uZHVhW$03!|&pwjgTfJb~yn3o4GAgsz;x#LWcWpCQgf3 z$jjjSN;7>7GWfY{AGNnZ#&S=}cz!=*Yk9BwNPK~kqK{h!1^6JZNGN=H`7p+dZ2r?a zV-Ce-Cgb^!B7h?HUcc&}4aR>MOfAr1yvr&1pKlm*p>RXMyX16lC_QRjL>?_+{KuiJ z>E=L)7xP(nrc^;H=gZ$KUt}THs&136pem$3xM`%lt`7-E3t3-I*F*A-;y^!Dyw6Cx z1>$NOAbFhrP<5RyB)et!irm5b^V6pz8GVHyq(|e*H*tE1yti}TbMaE}a~)1K-*W*X zCz5F+vT5=D_~Mliz;nw^wSvpBYmhMi+C$nxAEL%rDTNVK5MCAV-o_BmC+}wM=3?G~ zUHEPm`Z5V{vEKSzZSi_TcYoE(Zx{gPs#V%um!gdN#9rLs;16(go>Tv*djSI5|Bk*D zxd}dkMsbJG5AXE+M1reJANWn*d^T`Sk2pa8*4qm##Pxo)vdq>6;@|m@=U%ilaW&-^ zqAJIGMCsy~>8MHK)UA8>mxgr1`(3|-{nn|ZQ<)~Ta&+-L(ltK)>99mYN4;2JaYP*n ztCi4wzhfJT@=)n-4wXjx!so)&&StbX{_XqxU!K#(bwU028%ad8-n~~M-${^P$q9SD zRkSZmWr}059#mJnevhyf37}@@@mV=blFxqIVzN09^+RCT@q5ouUz9t^KDdecL;hF> zs~YMP4|mC%A5bqiZyj+-Kz-qAzp%2E#G3O2-lfNSlG9JGTJ(0IzEF1`H1Q^xbjh@G zeFh{q`ZL=h(QuM?L%xnE?n2(DqHZOF@*1Q5s2t22a*cNzl_XiLnuiO2wURXPJ=^7K z_u{z6(%lYflCje(Wmf4f$^F8&R4PYBD1i}Sk-r`iijv&xcTdy^#hLS7w=~v8$|>0@ z*nWf*tbQ$$62|%-Z)vA@e6J5c)j+E#9q29$sA(i$rGRvINr1<%i0awHjDOmBzs6vvj1|Xyjb}wNz3P=0JOE zSc{Zfbz91_HId4z;X|JyOh~bm8D1z#kn%sd>2y0>Ntw83^C_kxNWH#kAv^Fr`XBfL z8NXwlTE*RZccxEcAB#=FQrQ1GC6R;q{GIm@bFZT12J1OU8RuL6!F~whVxB%>n#cH@ z%hu$7g9YB+|+ZPgF>(4@(rC7 z$c*n&q6%=q_^gn-Cv`X>|NBJ+%0(~8JGz28#0BH6?r84L+y}X?z<);G0dfTXEI7)j z0cFR9XEcgJP~eaq%3ePQ!2`Mt^ep@kLB3RQ`l*5MrRUF{nQwteq2gDWRd_#Qr7v#V z9}8g@1FpT#5P$?4W9gRnJ0a3*S-a_@IfT6oTK;&X0AgzFPOb_vfh|XS>+eu$aCV(9 zWx7w_(EDcgO>~?RxI9c(KP{>bc43M8-g3-?!v(XA2W!?K;LXJ+(&Gy7Bubu`#YUnY zah>Qh6#?JeZ{K!oswQ?3j9D7z1BuIH;hwAS+lk*}?ytTny2w9G^ZZyPcHzF&`*Y3_ zM{nCq0kww>AH=fvFIf*XB!uR&9BM>=r#GW0hpuiz4_o4suQ$;@5vkqZ)FDM8zj}Rs z7l3uyN;kf?u$wT_YS8o!Y>nMo4ZlU>U{_?-9%st(3n!1}Vx zDJCZ%f%whu`+16^9M2nx<(=ncNg8e39l2Lq@I2z#P?DgF=ackvRI#dfUQtRNJ!(Qy zfbQ7&I2)4KcTH~p_3Ho5BcCH%JMo+{ahx>*&m&BtlLeylXg^%pX=K@i_QbMafDH}W z7l$?-u+b&CHe0=U>#%kJj z+7~&$Cmu_qKDcM&=KLDl|Bk!8jk6b`~ktw_3buTI6S|ep^i=@;=RP~0NHz}#u3(KB+ z|Kl6a$z_ouZuZHAo1aLr$N!OZ-GNlTUtCLQmuT4(nPr4@ZzMY;4I?6DWMyTOt?a$` zc3pdqgCvzo2!$kDc2tCZ$M^T=eeQYByPoH~&vTyh`Fwan?U28$WdE+h&MW~a*cPl& z#^i|Y=lzU#i9->w!{*t3eki`9=n=^C0xIZa&WKi8Ls^m1bU0HQly4e#l(X1Fu?SZ{ zOh*@#mR>k2eO({QS}$F8B))(m{S(ACV1?4CTQ{J?6-ol6&1p>rprl6sqyn=&R9%iN zUoO{z3aOmw^I}#|wSVcP0rHfTIIN{v-$DNlj??<2XHdD{+QcZE7mE81)BDiYK>6kR z&%Ox(Q1<8kb`0uU^kLkWGGE7zZV&*QUWN3Kh{>cTcaqf%2KX@wXN8p^Q1d&?J8pYA>p9mowi5 z)ghXs@@g{FT}({-$|??JX)ZAqz4lO<#C>aGx)5r%+3fLr^BYQq1zlcNjjsxqBBCF@xWf>*3jl#PsQgBRdY%5OZBR-6GN9LBEFdLo;H)TFX9=pd$Kcyh|iZ zQeqt8$=tR4hv=WWlZ&sR37(u#_po*=1(y)y6PmBcW`$@sMT;V?V=z= z3G{0v%kw~-&Ajb!(+otJv)&#$U<9EbGvw8txsi zAmXI!$`OBMcvko{^QX@u<}-hkaS^lL9DIbOYmMCl@-}SPc#DNUVPb7~#uqH!pxb;6< zWyA;WHMHJ0VTbt)TXDA00?comV*K}wjCqPI1Es|!%wN2`Ki!P_6cZPcIo={~>>b;f zZ&Jt?Py0zhUZxCk6QeIwQrP4ABlg$b_sHAPO`TMi?1Sr*+rNT~B_WT$?fj|GXSnVV z^&7k53I#X$>__EzAp7YOXOP$_T&Ki#Ej?St^@wkU@xwwO-|hHvnG4q=1SFTWJB;%S zfuq80IG!KMzH0YFKC@nH#*Cv1IFC4CrLb2K=NCKnD!0-A$ulwM-VGC+cL=W2apL*+ zUbfy{NrB(>+32g=Ut)ZaV>01g#CXA~tUeNe@k6+sqgoB)$+?MlcE>R;aGiU3O90~q z?}j)#35xVqYJ(efF^;gj;t;%r@#5@oV!<4g4Dt{v1OlK++lX^W_zhG%6{kKBbOwJr znlm%0;{R7a+fIl;c?_AmMDz<(N=6*rW`N`SMD4d!GR|vaUO0TbH3nswODRrQ8KLZS zrY`NucBoOG*fu{q0+ma2)ZHBLKlB^dVG~lp zO`oly#wANHu68$61$bvYUg9JAyLLNel~)1@j%;MEkev456Jri2--Z^n@1s ziQZnjYKQvcaNOJ0DjYsV^qc(6ciFd?n5>-JszxbHjOJI-zMg~iCyLFU=Li206Z80) z9cKQ@qd#|t`Qe-c)UOD#>=k_--%O+v!VJ8 zjjhg(?*=Hq!7_KJ#^Zp7o`+$K4d1>)NW^G--!j%;L@r8j9usTgg~&1` zTL>Y&jO#zN>>&Iw-?ydHArQDD#_!p;A@I?1sI%=>hj0aYW9jPa;GZR#r**Up;^P#g zWTa4cX7uVtb?+*qt%#b64OBqdi9YQ=C3B-diZjb+{Y@XO&9^1Ml?@7f)X8CUtE3xi=j zP^hiM%kChH`Od6_J;YJWe~zcV`c{egP}%%dAqUKB7R6Q@Ct<#GdS%xBG3Glpr&&Cu zFc0dxJ0Ki+n6$awcJRK!{Dew->di^aCzy`B1v<=M$cUbLh3f^1=oD=y_1X&O4?%6N@5FIF5&i30G~oQ=%E2cRIym1@7im2866YUB^w`W;aUP*H zIM*bI^9vCt_8Z%wxVM3Sc#;C=9p?)l9$3Nog_Q4?J;fLgOb^V?U&Hv|L(jX{5GohD zu5QFLVf<)W+e?bYc;YqdUQ&f|VGp3T`$VK;ywJ|K zQ&WQSOE9_SdkX5PiZ9bnQ$n?pZ|DA6IsDzjW?WK?|9{gAdTj_*$-DuS+(J+*vf1u? z4f8N1=QDOU9Kd#!D^a)3K;?|dN|5bCsNm-~Uu($;_1^uZP0Ef?b5FiWfL$HxEsnhV z;UohU2R8J_{J5aH$LMvk#RsT+ad_L6gd!- zR1H3R6M#W?aD}@J>OSjB>gLEpqjVdk{3sh#R+9{G?Cpk{U-@DN?*gDfR_9^ zJ-DZSED!3~awXOO_2BdJGhlfs+0cD1sh(ZHndp3~yF$L>9>$$uRfa4Uu)QC#p1DgG zoOyq|-Pwcnirv{UWs0uge8c;vxxr2RKa=|&B`wju-7eeeZ#UTY^0q%;*x4|A>wU9F za7IJRZ8K`Ob_#6Ixn*{2tfA-r-DPnWabmEcaI2Qo2GRG@$+LB=m}h;ldz6|xju=?? z@pnYH2r=v(M_^bU=2LteWA(=EA}O9ufDD@a3Y zW8m#`Z>>=55rkD$UlmqY2fw*=&5pPrh;#NW+n`W}R9jWeyWyLVc1y?Toy$C=rpPQB zz3+y&k>!-lx(-MxjSw23Jq-!hE@t(ZdLi$11*gfHCM55p?uZ%JM;?gbXA=xsSYHv@ zW1-xEJc-wgq%7}1&H=AaqmrVKV<7#-)A}CPXEbIXITQw&=NFUj3`IaD)up6@0nDT9 z9dvqqVFNNfbW#uO{|#wgk6Q|wXmP*P=3q_G5|B+ZBVPQe!~N8V4{l*a;Qq5{ z+;2V48hKU-_e}#j;Yu&$XA>nGb=Gh{)xn^fVFdEU&Xl^(OyGX%i?gyD$mgE?)tUdi z8t#X1itY})hx;Sf_N(ns#{H73ae))TK$2}%coMga`yhL258(bv(XV9IN`2&oUv?Dn z(T~7=6IDKL%+D5#kM5q4qlLoPU)7{PDq()}O!LG$W+;t#Jy?bNUgcLV9FG@&j`>jG z=?gNmxWXXr!W%} zR7AZSt~%WTRr7tkeJ7to$;$hliC_A-P7(6l=ivtBKO%;@Y_>t!w{Rm$=M9`su=NbL z-h^t}P3d z(o8{RN$G>zIDf1-kT@K%wg&a)WuiKg-!We7Eq*xl1>;9^I&}^iKB4JUqXD7jZjc|fbBq2q1Bz$kkW1e|}IQ&aJ|8 z`BEYK-WGU5WXn_8r2{TNbUS8d1Wt+~nVozU#HT{#U-TU{i4G^+SEnU@65Sr1>so!{ zLVP0O$FXDa8PTQgx?Ht?AJIwr{vSH29!S1E$RWP(5Y}C8(!XpqgxHn^ZC=bDCgyAC z_x>A&uy;BY`i^`M{Va!`hCUSH&)@u)o4X4_4bz3GVob5#^20>lqmK~rD7yV8jSXa9 z_A^h?P{lf`-FiiIW{|1W|HhYh8M0_x&r%@oQ8I`3Y0jmeknVUpF|DW#G6c-!4XI@@ zA4+K!wu<{8j~UHRrBh=4)Y5YM3Nw&>CMB;i$3j*jr#&0)M-)6>cz9KD57tHOCFYRm zAk#l?$NiOj$oo;7y>YAYb6>DM2q*DEcSUZhW~0ip088x;&7#<+OIx z6KdoOq9Y&KKGuo*o0V-HVoSJBaeLX{1m_Wag72#yyWu`XW6z!wHc*!LyJlz}_eVtb z{-9LA{G-yfn5SmRxNo78D%TSYh!`)F?20wqX)w#Ko5dB>O!RrT934|!#(jpYv%UwlHpUse(G zkK0?%2uNW5anIYQr{pk?aP&~t<0nwYRQx2d*B$c+Su=@Rkx(6+P1Scw2+C6T&E}rd z$2@|ZZctwtR3-*JQd5nCQX%0V?rTa=Wv*$)CgY6x1P#}rYi&@kLr$O0n}KrDU(Ox& zUvOQZeWG8X-T;{#uh2QyV&nt%4pssIDLZS0;cSs21suPOAugexaoirIEhgNP_{O&MR-v25_En|%1my+N2`W~qD%ZoC9 zngfj$1ru~u(NN{q=05!6GBi1yGkPo44-F0QKUbvwK3J7|evB*zLSjzbNp^$)GiQ;8C+Z9Qw~7WB7pcn_(6 zux#Pb_SGHnzvS$+)BKue=N1l)<0yj?F?fBiUbj#k(WAIB%^=^qA?4`jSSNEsqGR3u zV7CJ1EnM2eL)71iZhzZp%-(+>#zo1^Uydk4d}H+UIGMTsaF5pRNn5zTdsHcy2S&W# z-cD^|a(n6ia}mFY@k?Lqr#m-^;cFbE4-LBi;r{IH__01-J2|j755fwxwr9*zAa3m3 zsWzQ}Eu7fC`1$ND+}M-2m_o#hC72%B$OMm4wpR;3*%4o|eW+TY3>@pu=uh(@ zJIsOG#+3_9MQOzJvT%miw-Dd!zmLl_y%2G#VvPR$$Rkr&F+1??>J~mTttO+9m>uG} zSm?@tcuXhbQ+Ef5DQ^95$~wIM!)f+v*$~rfO(hK2m58|?Sabzw#1Zey{r>UrCgOnS z_U-nt{0|2^!|?Mz{HqpsA(1>FZKW<@L@fNg6i>^?K+J0TLU1m!K^!bA`=Oi8#C*|* zkyRdA#6maCu(2Lf#8Xerc_@f%;jI6iwRyaSGrqn9b$$_FT;gQTNi6BkVp^rVfp}v5 zC$zMML{j#pRhk8L#2NDuZ^~2=i&@`)zjqt!CT>Rj`Vwn_cy-0EDH|uYaP0Z^;lKaG zaeu#!bqk2!j_~0_y!ySQZG&>e$^jo=L+eyxF-1M323eWyI#BGFlZG}|Y8*{|6 zMANt|byeg8h`N1Wv~r6lz#}lE=0BV~d|KMV$Ddj4T|hnn`5X_L62!wdbfkPF5KA50 z+Zye@ZQprkVNl(f>ngOxLtu7h2bs9V zKj8g07x@;R9*|HUN4|kDkK>osiRF{np2xbz5%~;k0?G8t4_UH`O0R3 zd=_t~z=EN;tk|$51ws3srV;XGOkZpLnn$cE&bz*c^Zz^=bUiW1m%*l;znuIZzsaa``G347`Y|`Q_)Gla zn^%a{Sud*gT&Mnz*JNe975PhAzv^3ALd|X^bxE=|Gz&M{MRG<%vn}6HGi5Q(H-;Z} zO+E$WlZm_Us0Ca6GGCJZz!u+3=d?Q@zf4$z0|fy0Ewjx|cWBnuzwxH*9zg6pE_e|G zHG*`5&)%8?@|%>$pEn24*HRo(+zZt*Eyw)ad!VUc#O(Z;tAO`wIaL!6Tf8hQFDn80 zSO%05HK9TBP{h3+A!zzjA-GnL`RZ&ckq7i~fV?bIrkK}ks1Vx5->rey-6E4%hwIPX z&eK8{v;MozE|r$8>yBXdI=ywBK5Q0S*Jn__E>nWnYsEJHjSa7lpVRB`k*(`1aj3k3 z*JpgX>-r#6o%)k_Z7=~E2NpQ$g;@Z3OzzOEXTTP($-u?GfbT={#)HGS?i&k84n6`+ zN~~uGgYmfHubMyj#Q=FtP~Jiw>I0oZ+|Os=d|0{h@slxtXH=o`mo))-K%Bph^uiV| zNWx7s!2XhMf%C4K)mIDE*GHi7wn0_fx;IqbWFrsdH9@@w*CYhKhT0#K_I38SZd0)O9UgHkH1f57o;l^;w4Tf7u)5j23~?OLK5 z&Ld{xTg?vCK&{MiBBSkoD0N88RjhjqINo>zQNO)X>BRTr4{M;%&D)r2j~7(zB$%aq zlm(10!-q1vV2jt`*E|gr4?Wm6A*uu=-2>v!Dq^5=V32qsh8>D&s(#rug#pHcI{9@k zDAV`&`He~zaz9+j)@eEhCDcwGBK^4kYB2jR&*>d(#Ve-kGJx@FSy0Xq$OBpHTsMA0 z+5WOsgAS}q%{K58e2D8PK0dY{J|YyeZP&LxI1TA#1&SVj`XJvwRr9FsW5D=)jFIgf zZ1D;#Z65&S6PR~tk%sJ$p6}W??UfPc^3*l>0T3632 z1LD?OqdYSpdTg|p`AIFrMbp{dJ&62*VNS_ChAepgGn0ege{A`=_ZInD@p~8>LmtQT z?@p?#D24c?j4oqc+$UU%JrT?1wdF7TdDA-j^EA;ua~RUgH3+s#JMsB!k2pwo9-ois zIW3}f6u!M>k09BKbnpmGZH_7Ps@4cti0XV}IW4zODXx z@c`W^?60i}|6a&LS(2h+_ViC2pCc!eKoQ5M`TKeT_11WzJjRRv>q+dO*!+RxbHvtF zcMiuB#qZSLnNaGewS&(z1ILs1YhygJQptSRJ(YhLKQ0@WsCpjwvmdFsz;jOWvv6NF=1@m!NgnB0n&hqXDTw&La98yqGW z&lR=0xH~aka;02#vVp1+4Y97{Ok43%e!D?F#>+-Y$BBghz5_oz#<#u$RSSvA82{_; zus){3_^(#;gZ}ka{Qs76=pDv?9T?oThB_|Ct2@SUkyGz|Ax?NxG`aIHU>=N+04s6O5^!HR-3J^6WR-k z=JuzT;c?wNR8A-nUi=C`ZZ`s+FZUgtqye6Eo)^P&ke1N;;JdN=2U9RjIPmf6Ys681_Oc21*i2~8&tDhc zUI)ULtS03EXBv&&dgg;C03(Z(MsqXeW_v*|FZ=Jm|;h zJEwI#?nbZw15dOU^!gTc1lu1iNFPCbmtK9Kk__tKB#t~XPhoY*##}y znG@jZ*O8jPz(aWPv&N2Hf)Om%M+3hFz5us5zMCVYgLs{*Nt%L&g!Ww0H$~(fH4mB6 zbgmQwSKrRll^s@K@wa2_YMm6A2Tvzw9*-xqYIuFo?_vkjR1W$8m)+nzm?-n3_b{P7 z_Q^Gp6F0a9lvU*p1rc5>P&!89KAI&(-1BKCJm2D@+=r3NV47UIxnIPG(4Jo5e;^R` zE+Ss~T{12P*JtmX+m77@i+}qI<&NzJ^RV$UclmvUR=KzBvWU|%&5;%NLR|^x5m8qa zrJaO!&FPnG$OG#dVf}!7MV!#G@71~55K*w)*}m;dZaujD5r6;v%L-RmI-BlHeMWey`K!F<5SIR^4`_9n52XFFIc;B($<~-Wj5>22d z=Q(rb``r5oZ||9S>iDyQYX+12yw3*V^|>1?yE2Tya&InyA~6lzx7YiRan*roaaT>> z;~j){F0F5ulIy{o>~O49!46y#0)CYz-2h7}5L&;9dr(2aHBf?IqGQ%;ho;IfkHiHu#|qepl+rJ?%X?P z?w1RLnW(l<_;Na-u_T>4o3kG*m{)J_*sTw)lRO2!*JHs_fIQT2_ZwL3nh&g1yiI6Z zU}qDOXa%z_5EE#u1s9)L4$|4Zg!f~|qk1e$!OfbxSJ2Cm&}0!pd25FsSOyGqe!80q z?gnGQJxVcP7IT9t^oD$c;9Q1}N~=3q*s@SO@p1+?)zeO^rEOqoO#Z>6pa&MjtG;4sir#(mfdOc!;DH` z@#YZ2!!iLv-AKt7yVDk6$*WyX{Q$ttC4^1S>1>pv9zkb%(n@ZS61 z^WtD7Y}+PoPY+KsPsda_n1F?&`^dYV2tq@jxP;(#OL%E(`AI%v%c)EA^%C@yDgly8=L65;t;3=Gapu3Qd zP~Eg+;KsisuyI`{T~_D-Pp#cj+S0V}c(1)4b!!}<)I9aEfmaJy3(IL|im`!*;IdR9 z6E|3Eiiuy+vjHo?JMYpXb~ltL@a@mGX9dsf?Sh6Z{Df?`>bX+7Fz|UN{B)=Ocd*Wm z@am0v)bNZ;`tAkPJMtDk`9-*y8tmG8Jx=A&fvvd64o9ZTsB0x_e&u%+>R#F97943r z{h9a4%sVDgcP7EnAf^m;YCNCUNhY8jU#20&57emDV8E*46? ztA<__`hz3q(;#5fi>o336a+Og<*I}=Ss(C*O-`-6Yb-|B(=FH^z0nDn+Jix&dM zhOEx{S3^*g3}tvE@?}$)pZ4BVfZ+MtdDQI(@x1?z>CYH~&+o4OFlT%&k@Br$e0#z7 zUy62tBr~?to!XR?1MjkXTA%iWLBM2)LtHG{#R+`QzJDD2c4V)QsIo!uQt)Cs>S=kG z?ph)YPJ+)`8Ll6{0Fn8?Y1i$TjK3N&_YAM?)LczWXx-uO2;av^N&KD`}j54>^G^MPc?q&HxBXV*I9iE*ktOzscWl zxdlEOb>U~eD1mp2=<8G)JqTEp3Oc=-2|>lLTVo3+z>m&nf6(!F5VGT7rtEqkcsH!* z*N@tO@7|E@;unh{D0hY9rr93wJ9s}f-%0>{Df1mCDCNQXi}~VO@Dv0d+}U!#DpA}dSCj$61?9pyPk2W248mPj+2kHAgHO4NcDyUeys1$8u!P5 z@3DpfC230Vp}LXnO{oZhVz2*cO6frG5j~Y6oZt98xTJJi^C*OHO=N5N-U08Wu@CHN zW#Fr8xC_@^n@U#%jR z2uvrympUSUXV?=6y5RX?@=Q8}T)Z;GwNnezAcM_Xdc6?x?)HQ3TW`UqO5>S&=vVN& zwSFb&4)Ui=CA680yMaHU(Sw|F3w(d(f6@$32R|9zOIgmg5bPoDwXI(YLWML=ZBi@& z@_SVbHy(u0tjK)_g_^)Ow5gTiV9Fc?CjRh+{TiF2OUmYj$0&R^WfAe){UR zUU)We!`n5y8A54v`XAhlfpGre_jc9TAFAokTnX}m@LLbZ55Ft{|Bw&PSIgK6K(6Ls)h;qLY$sp1fx5TadUu?$f!RQx>-Y$AT*kexY207UZ7 z|70YtLMZJD$9Co_2yWl_CdRypI(C)EbY;n?b0;;@EuIBYt(08bux=oH{9g-42N89t zVk602vS^o9J?VM|b*JX|)~!+?>gCKnKGTP2H+k>3JUzDeDRaG%hp=ti?(C%Ai~f8~ zH}WRY--Dk%#s&~Racln*(kA+w+F$fC2mK9*p3Aul;fDy;znjQtC$e9fp$hHJPANAe zV>{h-#}l0BFSKCik53T!l)8L}VE{zEVlgV`O+&kXBZR375dFe~QU~jJ!nVnKcsV}C zq36~6ZGFf3DK{P=6n~OhOixP`U0H)K=@Jb`0IxF zoZswevaIui@abGH+S$VpPOCIe6HkUPYOL;>JOPoutJMALJ`nX$nO@tw7Qz>A7t?ip zfatd)QY+EJ5Vrfo+b(xT2tT3Md5ID2-aq>FsW1b==g8yXal0U#{&(!GbuEM)`X_94 z9^ZfPqQS{a%n&uORG^do7Q+Aj@SZz53elfhq|J-*{qBpG47yJP;q1JgW|s#bs+Xg8 z_N6a`|H`Nfx6A?oAsl93*6^U**8?swFyznvayv|*A{W`L-h+X8$?f$ zOk~KJ5OzZSG85KGg^NZrQC#lFI^E2%^IUQeLAmdW0qYY8=ezNVaepU-$?7ir8t{O~ zhK`R9oXP z2>ZQh=o=?3E(kB${aZoa52CM=_P%GBfe1rQ&P!G=AUwEnCW<@=;dBwa8}wHo%8|QA z$;=yK_)U1oyQm;iZeQ+kWfq9tM!8dZkp{v#vpW=xav z*Q%1PkMCv9DPegVM6e!=8h-W?qRqQzv^Y{AHtoX4!`o~jD(Bmfy9L$*N;>6VwZu4( zlxp=hX#gUPt>yhsZ-bcM`kLhXDiFCcw_0%W8$|Rd#l7Nr1W}hyDDb97L9F@@rn{Hx zAi*d4WDcnYV(oO27n_S9p@os=;U3JR@Mmo3so?YNm#{rhio7g)y&{IQEyAi7ya~6H{!;ZiR=lupBEo^n|Wvn z(BI&}9Y=%F&NniZ!wCJk9IN?!4(%xPRz5AE-N``vwsCB~+R_?}`nz*aC7JRlAmOUy z>VqY9NL&$m_4A%K#0N>H8GTKIWbw>KQiUMeF|4E>Hi5WDH#0WI5wEsf{Y$oN8U3~E zWf&EqzbTyo-DQYbpgDH(_$Nq^2^HenUyk`DhK?SFX^0P@r+VCc3z8*-&$E%wL(KeD zQlj1u#Gmba;eOBs5`S?i82~%P2lL!CQ+0+oQ(hs$-*|}mNmn=!69x(LXRohXaYN$T ze2vVu8Hf*WO;nFslvO4}%F@pqU^+ghw86<5F@*ku!g829|y%`*LA^BQ^@)KHB+0(CQh8vu+wZt|bJqyS9@X&5#e|&Ii6fPYIB8=;gn) zt}76q+w^iV`YI%=1uYIS#6irzBZ^CD?GWb`ob$1wAChSJ+|pw4`K1|nNq@%tpi5WQ z_xeW=%W&twa>Obmn3Z4Sc#L)Q0;)2d6jTu3`ng0K_tTS2jY54yydn1BpJVwS^?!BIA9TlG;NrkEL326l4M|Uc(n7cw;t&2h6PkV?Z zMSK~fMSYVA!~NoqPC(Kqqu{iC3nVzL6!(6lf|MO82KQeML#*r3m2+>WAf7N2HLp4Z zN%^u-?*9%z0>O3H*uQ>=-_P$rr-eK$CY&xFjM|X+%wPGmaup=E%iYhX!QYmPE!#BC zK#D2x*##zhh})~O!;SJGxLC(9E^yS?_tm(~RBeyCmUV#ap8 zT|?VHL$ZerGy2(sXvd+Lf9)BzM=f~-utBn?p6~I)SJB@W3j_8nv|Cyz5%EB~uU}ioP(S2X+MVpCS|!YTKZqFC@i>V7HrZd?vV>%B)nOkpUXNOK z+4fU3^6fUHl&alx8ES6)Hwb+4w)C*LF(PtM+KjyL7IunMSHs+kox5E2!;GQq;rLi7rSsma?E|^ zzSTXD(##{Clz??+54sdp1)3q%3h7O*c0)@2;?Hj}A&^|ZV6DA^@7=^Lf>w$i(p*mY z__QB|RR5e3{muK3F2*a!6c7c;0Qr&rGcORr#zwG11JbkMBO^Z&M{gCpe zMk)1O3nZ@|Ryifi1F4=TcK?b;{q^+i@}Fn%e#wD%%tcrs{m!v4%LlZO+;4D&xJU~r zD}HYus7*jx@Wzey@yC!F|Gw8(2=_Ziy&M0O>qCmzac%R%c%Jgxy${@>;d9ZGEiR7kR?%Mu{?nKtcRQVn< z8y8Pr;aG>v?Tk+cIZ@xWx%!1UWgF_qAMz(QoJIbE9EH{r0mzg&-0?M3269yfrgw<) zLQaKaE3LpG$l8>7>u@h0b*bT--cd!=tv+4FQuP4!V~zF~*lM6|tfOklZEMt-om%}E z_8jfWXTDI$IA(zzj2dGEi;fldu^P>O&ska_n&?)g?8EJiX3FHon4@e z&K>=wwe=n3MSsJk)hxRp)7*;lCp+ri)_YZ+zeS1uTFy|DY0&QWR|hE_JZ_P-`Rr4) zJ8@E8e+2D#3>NG|uszx9aralmhrQ*wqv#45Qk~fv6nI{Xj)qARKG%kE>90{OkR?An zTJpIB?L^jMczYmyUgYE*BR{lbv7Vh&Lp$8aw|fBTbK%MRczdhMb{Zn)FA=w5KxdQCEeGR|Lk}z8R3EnksU$^cbY|=}kTK zJrC)>dLC!H17zANI*j~AyB2%8hDjbsUsllnPIbMyA*21(kMTT9NdG(U z;Fm0cb@$07Cxh!CLuc_qydxK6#^ilke2DiudE!#PfZY7GxX^ zp*P7$h0MUOy(a_PA!Cp$?$sbGWbCBs6%w5tPTI9pk%Avs}YON7O1S7*pP zJXSyY7T-rmyiij;N&)Xasi^sI12PEPUa;8IKqfiDC-|Q}WUL36wdJux2G@(|CuPcz zey{iKTLAGK7vW5aVTANc$DK~-HbF-4)uitR zlaRS!XuqU~I_j4Xm9mBsAj9yW@Z&#n_+FCzJLR@R=2;$f238x$db#gMeSt7!ag_hv z#%jm?su5U)~0~GcTs)*2}_XYNsjm%seri2 zhDslqPRL@qa7`s0_mjU4{rw)n2Dv5)YIGlsA$RXBW*T*R$c}8SApI?ceABNtt9P?Q zVLdamqO0g!LwJLByH1R%rlFnAn`FAb zkk$J;+t7^+nMoAl>lin(##66k-!ex#-@QT{tY|mf*2Z-M{b_x+P_sjSU1d{Bcwc>w zN6bx*quq^7`2%%mN0xlz_a56N2kO+V&|iUi>k%f%n&A1~sB;o>c$9nLDl=r)ks=2} zCDGp|OJyY1YbV`$HEeqqvOe?n4Ayp{zv;!*ay)OHEWg^I0{Z(fc>3@PWTxzBygh|+ zY?5f>6k-55yaT~GeBU6uLCXFtj|Jq?OCGT_qk_!jJI{hP@qWLgZ?rEzM7yJX$ZpBz zq5ZZ7S>K%Jn|yadW{K1Fs~U(?`OOl1TDlx^t|YIT*Azl_cf`aeyuVzo)A_4^@q1Lj z-}FV00kY;<=yrJ}L(U~5@(?%T;ob|IOI|n#SyOVxdV=2&w<|XE+2cE8Q#}fcT4{zH zZAuC?_BqI&eVO}Png?<({fpUWjd+{7)X1iW*N{zFGQcgd19DUb$2P9xdmCopTE33` zZSB|oMD25sIbTrgpdt*}XX*P)?o&ceAlLU3GY=q#vDunC9{ZosQ+lfvNyzLs1<&3r z$QI`6T`e4i9GiPlstp2=v+L$*Wf{C5hVKs+mBS%RYB4}*X9i?HdOqZkg5zaT)Q<6{ z8szvM7`yy22Xbo{=uar!gRJ8zefKGF+=fry{Ns`VISt-5M>`fEM=kaatJ^GO8?gF5 z!hP$k$=|l@cG%D7y^TZOXhUu(*>*?W*ECw|b*B`w*oBa)P76MOC(3e8?%) z3SBy>3HcRH?P8xwAlqN{oZSc1Z_T^-=jd=2ku%AnW@r$drABT=Pd)X8A^e z#Y->i`fmV<%+@vTg7}2}vd^b_bfECCkWk}|Bq$#KB%zP<@&cm&Rfz&UC@O!FuXh%4 z*Wb=(Nm{>xLbu;?LvQRM=fpv^Q*jiKd*PC8lihd7^FENnU*3kg@Z%f%x;-G@=D;;c zDja9Wmp@nuABNlqg1VoAJW)q};gi;>YiReX*Z9|EY^U2pHvNJAY~tv}M9^QbDqk>` z5qP^-Q;c~*-VKf6n&409&y-79O$_a%?2b>x<8ev9xGv)PyyXO9uHkdK!E9l09{b?~ zC>O)?ho8NPP(Q_fyrJwfy3cE2cfpAIJ%Lesq^(qjY&&)NjaPEe_S)7Yn(MfA}+MARkB2@7O2x8IX6E`HA8aDeNyPb&;_}kaNy!FxfsI za^)9NiRU^XFNI^$C1V2nvM282F2W05@VL{{t)BZb6e2zHZTI0rlFOeVMIs5v({{4`j%EZlo z9_=J1)%9clLT;>}wq*J;sN^0I7o zNZ;<^xZbftOa|j}S8?)H(`v|lTRt}Fhj=_)^9U1FxW^p|KK*KsvD-x61b^wi>&UN=9wXB9 zz!8eRe0=G88`#l9V&R@pVb7 zsybmB^11ns_e+%k>G5NWh@GB5vMc?vP%Q-onz126zfI8Y((TT18>~muRctF#LOYce z#Uov47dlrx_8i-Z9AZE4zAwG8VaV}LrdS`AX8J$N4k5xV-PayTAp=Za)m(azw8tquBnLfW@IXcODz!n*=B zAn&r`^PR8hAfMOc(s9|JK(eWE8FFv}lH-v=ji7f>aQBjV;ZfG-nk zF(;6$-`ajk{|6)o1|zA}49I_;>NDlc4tZB%$r?DX$rm_zY`8`pugi{e+ZEL7c3Jeg zHZ2SV_XyY6kIF!v%5oKyU8pw~n_T@r!Hu^d5 z$(AOMxY$n$_Hn5H8(#We$deJ{(>2aPp?t_kg?rEP3G9#GjfztSffUJb%f=S@Lap3( z3|KTmo@&W8T?KqjnQ4{2`xSxYYy3mEYZ6F-I_ouq_?=90$>d<0guKW5ABkHqL%up2 zn~OQVH&UdpQ`d7KmA1>YOfx{iv&l2v-pD(0e=&}Q{vPBv8y=%s#D0)ivwG${-ggG8 z_Wf#8$S*r6sT8aOc^UT%FJ?DEzVjq)IrmE-O&$CpF9m@*+=h-vaSQ!{86~<&UGM9P?ZoWq9NZ>j_o=D z-?z++2DSNPDCig)Ie_`Eg1Hg4-4Ta?^mXLrauwo%jQ3pB;l_SjnD||83~@huBRle= zkS9^}`anDVCKO4~Z9BKQ0i-0ZH~0LwfxMw<>#RwF!ZQc8?OMX2(EQxDZ4w(e-lboD zbNLEI^2%kt#anoz6`zs!ZpeG!9e;iV>urf27)+xHQ2bG7!0PH@Ag_yasr)vCV(FmC zHFg6iT0VL%pSlf-#aHBmZXkYH+n@jB8H^KQj0WNBd{9oIual;`2E~Kq_8B9@1HQhj z7tcovW!FR=eKnv$ekH4f2M@8oQCv3)u*dgX>nJ5v%?Jfk`9WEN=du1%`Tf_>RUkLb zH|85QqMd;LoN_c2Na#0de^^F4-_}@#i)eQ??DR0=wIwbypBrI9yVtMYxBW$b{Zuo} ziBK@j*J@k*7VWw%fAv@axmlxWn%stVfib)(h~t(RZl*bb>#M2Rvw=%)XcwA1T_%F< zX_BS3*MPLGwDt0g1d!^&DLCe6px_6;Me2$M_Je-aySWQMe!-DnfVfN2Ho~jjU*e(Q z(ieeWQIvSz!jpTt!qD#ax4g^eu>J0;`<>fB+ToG4!IKQ6`t{a_{Li3ZmXB9qa1O{U zQ_V-XASy4rjI0mHs;y*KMi-6Rs!|WTy2L-FAKVH;Aehfa<@4sj9 zy}VcDk)Fk|uF1`1@KHVWq=f5s{M!Rat* zAbqr)7yPvZWNJD}@vj0vCUo%Lc2fs(KS$HiU-}WC3METr z%~Gf+WJ%$z5VG^y@5?UaXpII&YZb-?##J!U-O)E z=3N2Kp6hXR@($Ri_L4AMcd@*`eR;HE3fPi|nja_N_;BZy`(ix+oNSL95AJ*bN@WSF ze+u7M``hO=q^je&|L#5Ie@cO4zHA~-;R|psHacxM@&(wb2OmyUcmk^@U`hYC)xbWT zp=c-c5I7$cdsg7@?3B{y#ir|?0hQF^eD=C9a?CDGZ!ta$M{CI7b{G1C+#{=6@8I8` zR}WhJc?#?wRfifca?pR(ZeQVN3mj=RrA_(nKy~x!DY{$+?#f#Ew)wY!tMzEZ!29RG z-o0P+tLHkPR%oQ9f2V*tCe1WoR|phW_U45*ZonzL#p3Zl0+fGTpfARQr2PKK7OBZLQv)oJch-5;P>;O`N=xjEpZsOdd@`3bl|lPdk87^l(A+w06F1zcYond=`4 z1!~T3OMqlL6#M#26spjmc!{ds^jeH-^jYo7I!{k1wKGyHRg#2~lJ9)<$X?(kCpdcr zYeI?3J25rdF(~f6p7qN16OZ+1354DsBL_Lw&{*;WxnU<8`(Sz;gt{3&p}pHvnb& zFyijY9Y7U!o|L}Wi+Y*rIfg5NbAG9|K{)1rAL`vdx&yz1Of!895_5rbZo=2=kS@Nz zjh-xx&O&=0dE3JT&|Z>9NIg|vvKSh`k(U|fA|@g&whCK zc1IZ{)Dx^a6sd%A`;?qpIBt(^@AmnP?~l*wBW$BO;C#)Ver$Rfs2wh1*5Sy>(`1uB zj$!uMjMY;@OrK4k=)h(4$N zxZ}(Y?i&-idlKV+UFPo+-4B$oT-DvTQ$V>kukwAD1k`=4c#CPAmuHpY6cg40C(Zj~ zR4C39-fD#eUX15=Z0!m^i~Aj+mthIEx=iF=sf>KIZ$dB|BXj%2P#^n zMn`QQP+f-f?cbTej{Y&!9g5?ndR^Uh)dLuBtiG?YYz0t3(p!e!Tm=rjzTiQW4X|G? z-FxEfGvFAVyLqHI0VwaLFVmI5KsC{pYsusM610A7|0EaK<&Pz@F-|n+k8$1tI|HD0 zPY>K)9|#n~-)3KRH~K-vJWt2*q6?b8BE_u7_&gQ`H; zy|R6+a1gi`UBt}W(}8<$=`k69w9Bq)$p7w*?=efUb{-kv>J58ZYGZs<-H*roXL0=> z@c2|mZ4pq@R-RJ4Gr+x?bn@54dOZJeHE#R(|Kg~vHA@b`ct~AxH!ohS$M1sqDGg$U zz!fiep_VR&@s!p!nRw*`_s?y&9pPF~Y*{bUT(}yzCDY;#e$r6lWMq60f6BwCEHF(4Q60mGiq9+^^ZGLG`@A+WQ1`GwvH$MYV(HjTK8vH?!1PIGZn90=6!(j zefzc5hH?Jv70znWl|=uzz)bl^8&CnCM^Esf-yb@d$i?3sx$`qdy(VzpT7Q|e)w>Q9 zF)si45ubCwy-1eQGSu6!>{C(>%4ODA*Wh|(Z}O1*Eu61~{#h4{(ccCJI7@4fqu!uY z`xQ~N*Z%1Zu|U1Ora^=Fd`OE7=Tjo;sVfKv^)+9VICkv02fV{(BqnktmqGXn$F_D$D4?C4wx(4IeL#hLAL_q@dgI|MOzXwb&uN-T zNyY)k@s+HV9QxxDhr_(K{Xj+astAeO0yR^s_OKaffi=9DxjVk1C+7`?A&D z^ntn@aiTI6?N91{kzR;$%R6<;<#d7LJ&-cbdjvQjEUomu1*lY;$B_(i>^GbExZIn- zl~7y9pyB$!?e@gLaT-ugW9!E_Yk<0un-uY35pa3l^mzO#!};TLW^3_j;M@puOo+nv z-+EnAso4Zn&3>u2gAXtsIY<6y*E`@UD)MNqIs}|cN6p6%qrbhPqiII)dD5Soe2XQ( z6>Xo{cM0dM-{LhIJW0T55v)jwKbqcuaHWxmSP6X}>fu)hRDB!-VRC-W==c!h_dLh<(1-Sh((I=+R-@UAq;2SUj zE<^qMnmAS9M&ISNVtfH^v%`tv%w@oJ-J`_Hl7wP;v09z_1HkQC?XvtR##QSXX;ATd z3nhk1+&VV?{_r&D+v|HZ7%yqnZ|UZXP)xnP^5g77DBfReu)BLL6f@O2eKR&f@w)M( zjMiZ&UHU9qxZx81KH>deXHy@PNiy6H@?spcbd!ol!vLlKEf~BFwHPO@XYj+5gHZZz zfxNpN#z&aZtJ7_0fl|*L=Oew}pyZKZfvoKsD0jE;-n;GvRH~_*8+dXU$`>hGiznWO zid{PXE2ku&VkT_-I{zN1;Iompe)iLVnf32`=tvBN#eNCcGo^bkdqG_3Bffdy%O|JT z%c-AwM#jgi+T$?`DJBLUc|m?W^KT{Q~GgB zMmU7UY3j$GIdw04-v9ZBdY)ZRT=t>8AIq*yIAFW>9`=tS!6#9mC|oE2^@ZM@DQ-o* z9g8eCIibBzhE1wA2F#3&yz(c{WBDT`^^ueR&mRAxMMvfxfUp^lxz=%PH`C8ob>3gJ zcRO8^w+Z!wwH(yk(O&J(L@hj@lDId=E-J@>nWD=ud?Ep1*GAK~UH1Ba_U2ojjb8B% z!e;HBYwucOz)UOe&|GQ;K1q*OOZ?u8`gWhRw|amtKNBY6m!f=wqvGEi2F!S8iN0l0 z5O!mSv6j}Z|7UMO>)6L!T?qTTeS6?a0Rv{z?jG@RDe$=|GvUvZ2VvJ&jFlgD0AGO{ z8#f&j0-yiB#hUz?HsD6~2%li+LD+v|qk1g@|IePtvcZ@g?;)IL@vjS!`3B4@DS2zB zM!_fTxlwspJA@?`xQ{Qz=OJ`rSg(-=J}IH(AnmU~)x~d5{|KFeuuT7z@BJScBpOPE zM?^0G-(_~P3${Fia6#EWL#Hnpl=J7gs(W4mpL`>oc@3cumRia8`S23(U820i?^p!* z+?mwTfAHL(!bn7UP~|X$m0W$}mlkPIY_@lsexEb=svR^G7%YMC;_-E9KjRvyCGaJU_hP0XK+7L<>QWn*5K2(uhrp#5`;BKQx`2oz}G}|>gh{U z@ab5rzdL_kUCDZ%hp`LlAzaaC;YM~+o#$9js?FeA@TF*LXCB^!@Cy|&yl&ogWlFPc zTTf_!@9GByZ@>FOIPV!Hk!M5T8(CS>_XWrET*0Ls(ckJ`6{l>A^1Bb=`R`A)eo?NY zjcnO_Am;%1IjDE0Z_9-6xt@CA6Gsgmow)fm(j*Dnsj>|1Re*5&#~qo~GvFtn;T(17 zD)=5AG*o)6X~6OMXS7K!2`*2^@2`&Z`M=Ni?7c0bC7O@mijaaJe^!?P*VWiR`p;CFDa@j-p9LBZnbptBzt5EOTv8d|w9p#@?b zPp=%7`+<2Aqm4|$Bq93c*4(cm53t<5#02v*;?Jhr)bLzv^ve~||7kN(-Y{V^U4ZgW zJv>g4SntuO$7baJUltkd+qePCb6%^P>0)^y?q=4a+}lqs>pUb}uzzsd0NZnFdJ!7Y z2?_1GuWop}h3Mvp1!uM#!t%xTlQLM(=}>zeen&<(OXWLiKZJyf;k=9FQGT4Ede_+n z5;~NU^tSgy^ee-8ea;P7Z}j;74f7$!x#o}b4?M@va-3i3g%~7+wQqVo5ehM`-kpA7 zQ;_gh;A3)Y2*yFHzp5fU2?>{&D}AD|zg*(^q$V^Vx^14Rz?N=Eh`huIQND?B5anE| zJq97+ecR^Qrx_6a{-vNo_iaeHvf+Ii&k2Y*Wl}yb^A1G6-F4scI<|NHty2G%We{^A zf8kK_A4ury;O=Trgy>;AKRufpkPy2;)n6_fVghJd*{fzDx^KOE-wLdkdrH$d?=Hlo z%Wph76$J@Dyri7I7(>hgD0tEh!tm3enTavOkr!LBf-czoYUV z5Yy?3S>*5F`Go90^Q2Bf%=Vht?H+i4<$5Kj`t%^CI%WR_)gXvbe4KZ<&mIy*3!FNt zK0&O5qrUJ07f7_Nj?K#6gy%YVJs-|JfrPIqlWHCpAXdh?=afz>#CS?Xm7Yn5#5|w3 zk6n2n?zq#PmZ}~|e7jw=VDCPNjd;SZu&e_T_ZlBQvxb7$?q2%@yL1d!@SG>256=yJ zHmhp2{DkKzMw|7T#3AY9l&hGQBwTYGcp*M40ZB$$uLL&KVO+P)dfV1gi1WUG{

g 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 DM#`Oa literal 1966313 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

F(4Ccq@InBxk(xF{lrr}=bGt?_y(lM;apC>}* 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

C1{^YUE|h-~m<6%SCN+^WS2?6F(-rD_EE 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%0D=7ut&#CEG>B~V^ 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 z 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 z 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 z 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