diff --git a/.github/workflows/hypre.yml b/.github/workflows/hypre.yml index 79fb36bdf15..a2b97771302 100644 --- a/.github/workflows/hypre.yml +++ b/.github/workflows/hypre.yml @@ -135,10 +135,10 @@ jobs: ccache-${{ github.workflow }}-${{ github.job }}-git- - name: Build Hypre run: | - wget -q https://github.com/hypre-space/hypre/archive/refs/tags/v2.28.0.tar.gz - tar xfz v2.28.0.tar.gz - cd hypre-2.28.0/src - ./configure --with-cxxstandard=17 + wget -q https://github.com/hypre-space/hypre/archive/refs/tags/v2.32.0.tar.gz + tar xfz v2.32.0.tar.gz + cd hypre-2.32.0/src + ./configure --with-cxxstandard=17 --enable-bigint make -j 4 make install cd ../../ @@ -151,7 +151,7 @@ jobs: export CCACHE_LOGFILE=${{ github.workspace }}/ccache.log.txt ccache -z - export AMREX_HYPRE_HOME=${PWD}/hypre-2.28.0/src/hypre + export AMREX_HYPRE_HOME=${PWD}/hypre-2.32.0/src/hypre cd Tests/LinearSolvers/Hypre make -j4 USE_MPI=TRUE USE_HYPRE=TRUE DIM=2 CCACHE=ccache mpiexec -n 2 ./main2d.gnu.MPI.ex inputs.2d diff --git a/Src/Extern/HYPRE/AMReX_HypreSolver.H b/Src/Extern/HYPRE/AMReX_HypreSolver.H index fb70c90bbbe..39775a4379d 100644 --- a/Src/Extern/HYPRE/AMReX_HypreSolver.H +++ b/Src/Extern/HYPRE/AMReX_HypreSolver.H @@ -108,6 +108,7 @@ public: #endif fill_local_id (Marker const& marker); + template void fill_global_id (); template ::HypreSolver (Vector const& a_index_type, } AMREX_ASSERT(proc_end == proc_begin + m_nrows_proc); - fill_global_id(); + // To generate global ids for Hypre, we need to remove duplicates on + // nodes shared by multiple Boxes with OverrideSync. So we need to use + // a type that supports atomicAdd. HYPRE_Int is either int or long + // long. The latter does not have native atomicAdd support in CUDA/HIP. + using AtomicInt = std::conditional_t; + fill_global_id(); // Create and initialize A, b & x HYPRE_Int ilower = proc_begin; @@ -366,21 +373,16 @@ HypreSolver::fill_local_id (Marker const& marker) } template +template void HypreSolver::fill_global_id () { BL_PROFILE("HypreSolver::fill_global_id()"); - // To generate global ids for Hypre, we need to remove duplicates on - // nodes shared by multiple Boxes with OverrideSync. So we need to use - // a type that supports atomicAdd. HYPRE_Int is either int or long - // long. The latter does not have native atomicAdd support in CUDA/HIP. - using AtomicInt = std::conditional_t; + Vector>> global_id_raii; + Vector>*> p_global_id; - Vector>> global_id_raii; - Vector>*> p_global_id; - if constexpr (std::is_same()) { + if constexpr (std::is_same_v) { for (int ivar = 0; ivar < m_nvars; ++ivar) { p_global_id.push_back(&(m_global_id[ivar])); } @@ -405,7 +407,7 @@ HypreSolver::fill_global_id () HYPRE_Int const os = m_id_offset[ivar][mfi]; Box bx = mfi.validbox(); bx.convert(m_index_type[ivar]).grow(m_nghost); - Array4 const& gid = p_global_id[ivar]->array(mfi); + Array4 const& gid = p_global_id[ivar]->array(mfi); auto const& lid = m_local_id[ivar].const_array(mfi); HYPRE_Int* rows = rows_vec.data() + nrows; nrows += m_nrows_grid[ivar][mfi]; @@ -414,9 +416,9 @@ HypreSolver::fill_global_id () if (lid.contains(i,j,k) && lid(i,j,k) >= 0) { const auto id = lid(i,j,k) + os; rows[lid(i,j,k)] = id; - gid(i,j,k) = static_cast(id); + gid(i,j,k) = static_cast(id); } else { - gid(i,j,k) = static_cast + gid(i,j,k) = static_cast (std::numeric_limits::max()); } }); @@ -428,7 +430,7 @@ HypreSolver::fill_global_id () m_geom.periodicity()); p_global_id[ivar]->FillBoundary(m_geom.periodicity()); - if constexpr (!std::is_same()) { + if constexpr (!std::is_same()) { auto const& dst = m_global_id[ivar].arrays(); auto const& src = p_global_id[ivar]->const_arrays(); amrex::ParallelFor(m_global_id[ivar], m_global_id[ivar].nGrowVect(),