Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_InterpBndryData.H
Go to the documentation of this file.
1
2#ifndef AMREX_INTERPBNDRYDATA_H_
3#define AMREX_INTERPBNDRYDATA_H_
4#include <AMReX_Config.H>
5
6#include <AMReX_BCRec.H>
7#include <AMReX_BndryData.H>
9
10namespace amrex {
11
36template <typename MF>
38 :
39 public BndryDataT<MF>
40{
41public:
42
43 using value_type = typename MF::value_type;
44
48 InterpBndryDataT () noexcept = default;
49
58 InterpBndryDataT (const BoxArray& _grids,
59 const DistributionMapping& _dmap,
60 int _ncomp,
61 const Geometry& geom);
62
63 ~InterpBndryDataT () = default;
64
65 InterpBndryDataT (const InterpBndryDataT<MF>& rhs) = delete;
66 InterpBndryDataT (InterpBndryDataT<MF>&& rhs) = delete;
67 InterpBndryDataT<MF>& operator= (const InterpBndryDataT<MF>& rhs) = delete;
68 InterpBndryDataT<MF>& operator= (InterpBndryDataT<MF>&& rhs) = delete;
69
78 void setPhysBndryValues (const MF& mf, int mf_start, int bnd_start, int num_comp);
79
93 void setBndryValues (BndryRegisterT<MF> const& crse, int c_start, const MF& fine, int f_start,
94 int bnd_start, int num_comp, const IntVect& ratio,
95 int max_order = IBD_max_order_DEF, int max_width = 2);
96
108 void updateBndryValues (BndryRegisterT<MF>& crse, int c_start, int bnd_start, int num_comp,
109 const IntVect& ratio, int max_order = IBD_max_order_DEF, int max_width = 2);
110
112 void setHomogValues ();
113
114 // For sliding parabolic interp in bdfuncs
115 static constexpr int IBD_max_order_DEF = 3;
116
117};
118
119template <typename MF>
121 const DistributionMapping& _dmap,
122 int _ncomp,
123 const Geometry& _geom)
124 :
125 BndryDataT<MF>(_grids,_dmap,_ncomp,_geom)
126{}
127
128template <typename MF>
129void
130InterpBndryDataT<MF>::setPhysBndryValues (const MF& mf, int mf_start, int bnd_start, int num_comp)
131{
132 AMREX_ASSERT(this->grids == mf.boxArray());
133
134 const Box& fine_domain = this->geom.Domain();
135
136#ifdef AMREX_USE_OMP
137#pragma omp parallel if (Gpu::notInLaunchRegion())
138#endif
139 for (MFIter mfi(mf,MFItInfo().SetDynamic(true)); mfi.isValid(); ++mfi)
140 {
141 const Box& bx = mfi.validbox();
142 for (OrientationIter fi; fi; ++fi) {
143 const Orientation face = fi();
144 if (bx[face] == fine_domain[face] && !(this->geom.isPeriodic(face.coordDir())))
145 {
146 // Physical bndry, copy from grid.
147 auto & bnd_fab = this->bndry[face][mfi];
148 auto const& src_fab = mf[mfi];
149 auto const& bnd_array = bnd_fab.array();
150 auto const& src_array = src_fab.const_array();
151 const Box& b = src_fab.box() & bnd_fab.box();
152 AMREX_HOST_DEVICE_PARALLEL_FOR_4D ( b, num_comp, i, j, k, n,
153 {
154 bnd_array(i,j,k,n+bnd_start) = src_array(i,j,k,n+mf_start);
155 });
156 }
157 }
158 }
159}
160
161template <typename MF>
162void
164 int f_start, int bnd_start, int num_comp, const IntVect& ratio,
165 int max_order, int max_width)
166{
167 AMREX_ASSERT(this->grids == fine.boxArray());
168
169 const Box& fine_domain = this->geom.Domain();
170
171 if (max_order==3 || max_order==1)
172 {
173 MFItInfo info;
174 if (Gpu::notInLaunchRegion()) { info.SetDynamic(true); }
175#ifdef AMREX_USE_OMP
176#pragma omp parallel if (Gpu::notInLaunchRegion())
177#endif
178 for (MFIter mfi(fine,info); mfi.isValid(); ++mfi)
179 {
180 const Box& fine_bx = mfi.validbox();
181 for (OrientationIter fi; fi; ++fi) {
182 const Orientation face = fi();
183 const int dir = face.coordDir();
184 if (fine_bx[face] != fine_domain[face] || this->geom.isPeriodic(dir))
185 { // coarse/fine boundary: interpolate from coarse data stored in BndryRegister crse
186 auto const& crse_array = crse[face].const_array(mfi);
187 auto const& bdry_array = this->bndry[face].array(mfi);
188 Box const& b = this->bndry[face][mfi].box();
189 const auto rr = ratio.dim3();
190
191 if (max_order == 1)
192 {
193 AMREX_HOST_DEVICE_FOR_4D ( b, num_comp, it, jt, kt, n,
194 {
195 interpbndrydata_o1(it,jt,kt,n,bdry_array,bnd_start,
196 crse_array,c_start,rr);
197 });
198 }
199 else
200 {
201 auto const& mask_array = this->masks[face].const_array(mfi);
202 int is_not_covered = BndryData::not_covered;
203 switch (dir) {
204 case 0:
205 {
206 AMREX_HOST_DEVICE_FOR_4D ( b, num_comp, it, jt, kt, n,
207 {
208 interpbndrydata_x_o3(it,jt,kt,n,bdry_array,bnd_start,
209 crse_array,c_start,rr,
210 mask_array, is_not_covered, max_width);
211 });
212 break;
213 }
214#if (AMREX_SPACEDIM >= 2)
215 case 1:
216 {
217 AMREX_HOST_DEVICE_FOR_4D ( b, num_comp, it, jt, kt, n,
218 {
219 interpbndrydata_y_o3(it,jt,kt,n,bdry_array,bnd_start,
220 crse_array,c_start,rr,
221 mask_array, is_not_covered, max_width);
222 });
223 break;
224 }
225#if (AMREX_SPACEDIM == 3)
226 case 2:
227 {
228 AMREX_HOST_DEVICE_FOR_4D ( b, num_comp, it, jt, kt, n,
229 {
230 interpbndrydata_z_o3(it,jt,kt,n,bdry_array,bnd_start,
231 crse_array,c_start,rr,
232 mask_array, is_not_covered, max_width);
233 });
234 break;
235 }
236#endif
237#endif
238 default: {}
239 }
240 }
241 }
242 else if (fine.defined(mfi)) {
243 // Physical bndry
244 auto & bnd_fab = this->bndry[face][mfi];
245 auto const& src_fab = fine[mfi];
246 auto const& bnd_array = bnd_fab.array();
247 auto const& src_array = src_fab.const_array();
248 const Box& b = bnd_fab.box() & src_fab.box();
249 AMREX_HOST_DEVICE_FOR_4D ( b, num_comp, ii, jj, kk, nn,
250 {
251 bnd_array(ii,jj,kk,nn+bnd_start) = src_array(ii,jj,kk,nn+f_start);
252 });
253 }
254 }
255 }
256 }
257 else
258 {
259 amrex::Abort("InterpBndryDataT<MF>::setBndryValues supports only max_order=1 or 3");
260 }
261}
262
263template <typename MF>
264void
266 int num_comp, const IntVect& ratio, int max_order, int max_width)
267{
268 MF foo(this->grids, this->bndry[0].DistributionMap(), 1, num_comp, MFInfo().SetAlloc(false));
269 setBndryValues(crse, c_start, foo, 0, bnd_start, num_comp, ratio, max_order, max_width);
270}
271
272template <typename MF>
273void
278
281
282}
283
284#endif /*AMREX_INTERPBNDRYDATA_H_*/
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_HOST_DEVICE_FOR_4D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:107
#define AMREX_HOST_DEVICE_PARALLEL_FOR_4D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:111
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
A BndryData stores and manipulates boundary data information on each side of each box in a BoxArray.
Definition AMReX_BndryData.H:41
Vector< MultiMask > masks
Boundary condition mask.
Definition AMReX_BndryData.H:146
@ not_covered
Definition AMReX_BndryData.H:44
Geometry geom
Domain used for mask definitions.
Definition AMReX_BndryData.H:148
A BndryRegister organizes FabSets bounding each grid in a BoxArray. A FabSet is maintained for each b...
Definition AMReX_BndryRegister.H:41
BoxArray grids
Definition AMReX_BndryRegister.H:126
const DistributionMapping & DistributionMap() const noexcept
Returns constant reference to associated DistributionMapping.
Definition AMReX_BndryRegister.H:111
FabSetT< MF > bndry[2 *3]
The data.
Definition AMReX_BndryRegister.H:125
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:551
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:41
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:73
const Box & Domain() const noexcept
Returns our rectangular domain.
Definition AMReX_Geometry.H:210
bool isPeriodic(int dir) const noexcept
Is the domain periodic in the specified direction?
Definition AMReX_Geometry.H:331
__host__ __device__ Dim3 dim3() const noexcept
Definition AMReX_IntVect.H:170
An InterpBndryData object adds to a BndryData object the ability to manipulate and set the data store...
Definition AMReX_InterpBndryData.H:40
void setPhysBndryValues(const MF &mf, int mf_start, int bnd_start, int num_comp)
Set bndry values at physical boundaries.
Definition AMReX_InterpBndryData.H:130
static constexpr int IBD_max_order_DEF
Definition AMReX_InterpBndryData.H:115
void updateBndryValues(BndryRegisterT< MF > &crse, int c_start, int bnd_start, int num_comp, const IntVect &ratio, int max_order=IBD_max_order_DEF, int max_width=2)
Update boundary values at coarse/fine boundaries.
Definition AMReX_InterpBndryData.H:265
InterpBndryDataT() noexcept=default
default constructor
void setHomogValues()
Set boundary values to zero.
Definition AMReX_InterpBndryData.H:274
void setBndryValues(BndryRegisterT< MF > const &crse, int c_start, const MF &fine, int f_start, int bnd_start, int num_comp, const IntVect &ratio, int max_order=IBD_max_order_DEF, int max_width=2)
Sset bndry values at coarse/fine and physical boundaries.
Definition AMReX_InterpBndryData.H:163
typename MF::value_type value_type
Definition AMReX_InterpBndryData.H:43
Definition AMReX_MFIter.H:57
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:141
An Iterator over the Orientation of Faces of a Box.
Definition AMReX_Orientation.H:135
Encapsulation of the Orientation of the Faces of a Box.
Definition AMReX_Orientation.H:29
__host__ __device__ int coordDir() const noexcept
Returns the coordinate direction.
Definition AMReX_Orientation.H:83
bool notInLaunchRegion() noexcept
Definition AMReX_GpuControl.H:93
Definition AMReX_Amr.cpp:49
__host__ __device__ void interpbndrydata_z_o3(int i, int j, int k, int n, Array4< T > const &bdry, int nb, Array4< T const > const &crse, int nc, Dim3 const &r, Array4< int const > const &mask, int not_covered, int) noexcept
Definition AMReX_InterpBndryData_3D_K.H:90
__host__ __device__ void interpbndrydata_y_o3(int i, int j, int, int n, Array4< T > const &bdry, int nb, Array4< T const > const &crse, int nc, Dim3 const &r, Array4< int const > const &mask, int not_covered, int max_width) noexcept
Definition AMReX_InterpBndryData_2D_K.H:75
__host__ __device__ void interpbndrydata_x_o3(int i, int, int, int n, Array4< T > const &bdry, int nb, Array4< T const > const &crse, int nc, Dim3 const &r, Array4< int const > const &, int, int) noexcept
Definition AMReX_InterpBndryData_1D_K.H:22
__host__ __device__ void interpbndrydata_o1(int i, int, int, int n, Array4< T > const &bdry, int nb, Array4< T const > const &crse, int nc, Dim3 const &r) noexcept
Definition AMReX_InterpBndryData_1D_K.H:11
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
void setVal(MF &dst, typename MF::value_type val)
dst = val
Definition AMReX_FabArrayUtility.H:1875
FabArray memory allocation information.
Definition AMReX_FabArray.H:66
Definition AMReX_MFIter.H:20
MFItInfo & SetDynamic(bool f) noexcept
Definition AMReX_MFIter.H:34