20#ifndef OPM_HYPRE_CPU_TRANSFERS_HPP
21#define OPM_HYPRE_CPU_TRANSFERS_HPP
23#include <opm/simulators/linalg/gpuistl/hypreinterface/HypreDataStructures.hpp>
24#include <opm/simulators/linalg/gpuistl/hypreinterface/HypreErrorHandling.hpp>
27#include <_hypre_utilities.h>
35 template <
typename VectorType>
38 std::vector<HYPRE_Real>& continuous_vector_values,
39 const std::vector<int>& local_hypre_to_local_dune)
42 for (
size_t i = 0; i < local_hypre_to_local_dune.size(); ++i) {
43 continuous_vector_values[i] = v[local_hypre_to_local_dune[i]][0];
50 template <
typename VectorType>
53 const std::vector<HYPRE_Real>& continuous_vector_values,
54 const std::vector<int>& local_hypre_to_local_dune)
57 for (
size_t i = 0; i < local_hypre_to_local_dune.size(); ++i) {
58 v[local_hypre_to_local_dune[i]][0] = continuous_vector_values[i];
65template <
typename VectorType>
68 HYPRE_IJVector hypre_vec,
71 const ParallelInfo& par_info,
74 const int N =
static_cast<int>(host_arrays.
indices.size());
75 using T =
typename VectorType::field_type;
77 if (use_gpu_backend) {
78#if HYPRE_USING_CUDA || HYPRE_USING_HIP
82 const T* values = &(cpu_vec[0][0]);
84 device_arrays.vector_buffer_device, values, HYPRE_Real, N, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST);
85 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(
86 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
91 hypre_TMemcpy(device_arrays.vector_buffer_device,
97 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(
98 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
105 const T* values = &(cpu_vec[0][0]);
107 HYPRE_IJVectorSetValues(hypre_vec, N,
const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()), values));
112 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(hypre_vec,
114 const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()),
119 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorAssemble(hypre_vec));
125template <
typename VectorType>
131 const ParallelInfo& par_info,
132 bool use_gpu_backend)
134 const int N =
static_cast<int>(host_arrays.
indices.size());
135 using T =
typename VectorType::field_type;
137 if (use_gpu_backend) {
138#if HYPRE_USING_CUDA || HYPRE_USING_HIP
142 T* values = &(cpu_vec[0][0]);
143 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(
144 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
146 values, device_arrays.vector_buffer_device, HYPRE_Real, N, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
149 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(
150 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
152 device_arrays.vector_buffer_device,
156 HYPRE_MEMORY_DEVICE);
165 T* values = &(cpu_vec[0][0]);
167 HYPRE_IJVectorGetValues(hypre_vec, N,
const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()), values));
170 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(hypre_vec,
172 const_cast<HYPRE_BigInt*
>(host_arrays.
indices.data()),
185template <
typename MatrixType>
188 HYPRE_IJMatrix hypre_matrix,
189 const SparsityPattern& sparsity_pattern,
192 bool use_gpu_backend)
194 const auto N = sparsity_pattern.
rows.size();
196 using T =
typename MatrixType::field_type;
197 const T* values = &(cpu_matrix[0][0][0][0]);
199 if (use_gpu_backend) {
200#if HYPRE_USING_CUDA || HYPRE_USING_HIP
201 const auto nnz = cpu_matrix.nonzeroes();
203 device_arrays.matrix_buffer_device, values, HYPRE_Real, nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST);
204 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixSetValues2(hypre_matrix,
206 device_arrays.ncols_device,
207 device_arrays.rows_device,
208 device_arrays.row_indexes_device,
209 device_arrays.cols_device,
210 device_arrays.matrix_buffer_device));
213 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixSetValues2(hypre_matrix,
215 const_cast<HYPRE_Int*
>(sparsity_pattern.
ncols.data()),
216 const_cast<HYPRE_BigInt*
>(sparsity_pattern.
rows.data()),
217 const_cast<HYPRE_Int*
>(host_arrays.
row_indexes.data()),
218 const_cast<HYPRE_BigInt*
>(sparsity_pattern.
cols.data()),
222 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixAssemble(hypre_matrix));
Unified interface for Hypre operations with both CPU and GPU data structures.
Definition HypreInterface.hpp:61
void transferCpuVectorToHypre(const VectorType &cpu_vec, HYPRE_IJVector hypre_vec, HypreHostDataArrays &host_arrays, const HypreDeviceDataArrays &device_arrays, const ParallelInfo &par_info, bool use_gpu_backend)
Transfer CPU vector to Hypre vector.
Definition HypreCpuTransfers.hpp:67
void setDuneVectorFromContinuousVector(VectorType &v, const std::vector< HYPRE_Real > &continuous_vector_values, const std::vector< int > &local_hypre_to_local_dune)
Distribute HYPRE vector values back to original vector positions.
Definition HypreCpuTransfers.hpp:52
void transferHypreToCpuVector(HYPRE_IJVector hypre_vec, VectorType &cpu_vec, HypreHostDataArrays &host_arrays, const HypreDeviceDataArrays &device_arrays, const ParallelInfo &par_info, bool use_gpu_backend)
Transfer Hypre vector to CPU vector.
Definition HypreCpuTransfers.hpp:127
void updateMatrixFromCpuMatrix(const MatrixType &cpu_matrix, HYPRE_IJMatrix hypre_matrix, const SparsityPattern &sparsity_pattern, const HypreHostDataArrays &host_arrays, const HypreDeviceDataArrays &device_arrays, bool use_gpu_backend)
Update Hypre matrix from CPU matrix Uses HYPRE_IJMatrixSetValues2 with pre-computed row_indexes,...
Definition HypreCpuTransfers.hpp:187
void setContinuousVectorForHypre(const VectorType &v, std::vector< HYPRE_Real > &continuous_vector_values, const std::vector< int > &local_hypre_to_local_dune)
Extract owned vector values in the order expected by HYPRE.
Definition HypreCpuTransfers.hpp:37
GPU device memory arrays for HYPRE operations with GPU backend.
Definition HypreDataStructures.hpp:137
Host arrays for HYPRE matrix and vector data transfers.
Definition HypreDataStructures.hpp:106
std::vector< HYPRE_BigInt > indices
Global DOF indices for owned degrees of freedom.
Definition HypreDataStructures.hpp:120
std::vector< HYPRE_Real > continuous_vector_values
Temporary buffer for vector values in non-owner-first ordering.
Definition HypreDataStructures.hpp:128
std::vector< HYPRE_Int > row_indexes
Pre-computed row start indexes for HYPRE_IJMatrixSetValues2.
Definition HypreDataStructures.hpp:113
bool owner_first
Whether owned DOFs appear first in local Dune ordering.
Definition HypreDataStructures.hpp:77
std::vector< int > local_hypre_to_local_dune
Mapping from local HYPRE indices to local Dune indices.
Definition HypreDataStructures.hpp:59
std::vector< HYPRE_BigInt > rows
Global row indices for owned rows (size: N_owned).
Definition HypreDataStructures.hpp:91
std::vector< HYPRE_Int > ncols
Non-zero entries per owned row (size: N_owned).
Definition HypreDataStructures.hpp:88
std::vector< HYPRE_BigInt > cols
Global column indices in CSR format (size: nnz).
Definition HypreDataStructures.hpp:94