20 #ifndef OPM_HYPRE_CPU_TRANSFERS_GPU_HPP 21 #define OPM_HYPRE_CPU_TRANSFERS_GPU_HPP 23 #include <opm/simulators/linalg/hypreinterface/HypreDataStructures.hpp> 24 #include <opm/simulators/linalg/hypreinterface/HypreErrorHandling.hpp> 27 #include <_hypre_utilities.h> 35 template <
typename VectorType>
37 setContinuousVectorForHypre(
const VectorType& v,
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>
52 setDuneVectorFromContinuousVector(VectorType& v,
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];
65 template <
typename VectorType>
67 transferCpuVectorToHypre(
const VectorType& cpu_vec,
68 HYPRE_IJVector hypre_vec,
69 linalg::HypreInterface::HostDataArrays& host_arrays,
70 const linalg::HypreInterface::DeviceDataArrays& device_arrays,
71 const linalg::HypreInterface::ParallelInfo& par_info)
73 const int N =
static_cast<int>(host_arrays.indices.size());
74 using T =
typename VectorType::field_type;
77 if (par_info.owner_first) {
79 const T* values = &(cpu_vec[0][0]);
81 device_arrays.vector_buffer_device, values, HYPRE_Real, N, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST);
82 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(
83 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
86 setContinuousVectorForHypre(
87 cpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
88 hypre_TMemcpy(device_arrays.vector_buffer_device,
89 host_arrays.continuous_vector_values.data(),
94 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorSetValues(
95 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
102 template <
typename VectorType>
104 transferHypreToCpuVector(HYPRE_IJVector hypre_vec,
106 linalg::HypreInterface::HostDataArrays& host_arrays,
107 const linalg::HypreInterface::DeviceDataArrays& device_arrays,
108 const linalg::HypreInterface::ParallelInfo& par_info)
110 const int N =
static_cast<int>(host_arrays.indices.size());
111 using T =
typename VectorType::field_type;
114 if (par_info.owner_first) {
116 T* values = &(cpu_vec[0][0]);
117 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(
118 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
120 values, device_arrays.vector_buffer_device, HYPRE_Real, N, HYPRE_MEMORY_HOST, HYPRE_MEMORY_DEVICE);
123 OPM_HYPRE_SAFE_CALL(HYPRE_IJVectorGetValues(
124 hypre_vec, N, device_arrays.indices_device, device_arrays.vector_buffer_device));
125 hypre_TMemcpy(host_arrays.continuous_vector_values.data(),
126 device_arrays.vector_buffer_device,
130 HYPRE_MEMORY_DEVICE);
131 setDuneVectorFromContinuousVector(
132 cpu_vec, host_arrays.continuous_vector_values, par_info.local_hypre_to_local_dune);
141 template <
typename MatrixType>
143 updateMatrixFromCpuMatrix(
const MatrixType& cpu_matrix,
144 HYPRE_IJMatrix hypre_matrix,
145 const linalg::HypreInterface::SparsityPattern& sparsity_pattern,
146 const linalg::HypreInterface::DeviceDataArrays& device_arrays)
148 const auto N = sparsity_pattern.rows.size();
150 using T =
typename MatrixType::field_type;
151 const T* values = &(cpu_matrix[0][0][0][0]);
153 const auto nnz = cpu_matrix.nonzeroes();
155 device_arrays.matrix_buffer_device, values, HYPRE_Real, nnz, HYPRE_MEMORY_DEVICE, HYPRE_MEMORY_HOST);
156 OPM_HYPRE_SAFE_CALL(HYPRE_IJMatrixSetValues2(hypre_matrix,
158 device_arrays.ncols_device,
159 device_arrays.rows_device,
160 device_arrays.row_indexes_device,
161 device_arrays.cols_device,
162 device_arrays.matrix_buffer_device));
167 #endif // OPM_HYPRE_CPU_TRANSFERS_GPU_HPP Definition: HypreCpuTransfers.hpp:29