1#ifndef AMREX_ALG_VECTOR_H_
2#define AMREX_ALG_VECTOR_H_
3#include <AMReX_Config.H>
18template <
typename T,
typename Allocator = DefaultAllocator<T> >
42 [[nodiscard]]
bool empty ()
const {
return m_partition.
empty(); }
56 [[nodiscard]] T
const*
data ()
const {
return m_data.
data(); }
59 [[nodiscard]] T *
data () {
return m_data.
data(); }
127 [[nodiscard]] T
sum (
bool local =
false)
const;
139 [[nodiscard]] T
norminf (
bool local =
false)
const;
151 [[nodiscard]] T
norm1 (
bool local =
false)
const;
163 [[nodiscard]] T
norm2 (
bool local =
false)
const;
175 [[nodiscard]] std::pair<T,T>
norm1and2 (
bool local =
false)
const;
177 template <
typename FAB,
178 std::enable_if_t<amrex::IsBaseFab<FAB>::value &&
179 std::is_same_v<T,typename FAB::value_type>,
int> = 0>
182 template <
typename FAB,
183 std::enable_if_t<amrex::IsBaseFab<FAB>::value &&
184 std::is_same_v<T,typename FAB::value_type>,
int> = 0>
211template <
typename T,
typename Allocator>
213 : m_partition(global_size),
214 m_begin(m_partition[ParallelDescriptor::MyProc()]),
215 m_end(m_partition[ParallelDescriptor::MyProc()+1]),
216 m_data(m_end-m_begin)
219template <
typename T,
typename Allocator>
221 : m_partition(std::move(partition)),
222 m_begin(m_partition[ParallelDescriptor::MyProc()]),
223 m_end(m_partition[ParallelDescriptor::MyProc()+1]),
224 m_data(m_end-m_begin)
227template <
typename T,
typename Allocator>
230 m_partition.define(global_size);
233 m_data.resize(m_end-m_begin);
236template <
typename T,
typename Allocator>
239 m_partition = std::move(partition);
242 m_data.resize(m_end-m_begin);
245template <
typename T,
typename Allocator>
252template <
typename T,
typename Allocator>
255 Long n = m_data.size();
256 T* p = m_data.data();
260template <
typename T,
typename Allocator>
267template <
typename T,
typename Allocator>
270 Long n = m_data.size();
272 T* dst = m_data.data();
273 T
const* src = rhs.
data();
277template <
typename T,
typename Allocator>
284template <
typename T,
typename Allocator>
287 Long n = m_data.size();
289 T* dst = m_data.data();
290 T
const* src = rhs.
data();
294template <
typename T,
typename Allocator>
297 scaleAsync(scale_factor);
301template <
typename T,
typename Allocator>
304 Long n = m_data.size();
305 T* p = m_data.data();
309template <
typename T,
typename Allocator>
312 Long n = m_data.size();
313 T
const* p = m_data.data();
324template <
typename T,
typename Allocator>
327 Long n = m_data.size();
328 T
const* p = m_data.data();
331 return amrex::Math::abs(p[i]);
339template <
typename T,
typename Allocator>
342 Long n = m_data.size();
343 T
const* p = m_data.data();
346 return amrex::Math::abs(p[i]);
354template <
typename T,
typename Allocator>
357 Long n = m_data.size();
358 T
const* p = m_data.data();
369template <
typename T,
typename Allocator>
372 Long n = m_data.size();
373 T
const* p = m_data.data();
376 using ReduceTuple =
typename decltype(reduce_data)::Type;
379 return {amrex::Math::abs(p[i]), p[i]*p[i]};
381 auto hv = reduce_data.
value(reduce_op);
383 return std::make_pair(amrex::get<0>(hv), std::sqrt(amrex::get<1>(hv)));
385 std::array<T,2> a{amrex::get<0>(hv), amrex::get<1>(hv)};
387 return std::make_pair(a[0], std::sqrt(a[1]));
391template <
typename T,
typename Allocator>
392template <typename FAB, std::enable_if_t<amrex::IsBaseFab<FAB>::value &&
393 std::is_same_v<T,typename FAB::value_type>,
int> >
399 T* p = m_data.data();
402 p += mfi.validbox().numPts();
405#if defined(AMREX_USE_OMP) && !defined(AMREX_USE_GPU)
409 fa[mfi].template copyToMem<RunOn::Device>(mfi.validbox(), 0, 1, dptrs[mfi]);
413template <
typename T,
typename Allocator>
414template <typename FAB, std::enable_if_t<amrex::IsBaseFab<FAB>::value &&
415 std::is_same_v<T,typename FAB::value_type>,
int> >
421 T
const* p = m_data.data();
424 p += mfi.validbox().numPts();
427#if defined(AMREX_USE_OMP) && !defined(AMREX_USE_GPU)
431 fa[mfi].template copyFromMem<RunOn::Device>(mfi.validbox(), 0, 1, dptrs[mfi]);
435template <
typename T,
typename Allocator>
439 ofs << m_begin <<
" " << m_end <<
"\n";
444 T
const* p = hv.
data();
446 T
const* p = m_data.data();
448 for (
Long i = 0, N = m_data.size(); i < N; ++i) {
449 ofs << i+m_begin <<
" " << p[i] <<
"\n";
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
Definition AMReX_AlgPartition.H:14
Long numGlobalRows() const
Definition AMReX_AlgPartition.H:28
bool empty() const
Definition AMReX_AlgPartition.H:25
Definition AMReX_AlgVector.H:20
void setVal(T val)
Definition AMReX_AlgVector.H:246
Long numLocalRows() const
Definition AMReX_AlgVector.H:46
T norminf(bool local=false) const
Return the infinity norm.
Definition AMReX_AlgVector.H:325
Table1D< T, Long > view()
Definition AMReX_AlgVector.H:81
AlgPartition const & partition() const
Definition AMReX_AlgVector.H:44
void copy(AlgVector< T, Allocator > const &rhs)
Definition AMReX_AlgVector.H:261
Table1D< T const, Long > const_view() const
Definition AMReX_AlgVector.H:73
void setValAsync(T val)
Definition AMReX_AlgVector.H:253
Long globalBegin() const
Inclusive global index begin.
Definition AMReX_AlgVector.H:50
bool empty() const
Definition AMReX_AlgVector.H:42
std::pair< T, T > norm1and2(bool local=false) const
Return the 1-norm and 2-norm as a pair.
Definition AMReX_AlgVector.H:370
T const * data() const
Definition AMReX_AlgVector.H:56
AlgVector(AlgPartition partition)
Definition AMReX_AlgVector.H:220
AlgVector(AlgVector< T, Allocator > &&) noexcept=default
void plusAsync(AlgVector< T, Allocator > const &rhs)
Definition AMReX_AlgVector.H:285
void scale(T scale_factor)
Definition AMReX_AlgVector.H:295
AlgVector(Long global_size)
Definition AMReX_AlgVector.H:212
Long globalEnd() const
Exclusive global index end.
Definition AMReX_AlgVector.H:52
void copyFrom(FabArray< FAB > const &fa)
Definition AMReX_AlgVector.H:394
T * data()
Definition AMReX_AlgVector.H:59
Long numGlobalRows() const
Definition AMReX_AlgVector.H:47
T norm2(bool local=false) const
Return the 2-norm.
Definition AMReX_AlgVector.H:355
AlgVector & operator=(AlgVector< T, Allocator > const &)=delete
void copyAsync(AlgVector< T, Allocator > const &rhs)
Definition AMReX_AlgVector.H:268
void define(Long global_size)
Definition AMReX_AlgVector.H:228
void scaleAsync(T scale_factor)
Definition AMReX_AlgVector.H:302
AlgVector(AlgVector< T, Allocator > const &)=delete
void plus(AlgVector< T, Allocator > const &rhs)
Definition AMReX_AlgVector.H:278
T sum(bool local=false) const
Return the sum of elements.
Definition AMReX_AlgVector.H:310
Table1D< T const, Long > view() const
Definition AMReX_AlgVector.H:65
Allocator allocator_type
Definition AMReX_AlgVector.H:23
void copyTo(FabArray< FAB > &fa) const
Definition AMReX_AlgVector.H:416
T norm1(bool local=false) const
Return the 1-norm.
Definition AMReX_AlgVector.H:340
T value_type
Definition AMReX_AlgVector.H:22
void printToFile(std::string const &file) const
Definition AMReX_AlgVector.H:436
bool is_cell_centered() const noexcept
This tests on whether the FabArray is cell-centered.
Definition AMReX_FabArrayBase.cpp:2701
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:131
const BoxArray & boxArray() const noexcept
Return a constant reference to the BoxArray that defines the valid region associated with this FabArr...
Definition AMReX_FabArrayBase.H:95
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:347
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:85
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:169
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
size_type size() const noexcept
Definition AMReX_PODVector.H:648
T * data() noexcept
Definition AMReX_PODVector.H:666
Definition AMReX_Reduce.H:257
Type value()
Definition AMReX_Reduce.H:289
Definition AMReX_Reduce.H:389
std::enable_if_t< IsFabArray< MF >::value > eval(MF const &mf, IntVect const &nghost, D &reduce_data, F &&f)
Definition AMReX_Reduce.H:458
amrex_long Long
Definition AMReX_INT.H:30
void ParallelForOMP(T n, L const &f) noexcept
Performance-portable kernel launch function with optional OpenMP threading.
Definition AMReX_GpuLaunch.H:243
int MyProc() noexcept
Definition AMReX_ParallelDescriptor.H:128
void Sum(T &v, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:221
void Max(KeyValuePair< K, V > &vi, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:133
void dtod_memcpy_async(void *p_d_dst, const void *p_d_src, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:329
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:315
MPI_Comm CommunicatorSub() noexcept
sub-communicator for current frame
Definition AMReX_ParallelContext.H:70
Definition AMReX_Amr.cpp:49
Definition AMReX_TableData.H:20