1#ifndef included_AMP_AMG_UTIL
2#define included_AMP_AMG_UTIL
9#include "AMP/matrices/CSRMatrix.h"
10#include "AMP/matrices/data/CSRMatrixData.h"
11#include "AMP/operators/LinearOperator.h"
12#include "AMP/operators/OperatorParameters.h"
16constexpr inline std::size_t
dynamic_extent = std::numeric_limits<std::size_t>::max();
17template<std::
size_t E>
20 [[nodiscard]]
constexpr std::size_t
value()
const {
return E; }
24 [[nodiscard]]
constexpr std::size_t
value()
const {
return e; }
29template<
class T, std::
size_t Extent = dynamic_extent>
42 static constexpr std::size_t
extent = Extent;
45 template<std::size_t E = Extent,
46 class =
typename std::enable_if_t<E == dynamic_extent || E == 0>>
73 [[nodiscard]]
constexpr bool empty() const noexcept {
return size() == 0; }
75 template<
size_type Count>
83 return {
data(), count };
86 template<
size_type Count>
89 return {
data() + (
size() - Count ), Count };
94 return {
data() + (
size() - count ), count };
100 if ( offset >=
size() )
101 return {
nullptr, 0 };
103 count =
size() - offset;
105 return {
data() + offset, count };
113template<
class A,
class T>
116template<
class Config,
class ColID>
124 using vector_type = std::vector<T, rebind_alloc<allocator_type, T>>;
131template<
class Config,
class ColID =
typename Config::l
idx_t>
154template<
class Config>
172template<
class Config>
178 auto cop = std::dynamic_pointer_cast<coarse_operator_parameters<Config>>( params );
182 cop->matrix.diag_extents,
183 cop->matrix.left_var,
184 cop->matrix.right_var ) );
188 std::shared_ptr<LinearAlgebra::CSRMatrix<Config>>
190 const std::array<typename Config::gidx_t, 2> diag_extents,
191 std::shared_ptr<LinearAlgebra::Variable> left_var,
192 std::shared_ptr<LinearAlgebra::Variable> right_var )
199 params.
d_cols = in.colind.data();
209 std::make_shared<LinearAlgebra::RawCSRMatrixParameters<Config>>( diag_extents[0],
219 return std::make_shared<LinearAlgebra::CSRMatrix<Config>>( params );
231template<
class Config>
241 using lidx_t =
typename csr_policy::lidx_t;
242 using gidx_t =
typename csr_policy::gidx_t;
250 auto diag()
const {
return csr_ptrs( *( data().getDiagMatrix() ) ); }
252 auto offd()
const {
return csr_ptrs( *( data().getOffdMatrix() ) ); }
254 [[nodiscard]]
bool has_offd()
const {
return data().hasOffDiag(); }
256 [[nodiscard]]
size_t numLocalRows()
const {
return ptr->numLocalRows(); }
260 [[nodiscard]]
size_t numGhosts()
const {
return data().getOffdMatrix()->numUniqueColumns(); }
264 auto &offd_mat = *( data().getOffdMatrix() );
265 if constexpr ( std::is_same_v<size_t, gidx_t> ) {
266 size_t *colmap = offd_mat.getColumnMap();
269 std::vector<size_t> colmap;
270 offd_mat.getColumnMap( colmap );
277 auto data = std::dynamic_pointer_cast<const csr_data_type>( ptr->getMatrixData() );
286 auto nrows = local_data.numLocalRows();
287 auto nnz = local_data.numberOfNonZeros();
288 auto [rowptr, ignore, colind, values] = local_data.getDataFields();
289 return std::make_tuple(
span<const lidx_t>{ rowptr,
static_cast<size_t>( nrows + 1 ) },
296template<
class Config>
300template<
class Config,
class ColID>
314 auto diag()
const {
return csr_ptrs( data.diag() ); }
316 auto offd()
const {
return csr_ptrs( data.offd() ); }
318 [[nodiscard]]
bool has_offd()
const {
return data.has_offd(); }
320 [[nodiscard]]
size_t numLocalRows()
const {
return data.diag().rowptr.size() - 1; }
332template<
class Config,
class ColID>
Provides C++ wrapper around MPI routines.
typename localmatrixdata_t::mask_t mask_t
An concrete class for dealing with dense serial matrices.
Abstraction of a discrete Vector in a linear simulation.
void getGhostValuesByGlobalID(int num, const size_t *indices, TYPE *vals) const
virtual void setMatrix(std::shared_ptr< AMP::LinearAlgebra::Matrix > in_mat)
LinearOperator()
Empty constructor.
virtual void setVariables(std::shared_ptr< AMP::LinearAlgebra::Variable > in, std::shared_ptr< AMP::LinearAlgebra::Variable > out)
OperatorParameters(std::shared_ptr< AMP::Database > db, std::shared_ptr< AMP::Mesh::Mesh > mesh=nullptr)
Operator(void)
Default constructor.
std::shared_ptr< AMP::Operator::Operator > shared_ptr
std::shared_ptr< ParameterBase > shared_ptr
#define AMP_DEBUG_ASSERT(EXP)
Assert error (debug only)
#define AMP_INSIST(EXP, MSG)
Insist error.
constexpr std::size_t dynamic_extent
typename std::allocator_traits< A >::template rebind_alloc< T > rebind_alloc
typename Config::gidx_t gidx_t
std::shared_ptr< LinearAlgebra::Variable > right_var
std::shared_ptr< LinearAlgebra::Variable > left_var
std::array< gidx_t, 2 > diag_extents
coarse_operator_parameters()
coarse_matrix< C > matrix
coarse_operator(std::shared_ptr< AMP::Operator::OperatorParameters > params)
std::shared_ptr< LinearAlgebra::CSRMatrix< Config > > create_matrix(const AMP_MPI &comm, const std::array< typename Config::gidx_t, 2 > diag_extents, std::shared_ptr< LinearAlgebra::Variable > left_var, std::shared_ptr< LinearAlgebra::Variable > right_var)
const auto & data() const
typename csr_policy::lidx_t lidx_t
void getGhostValues(const LinearAlgebra::Vector &vec, scalar_t *dst) const
typename Config::allocator_type allocator_type
typename csr_policy::gidx_t gidx_t
typename std::tuple< span< const lidx_t >, span< const lidx_t >, span< const scalar_t > > csr_ptrs_t
csr_ptrs_t csr_ptrs(const T &local_data) const
typename csr_policy::scalar_t scalar_t
size_t numLocalRows() const
typename csr_data_type::mask_t mask_t
size_t numGlobalRows() const
size_t numLocalRows() const
typename Config::scalar_t scalar_t
typename std::tuple< span< const lidx_t >, span< const lidx_t >, span< const scalar_t > > csr_ptrs_t
typename csr_data_type::mask_t mask_t
typename Config::allocator_type allocator_type
typename Config::lidx_t lidx_t
csr_ptrs_t csr_ptrs(const typename value_type::seq_type &v) const
constexpr std::size_t value() const
extent_storage(std::size_t)
constexpr std::size_t value() const
typename Config::allocator_type allocator_type
const seq_type & diag() const
std::shared_ptr< seq_type > d_diag
std::shared_ptr< seq_type > d_offd
const seq_type & offd() const
seq_csr< Config, typename Config::gidx_t > seq_type
typename Config::lidx_t lidx_t
typename Config::scalar_t scalar_t
typename Config::allocator_type allocator_type
vector_type< scalar_t > values
typename Config::lidx_t lidx_t
typename Config::scalar_t scalar_t
std::vector< T, rebind_alloc< allocator_type, T > > vector_type
vector_type< col_idx_t > colind
vector_type< lidx_t > rowptr
constexpr reference back() const
constexpr pointer data() const noexcept
constexpr iterator begin() const noexcept
constexpr iterator end() const noexcept
extent_storage< Extent > ext
constexpr bool empty() const noexcept
constexpr size_type size() const noexcept
constexpr span< T, dynamic_extent > subspan(size_t offset, size_t count=dynamic_extent) const noexcept
constexpr span< T, dynamic_extent > last(size_type count) const noexcept
constexpr reference operator[](size_type idx) const
constexpr size_type size_bytes() const noexcept
typename std::remove_cv_t< T > value_type
constexpr reverse_iterator rend() const noexcept
const T & const_reference
std::reverse_iterator< iterator > reverse_iterator
std::ptrdiff_t difference_type
static constexpr std::size_t extent
constexpr reference front() const
constexpr span< T, dynamic_extent > first(size_type count) const noexcept
constexpr span< T, Count > last() const noexcept
constexpr reverse_iterator rbegin() const noexcept
constexpr span< T, Count > first() const noexcept
constexpr span(pointer p, size_type s)