VTK  9.5.20250830
vtkAMRBox.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
59#ifndef vtkAMRBox_h
60#define vtkAMRBox_h
61
62#include "vtkCommonDataModelModule.h" // For export macro
63#include "vtkObject.h"
64#include "vtkStructuredData.h" // For vtkStructuredData::VTK_STRUCTURED_XYZ_GRID definition
65
66VTK_ABI_NAMESPACE_BEGIN
67class vtkUniformGrid;
68class VTKCOMMONDATAMODEL_EXPORT vtkAMRBox
69{
70public:
75
79 vtkAMRBox(const vtkAMRBox& other);
80
84 vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi);
85
90 vtkAMRBox(const double* origin, const int* dimensions, const double* spacing,
91 const double* globalOrigin, int gridDescription = vtkStructuredData::VTK_STRUCTURED_XYZ_GRID);
92
96 vtkAMRBox(const int lo[3], const int hi[3]);
97
98 vtkAMRBox(const int dims[6]);
99
104
105 virtual ~vtkAMRBox() = default;
106
108
112 {
113 this->LoCorner[0] = this->LoCorner[1] = this->LoCorner[2] = 0;
114 this->HiCorner[0] = this->HiCorner[1] = this->HiCorner[2] = -2;
115 }
117
121 bool EmptyDimension(int i) const { return HiCorner[i] <= LoCorner[i] - 1; }
122
126 void SetDimensions(int ilo, int jlo, int klo, int ihi, int jhi, int khi,
128
133 const int lo[3], const int hi[3], int desc = vtkStructuredData::VTK_STRUCTURED_XYZ_GRID);
134
139
143 void GetDimensions(int lo[3], int hi[3]) const;
144
148 void GetDimensions(int dims[6]) const;
149
151
155 void GetNumberOfCells(int num[3]) const;
157
159
163 void GetNumberOfNodes(int ext[3]) const;
166
172 int ComputeDimension() const;
173
177 const int* GetLoCorner() const { return this->LoCorner; }
178 const int* GetHiCorner() const { return this->HiCorner; }
179
185 void GetValidHiCorner(int hi[3]) const;
186
187 bool Empty() const { return this->IsInvalid(); }
188
192 bool IsInvalid() const
193 {
194 return ((this->HiCorner[0] < this->LoCorner[0] - 1) ||
195 (this->HiCorner[1] < this->LoCorner[1] - 1) || (this->HiCorner[2] < this->LoCorner[2] - 1));
196 }
197
203 bool operator==(const vtkAMRBox& other) const;
204
210 bool operator!=(const vtkAMRBox& other) const { return (!(*this == other)); }
211
215 ostream& Print(ostream& os) const;
216
218
229 void Serialize(unsigned char*& buffer, vtkIdType& bytesize);
230 void Serialize(int* buffer) const;
232
239 void Deserialize(unsigned char* buffer, const vtkIdType& bytesize);
240
247 bool DoesBoxIntersectAlongDimension(const vtkAMRBox& other, int q) const;
248
249 bool DoesIntersect(const vtkAMRBox& other) const;
250
254 void Coarsen(int r);
255
259 void Refine(int r);
260
262
265 void Grow(int byN);
266 void Shrink(int byN);
268
270
273 void Shift(int i, int j, int k);
274 void Shift(const int I[3]);
276
282 bool Intersect(const vtkAMRBox& other);
283
285
288 bool Contains(int i, int j, int k) const;
289 bool Contains(const int I[3]) const;
291
295 bool Contains(const vtkAMRBox&) const;
296
302 void GetGhostVector(int r, int nghost[6]) const;
303
308 void RemoveGhosts(int r);
309
315 static vtkIdType GetBytesize() { return 6 * sizeof(int); }
316
320 static int GetCellLinearIndex(const vtkAMRBox& box, int i, int j, int k, int imageDimension[3]);
321
325 static void GetBounds(
326 const vtkAMRBox& box, const double origin[3], const double spacing[3], double bounds[6]);
327
332 static void GetBoxOrigin(
333 const vtkAMRBox& box, const double X0[3], const double spacing[3], double x0[3]);
334
339 static bool HasPoint(const vtkAMRBox& box, const double origin[3], const double spacing[3],
340 double x, double y, double z);
341
345 static int ComputeStructuredCoordinates(const vtkAMRBox& box, const double dataOrigin[3],
346 const double h[3], const double x[3], int ijk[3], double pcoords[3]);
347
354 int InitializeGrid(vtkUniformGrid* grid, double* origin, double* spacing) const;
355
363 int InitializeGrid(vtkUniformGrid* grid, double* origin, double* spacing, int nGhosts) const;
364
373 vtkUniformGrid* grid, double* origin, double* spacing, const int nGhosts[3]) const;
374
383 int InitializeGrid(vtkUniformGrid* grid, double* origin, double* spacing, int nGhostsI,
384 int nGhostsJ, int nGhostsK) const;
385
386protected:
391
398 bool IntersectBoxAlongDimension(const vtkAMRBox& other, int q);
399
400private:
401 int LoCorner[3]; // lo corner cell id.
402 int HiCorner[3]; // hi corner cell id.
403
405
410 void BuildAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi);
412};
413
414//*****************************************************************************
416
420template <typename T>
421void FillRegion(T* pArray, const vtkAMRBox& arrayRegion, const vtkAMRBox& destRegion, T fillValue)
422{
423 // Convert regions to array index space. VTK arrays
424 // always start with 0,0,0.
425 int ofs[3];
426 ofs[0] = -arrayRegion.GetLoCorner()[0];
427 ofs[1] = -arrayRegion.GetLoCorner()[1];
428 ofs[2] = -arrayRegion.GetLoCorner()[2];
429 vtkAMRBox arrayDims(arrayRegion);
430 arrayDims.Shift(ofs);
431 vtkAMRBox destDims(destRegion);
432 destDims.Shift(ofs);
433 // Quick sanity check.
434 if (!arrayRegion.Contains(destRegion))
435 {
436 vtkGenericWarningMacro(<< "ERROR: Array must enclose the destination region. "
437 << "Aborting the fill.");
438 }
439 // Get the bounds of the indices we fill.
440 const int* destLo = destDims.GetLoCorner();
441 int destHi[3];
442 destDims.GetValidHiCorner(destHi);
443 // Get the array dimensions.
444 int arrayHi[3];
445 arrayDims.GetNumberOfCells(arrayHi);
446 // Fill.
447 for (int k = destLo[2]; k <= destHi[2]; ++k)
448 {
449 vtkIdType kOfs = k * arrayHi[0] * arrayHi[1];
450 for (int j = destLo[1]; j <= destHi[1]; ++j)
451 {
452 vtkIdType idx = kOfs + j * arrayHi[0] + destLo[0];
453 for (int i = destLo[0]; i <= destHi[0]; ++i)
454 {
455 pArray[idx] = fillValue;
456 ++idx;
457 }
458 }
459 }
461}
462
463VTK_ABI_NAMESPACE_END
464#endif
465// VTK-HeaderTest-Exclude: vtkAMRBox.h
Encloses a rectangular region of voxel like cells.
Definition vtkAMRBox.h:69
bool Contains(const vtkAMRBox &) const
Test to see if a given box is inside this box.
static int GetCellLinearIndex(const vtkAMRBox &box, int i, int j, int k, int imageDimension[3])
Returns the linear index of the given cell structured coordinates.
void SetDimensions(int ilo, int jlo, int klo, int ihi, int jhi, int khi, int desc=vtkStructuredData::VTK_STRUCTURED_XYZ_GRID)
Set the dimensions of the box.
vtkAMRBox(const int dims[6])
void SetDimensions(const int lo[3], const int hi[3], int desc=vtkStructuredData::VTK_STRUCTURED_XYZ_GRID)
Set the dimensions of the box.
vtkAMRBox(const vtkAMRBox &other)
Copy construct this box from another.
void Invalidate()
Set the box to be invalid;.
Definition vtkAMRBox.h:111
void Serialize(int *buffer) const
Serializes this object instance into a byte-stream.
void Grow(int byN)
Grows the box in all directions.
int ComputeDimension() const
Determines the dimension of the AMR box given the box indices.
bool IntersectBoxAlongDimension(const vtkAMRBox &other, int q)
Intersects this instance of vtkAMRbox with box passed through the argument list along the given dimen...
void Shift(const int I[3])
Shifts the box in index space.
void Refine(int r)
Refine the box.
bool Contains(const int I[3]) const
Test to see if a given cell index is inside this box.
ostream & Print(ostream &os) const
Send the box to a stream.
bool DoesBoxIntersectAlongDimension(const vtkAMRBox &other, int q) const
Checks if this instance of vtkAMRBox intersects with the box passed through the argument list along t...
static vtkIdType GetBytesize()
Returns the number of bytes allocated by this instance.
Definition vtkAMRBox.h:315
int InitializeGrid(vtkUniformGrid *grid, double *origin, double *spacing, const int nGhosts[3]) const
Initialize the provided grid from the definition in this box, with ghost cell arrays of the thickness...
bool operator==(const vtkAMRBox &other) const
Test if this box is equal with the box instance on the rhs.
void GetValidHiCorner(int hi[3]) const
Return a high corner.
void Serialize(unsigned char *&buffer, vtkIdType &bytesize)
Serializes this object instance into a byte-stream.
bool EmptyDimension(int i) const
Whether dimension i is empty, e.g.
Definition vtkAMRBox.h:121
static void GetBounds(const vtkAMRBox &box, const double origin[3], const double spacing[3], double bounds[6])
Get the bounds of this box.
vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi)
Construct a specific 3D box.
vtkAMRBox & operator=(const vtkAMRBox &other)
Copy the other box to this box.
bool DoesIntersect(const vtkAMRBox &other) const
void Shift(int i, int j, int k)
Shifts the box in index space.
void GetDimensions(int lo[3], int hi[3]) const
Get the dimensions of this box.
bool Empty() const
Definition vtkAMRBox.h:187
bool Contains(int i, int j, int k) const
Test to see if a given cell index is inside this box.
void Deserialize(unsigned char *buffer, const vtkIdType &bytesize)
Deserializes this object instance from the given byte-stream.
int InitializeGrid(vtkUniformGrid *grid, double *origin, double *spacing, int nGhosts) const
Initialize the provided grid from the definition in this box, with ghost cell arrays nGhosts cells th...
static bool HasPoint(const vtkAMRBox &box, const double origin[3], const double spacing[3], double x, double y, double z)
Checks if the point is inside this AMRBox instance.
void Coarsen(int r)
Coarsen the box.
void SetDimensions(const int dims[6], int desc=vtkStructuredData::VTK_STRUCTURED_XYZ_GRID)
Set the dimensions of the box.
void Initialize()
Initializes this box instance.
vtkAMRBox(const int lo[3], const int hi[3])
Construct a specific box.
bool Intersect(const vtkAMRBox &other)
Intersect this box with another box in place.
vtkAMRBox()
Construct the empty box.
void RemoveGhosts(int r)
Given an AMR box and the refinement ratio, r, this shrinks the AMRBox.
void GetNumberOfNodes(int ext[3]) const
Gets the number of nodes required to construct a physical representation of the box.
static int ComputeStructuredCoordinates(const vtkAMRBox &box, const double dataOrigin[3], const double h[3], const double x[3], int ijk[3], double pcoords[3])
Compute structured coordinates.
void GetDimensions(int dims[6]) const
Get the dimensions of this box.
bool operator!=(const vtkAMRBox &other) const
Test if this box is NOT equal with the box instance on the rhs.
Definition vtkAMRBox.h:210
static void GetBoxOrigin(const vtkAMRBox &box, const double X0[3], const double spacing[3], double x0[3])
Get the world space origin of this box.
vtkIdType GetNumberOfNodes() const
Gets the number of nodes required to construct a physical representation of the box.
void GetNumberOfCells(int num[3]) const
Gets the number of cells enclosed by the box.
vtkIdType GetNumberOfCells() const
Gets the number of cells enclosed by the box.
int InitializeGrid(vtkUniformGrid *grid, double *origin, double *spacing, int nGhostsI, int nGhostsJ, int nGhostsK) const
Initialize the provided grid, from the definition in this box, with ghost cell arrays of the thicknes...
int InitializeGrid(vtkUniformGrid *grid, double *origin, double *spacing) const
Initialize the provided grid with no ghost cell arrays, from the definition in this box.
bool IsInvalid() const
Check to see if the AMR box instance is invalid.
Definition vtkAMRBox.h:192
void Shrink(int byN)
Grows the box in all directions.
const int * GetLoCorner() const
Get the low corner index.
Definition vtkAMRBox.h:177
const int * GetHiCorner() const
Definition vtkAMRBox.h:178
vtkAMRBox(const double *origin, const int *dimensions, const double *spacing, const double *globalOrigin, int gridDescription=vtkStructuredData::VTK_STRUCTURED_XYZ_GRID)
Construct an AMR box from the description a vtkUniformGrid Note that the dimensions specify the node ...
void GetGhostVector(int r, int nghost[6]) const
Given an AMR box and the refinement ratio, r, this method computes the number of ghost layers in each...
virtual ~vtkAMRBox()=default
Computes the portion of a dataset which is inside a selection.
Deprecated vtkImageData.
void FillRegion(T *pArray, const vtkAMRBox &arrayRegion, const vtkAMRBox &destRegion, T fillValue)
Fill the region of "pArray" enclosed by "destRegion" with "fillValue" "pArray" is defined on "arrayRe...
Definition vtkAMRBox.h:421
int vtkIdType
Definition vtkType.h:332