chombo-discharge
Loading...
Searching...
No Matches
CD_EBAMRDataImplem.H
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021-2026 SINTEF Energy Research
3 *
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
13#ifndef CD_EBAMRDATAIMPLEM_H
14#define CD_EBAMRDATAIMPLEM_H
15
16// Chombo includes
17#include <CH_Timer.H>
18
19// Our includes
20#include <CD_EBAMRData.H>
21#include <CD_NamespaceHeader.H>
22
23template <typename T>
25{
26 CH_TIME("EBAMRData<T>::EBAMRData()");
27 m_reserved = false;
28}
29
30template <typename T>
31EBAMRData<T>::EBAMRData(const int a_size) noexcept : EBAMRData<T>()
32{
33 CH_TIME("EBAMRData<T>::EBAMRData(int)");
34
35 m_data.resize(a_size);
36}
37
38template <typename T>
40{
41 CH_TIME("EBAMRData<T>::~EBAMRData()");
42}
43
44template <typename T>
45RefCountedPtr<LevelData<T>>&
46EBAMRData<T>::operator[](int a_level) noexcept
47{
48 return m_data[a_level];
49}
50
51template <typename T>
52const RefCountedPtr<LevelData<T>>&
53EBAMRData<T>::operator[](int a_level) const noexcept
54{
55 return m_data[a_level];
56}
57
58template <typename T>
59void
60EBAMRData<T>::resize(const int a_size) noexcept
61{
62 m_data.resize(a_size);
63}
64
65template <typename T>
66int
67EBAMRData<T>::size() const noexcept
68{
69 return m_data.size();
70}
71
72template <typename T>
73void
75{
76 for (int lvl = 0; lvl < m_data.size(); lvl++) {
77 m_data[lvl] = RefCountedPtr<LevelData<T>>(0);
78 }
79
80 m_data.resize(0);
81}
82
83template <typename T>
84void
86{
87 m_reserved = true;
88}
89
90template <typename T>
91void
93{
94 m_reserved = false;
95}
96
97template <typename T>
98bool
100{
101 return m_reserved;
102}
103
104template <typename T>
105void
107{
108 CH_TIMERS("EBAMRData<T>::exchange()");
109 CH_TIMER("EBAMRData<T>::exchange()::post", t1);
110 CH_TIMER("EBAMRData<T>::exchange()::local", t2);
111 CH_TIMER("EBAMRData<T>::exchange()::wait", t3);
112
113 // Pipeline the hierarchy instead of running one complete MPI round per level. Every level's messages go onto
114 // the wire first, then the on-rank copies run while they are in flight, and only then does anything wait. The
115 // exposed cost is the slowest single level rather than the sum over levels, and no level's messages are held
116 // back by the on-rank work of the levels below it.
117 //
118 // This is safe because the send and receive buffers, and the MPI requests, live on the Copier -- and each
119 // level's LevelData owns its own exchange Copier. The levels therefore never alias one another's buffers.
120 // Message matching is unchanged as well: every rank still posts its levels in the same order, so MPI's
121 // non-overtaking guarantee pairs sends with receives exactly as it does when the levels run one at a time.
122 //
123 // The IntVect::Zero test is the one LevelData::exchange() makes for itself. A level with no ghost cells has
124 // nothing to exchange, so it must be skipped here rather than handed to exchangePost().
125 const int numLevels = m_data.size();
126
127 CH_START(t1);
128 for (int lvl = 0; lvl < numLevels; lvl++) {
129 if (m_data[lvl]->ghostVect() != IntVect::Zero) {
130 m_data[lvl]->exchangePost(m_data[lvl]->exchangeCopier());
131 }
132 }
133 CH_STOP(t1);
134
135 CH_START(t2);
136 for (int lvl = 0; lvl < numLevels; lvl++) {
137 if (m_data[lvl]->ghostVect() != IntVect::Zero) {
138 m_data[lvl]->exchangeLocal(m_data[lvl]->exchangeCopier());
139 }
140 }
141 CH_STOP(t2);
142
143 CH_START(t3);
144 for (int lvl = 0; lvl < numLevels; lvl++) {
145 if (m_data[lvl]->ghostVect() != IntVect::Zero) {
146 m_data[lvl]->exchangeEnd();
147 }
148 }
149 CH_STOP(t3);
150}
151
152template <typename T>
153Vector<RefCountedPtr<LevelData<T>>>&
155{
156 return m_data;
157}
158
159template <typename T>
160const Vector<RefCountedPtr<LevelData<T>>>&
161EBAMRData<T>::getData() const noexcept
162{
163 return m_data;
164}
165
166template <typename T>
167void
168EBAMRData<T>::push_back(RefCountedPtr<LevelData<T>>& a_levelData) noexcept
169{
170 m_data.push_back(a_levelData);
171}
172
173template <typename T>
174const std::string
176{
177 return m_realm;
178}
179
180template <typename T>
181void
182EBAMRData<T>::setRealm(const std::string& a_realm) noexcept
183{
184 m_realm = a_realm;
185}
186
187// Explicit templates
188template class EBAMRData<MFCellFAB>;
189template class EBAMRData<MFFluxFAB>;
190template class EBAMRData<MFBaseIVFAB>;
191template class EBAMRData<EBCellFAB>; // Cell-centered single-phase data
192template class EBAMRData<EBFluxFAB>; // Face-centered single-phase data
193template class EBAMRData<EBFaceFAB>;
194template class EBAMRData<BaseIVFAB<Real>>;
195template class EBAMRData<DomainFluxIFFAB>;
196template class EBAMRData<BaseFab<bool>>;
197template class EBAMRData<FArrayBox>;
198
200typedef EBAMRData<MFCellFAB> MFAMRCellData; // Cell-centered multifluid data
201typedef EBAMRData<MFFluxFAB> MFAMRFluxData; // Face-centered multifluid data
202typedef EBAMRData<MFBaseIVFAB> MFAMRIVData; // Irregular face multifluid data
203typedef EBAMRData<EBCellFAB> EBAMRCellData; // Cell-centered single-phase data
204typedef EBAMRData<EBFluxFAB> EBAMRFluxData; // Face-centered data in all coordinate direction
205typedef EBAMRData<EBFaceFAB> EBAMRFaceData; // Face-centered in a single coordinate direction
206typedef EBAMRData<BaseIVFAB<Real>> EBAMRIVData; // Data on irregular data centroids
207typedef EBAMRData<DomainFluxIFFAB> EBAMRIFData; // Data on domain phases
208typedef EBAMRData<BaseFab<bool>> EBAMRBool; // For holding bool at every cell
209typedef EBAMRData<FArrayBox> EBAMRFAB; // Just regular grid data.
211
212#include <CD_NamespaceFooter.H>
213
214#endif
Class for holding data across EBAMR hierarchies.
Default class for holding LevelData<T> data across an EBAMR realm.
Definition CD_EBAMRData.H:41
EBAMRData() noexcept
Default constructor. Does nothing.
Definition CD_EBAMRDataImplem.H:24
void reserve() noexcept
Reserve data.
Definition CD_EBAMRDataImplem.H:85
Vector< RefCountedPtr< LevelData< T > > > & getData() noexcept
Get underlying data. Returns m_data.
Definition CD_EBAMRDataImplem.H:154
void exchange() noexcept
Exchange on all AMR levels.
Definition CD_EBAMRDataImplem.H:106
virtual ~EBAMRData() noexcept
Destructor. Does nothing.
Definition CD_EBAMRDataImplem.H:39
int size() const noexcept
Get size of m_data.
Definition CD_EBAMRDataImplem.H:67
void push_back(RefCountedPtr< LevelData< T > > &a_levelData) noexcept
Push a LevelData<T> object to the back of the data vector.
Definition CD_EBAMRDataImplem.H:168
bool isReserved() const noexcept
Check if data is reserved.
Definition CD_EBAMRDataImplem.H:99
void clear() noexcept
Delete all data.
Definition CD_EBAMRDataImplem.H:74
void resize(int a_size) noexcept
Resize m_data to having size a_size.
Definition CD_EBAMRDataImplem.H:60
void setRealm(const std::string &a_realm) noexcept
Sets the realm for this object.
Definition CD_EBAMRDataImplem.H:182
void release() noexcept
Release data.
Definition CD_EBAMRDataImplem.H:92
const std::string getRealm() const noexcept
Returns the string identifier for whatever realm this data is supposed to be allocated over.
Definition CD_EBAMRDataImplem.H:175
RefCountedPtr< LevelData< T > > & operator[](int a_level) noexcept
Indexing operators. Returns m_data[a_level].
Definition CD_EBAMRDataImplem.H:46