Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_LayoutData.H
Go to the documentation of this file.
1#ifndef AMREX_LayoutData_H_
2#define AMREX_LayoutData_H_
3#include <AMReX_Config.H>
4
6#include <AMReX_MFIter.H>
7
8namespace amrex
9{
11template <class T>
13{
14public:
15
16 LayoutData() = default;
17
18 LayoutData(const BoxArray & a_grids,
19 const DistributionMapping & a_dm)
20 {
21 define(a_grids, a_dm);
22 }
23
24 void define(const BoxArray & a_grids,
25 const DistributionMapping & a_dm)
26 {
27 clear();
28 FabArrayBase::define(a_grids, a_dm, 1, 0);
29 m_need_to_clear_bd = true;
30 addThisBD();
31 m_data.resize(local_size());
32 }
33
34 void clear ()
35 {
36 m_data.clear();
37 if (m_need_to_clear_bd) { clearThisBD(); }
38 m_need_to_clear_bd = false;
40 }
41
42 ~LayoutData () { if (m_need_to_clear_bd) { clearThisBD(); } }
43
44 LayoutData (const LayoutData& rhs) noexcept
45 : FabArrayBase(rhs),
46 m_data(rhs.m_data),
47 m_need_to_clear_bd(rhs.m_need_to_clear_bd)
48 {
49 if (m_need_to_clear_bd) { addThisBD(); }
50 }
51
52 LayoutData (LayoutData&& rhs) noexcept
53 : FabArrayBase(static_cast<FabArrayBase&&>(rhs)),
54 m_data(std::move(rhs.m_data)),
55 m_need_to_clear_bd(rhs.m_need_to_clear_bd)
56 {
57 rhs.m_need_to_clear_bd = false;
58 }
59
60 LayoutData& operator= (const LayoutData& rhs) noexcept
61 {
62 if (&rhs != this)
63 {
64 m_data.clear();
65 if (m_need_to_clear_bd) { clearThisBD(); }
66
68 m_data = rhs.m_data;
69 m_need_to_clear_bd = rhs.m_need_to_clear_bd;
70
71 if (m_need_to_clear_bd) { addThisBD(); }
72 }
73 return *this;
74 }
75
77 {
78 if (&rhs != this)
79 {
80 m_data.clear();
81 if (m_need_to_clear_bd) { clearThisBD(); }
82
83 FabArrayBase::operator=(static_cast<FabArrayBase&&>(rhs));
84 m_data = std::move(rhs.m_data);
85 m_need_to_clear_bd = rhs.m_need_to_clear_bd;
86
87 rhs.m_need_to_clear_bd = false;
88 }
89 return *this;
90 }
91
92 T& operator[](const MFIter& a_mfi) noexcept
93 {
94 int local_index = a_mfi.LocalIndex();
95 BL_ASSERT(local_index >= 0 && local_index < m_data.size() &&
96 DistributionMap() == a_mfi.DistributionMap());
97 return m_data[local_index];
98 }
99
100
101 const T& operator[](const MFIter& a_mfi) const noexcept
102 {
103 int local_index = a_mfi.LocalIndex();
104 BL_ASSERT(local_index >= 0 && local_index < m_data.size() &&
105 DistributionMap() == a_mfi.DistributionMap());
106 return m_data[local_index];
107 }
108
109 T& operator[](int a_box_index) noexcept
110 {
111 int local_index = this->localindex(a_box_index);
112 BL_ASSERT(local_index >= 0 && local_index < m_data.size());
113 return m_data[local_index];
114 }
115
116 const T& operator[](int a_box_index) const noexcept
117 {
118 int local_index = this->localindex(a_box_index);
119 BL_ASSERT(local_index >= 0 && local_index < m_data.size());
120 return m_data[local_index];
121 }
122
123 const T* data () const noexcept { return m_data.data(); }
124 T* data () noexcept { return m_data.data(); }
125
126private:
127 Vector<T> m_data;
128 bool m_need_to_clear_bd = false;
129};
130
131}
132#endif
#define BL_ASSERT(EX)
Definition AMReX_BLassert.H:39
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:676
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:51
Base class for FabArray.
Definition AMReX_FabArrayBase.H:42
void clearThisBD(bool no_assertion=false) const
clear BD count and caches associated with this BD, if no other is using this BD.
Definition AMReX_FabArrayBase.cpp:2520
void clear()
Definition AMReX_FabArrayBase.cpp:207
FabArrayBase()=default
void addThisBD()
add the current BD into BD count database
Definition AMReX_FabArrayBase.cpp:2550
FabArrayBase & operator=(const FabArrayBase &rhs)=default
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow)
Definition AMReX_FabArrayBase.cpp:175
int localindex(int K) const noexcept
Return local index in the vector of FABs.
Definition AMReX_FabArrayBase.H:119
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:130
int local_size() const noexcept
Return the number of local FABs in the FabArray.
Definition AMReX_FabArrayBase.H:113
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
LayoutData(LayoutData &&rhs) noexcept
Definition AMReX_LayoutData.H:52
T * data() noexcept
Definition AMReX_LayoutData.H:124
LayoutData()=default
LayoutData & operator=(const LayoutData &rhs) noexcept
Definition AMReX_LayoutData.H:60
const T * data() const noexcept
Definition AMReX_LayoutData.H:123
~LayoutData()
Definition AMReX_LayoutData.H:42
LayoutData(const LayoutData &rhs) noexcept
Definition AMReX_LayoutData.H:44
void define(const BoxArray &a_grids, const DistributionMapping &a_dm)
Definition AMReX_LayoutData.H:24
T & operator[](int a_box_index) noexcept
Definition AMReX_LayoutData.H:109
const T & operator[](int a_box_index) const noexcept
Definition AMReX_LayoutData.H:116
void clear()
Definition AMReX_LayoutData.H:34
LayoutData(const BoxArray &a_grids, const DistributionMapping &a_dm)
Definition AMReX_LayoutData.H:18
const T & operator[](const MFIter &a_mfi) const noexcept
Definition AMReX_LayoutData.H:101
T & operator[](const MFIter &a_mfi) noexcept
Definition AMReX_LayoutData.H:92
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
Definition AMReX_Amr.cpp:50