VTK  9.5.20250803
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 VTKCOMMONDATAMODEL_EXPORT vtkAMRBox
68{
69public:
74
78 vtkAMRBox(const vtkAMRBox& other);
79
83 vtkAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi);
84
89 vtkAMRBox(const double* origin, const int* dimensions, const double* spacing,
90 const double* globalOrigin, int gridDescription = vtkStructuredData::VTK_STRUCTURED_XYZ_GRID);
91
95 vtkAMRBox(const int lo[3], const int hi[3]);
96
97 vtkAMRBox(const int dims[6]);
98
103
104 virtual ~vtkAMRBox() = default;
105
107
111 {
112 this->LoCorner[0] = this->LoCorner[1] = this->LoCorner[2] = 0;
113 this->HiCorner[0] = this->HiCorner[1] = this->HiCorner[2] = -2;
114 }
116
120 bool EmptyDimension(int i) const { return HiCorner[i] <= LoCorner[i] - 1; }
121
125 void SetDimensions(int ilo, int jlo, int klo, int ihi, int jhi, int khi,
127
132 const int lo[3], const int hi[3], int desc = vtkStructuredData::VTK_STRUCTURED_XYZ_GRID);
133
138
142 void GetDimensions(int lo[3], int hi[3]) const;
143
147 void GetDimensions(int dims[6]) const;
148
150
154 void GetNumberOfCells(int num[3]) const;
156
158
162 void GetNumberOfNodes(int ext[3]) const;
165
171 int ComputeDimension() const;
172
176 const int* GetLoCorner() const { return this->LoCorner; }
177 const int* GetHiCorner() const { return this->HiCorner; }
178
184 void GetValidHiCorner(int hi[3]) const;
185
186 bool Empty() const { return this->IsInvalid(); }
187
191 bool IsInvalid() const
192 {
193 return ((this->HiCorner[0] < this->LoCorner[0] - 1) ||
194 (this->HiCorner[1] < this->LoCorner[1] - 1) || (this->HiCorner[2] < this->LoCorner[2] - 1));
195 }
196
202 bool operator==(const vtkAMRBox& other) const;
203
209 bool operator!=(const vtkAMRBox& other) const { return (!(*this == other)); }
210
214 ostream& Print(ostream& os) const;
215
217
228 void Serialize(unsigned char*& buffer, vtkIdType& bytesize);
229 void Serialize(int* buffer) const;
231
238 void Deserialize(unsigned char* buffer, const vtkIdType& bytesize);
239
246 bool DoesBoxIntersectAlongDimension(const vtkAMRBox& other, int q) const;
247
248 bool DoesIntersect(const vtkAMRBox& other) const;
249
253 void Coarsen(int r);
254
258 void Refine(int r);
259
261
264 void Grow(int byN);
265 void Shrink(int byN);
267
269
272 void Shift(int i, int j, int k);
273 void Shift(const int I[3]);
275
281 bool Intersect(const vtkAMRBox& other);
282
284
287 bool Contains(int i, int j, int k) const;
288 bool Contains(const int I[3]) const;
290
294 bool Contains(const vtkAMRBox&) const;
295
301 void GetGhostVector(int r, int nghost[6]) const;
302
307 void RemoveGhosts(int r);
308
314 static vtkIdType GetBytesize() { return 6 * sizeof(int); }
315
319 static int GetCellLinearIndex(const vtkAMRBox& box, int i, int j, int k, int imageDimension[3]);
320
324 static void GetBounds(
325 const vtkAMRBox& box, const double origin[3], const double spacing[3], double bounds[6]);
326
331 static void GetBoxOrigin(
332 const vtkAMRBox& box, const double X0[3], const double spacing[3], double x0[3]);
333
338 static bool HasPoint(const vtkAMRBox& box, const double origin[3], const double spacing[3],
339 double x, double y, double z);
340
344 static int ComputeStructuredCoordinates(const vtkAMRBox& box, const double dataOrigin[3],
345 const double h[3], const double x[3], int ijk[3], double pcoords[3]);
346
347protected:
352
359 bool IntersectBoxAlongDimension(const vtkAMRBox& other, int q);
360
361private:
362 int LoCorner[3]; // lo corner cell id.
363 int HiCorner[3]; // hi corner cell id.
364
366
371 void BuildAMRBox(int ilo, int jlo, int klo, int ihi, int jhi, int khi);
373};
374
375//*****************************************************************************
377
381template <typename T>
382void FillRegion(T* pArray, const vtkAMRBox& arrayRegion, const vtkAMRBox& destRegion, T fillValue)
383{
384 // Convert regions to array index space. VTK arrays
385 // always start with 0,0,0.
386 int ofs[3];
387 ofs[0] = -arrayRegion.GetLoCorner()[0];
388 ofs[1] = -arrayRegion.GetLoCorner()[1];
389 ofs[2] = -arrayRegion.GetLoCorner()[2];
390 vtkAMRBox arrayDims(arrayRegion);
391 arrayDims.Shift(ofs);
392 vtkAMRBox destDims(destRegion);
393 destDims.Shift(ofs);
394 // Quick sanity check.
395 if (!arrayRegion.Contains(destRegion))
396 {
397 vtkGenericWarningMacro(<< "ERROR: Array must enclose the destination region. "
398 << "Aborting the fill.");
399 }
400 // Get the bounds of the indices we fill.
401 const int* destLo = destDims.GetLoCorner();
402 int destHi[3];
403 destDims.GetValidHiCorner(destHi);
404 // Get the array dimensions.
405 int arrayHi[3];
406 arrayDims.GetNumberOfCells(arrayHi);
407 // Fill.
408 for (int k = destLo[2]; k <= destHi[2]; ++k)
409 {
410 vtkIdType kOfs = k * arrayHi[0] * arrayHi[1];
411 for (int j = destLo[1]; j <= destHi[1]; ++j)
412 {
413 vtkIdType idx = kOfs + j * arrayHi[0] + destLo[0];
414 for (int i = destLo[0]; i <= destHi[0]; ++i)
415 {
416 pArray[idx] = fillValue;
417 ++idx;
418 }
419 }
420 }
422}
423
424VTK_ABI_NAMESPACE_END
425#endif
426// VTK-HeaderTest-Exclude: vtkAMRBox.h
Encloses a rectangular region of voxel like cells.
Definition vtkAMRBox.h:68
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:110
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:314
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:120
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:186
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.
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:209
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.
bool IsInvalid() const
Check to see if the AMR box instance is invalid.
Definition vtkAMRBox.h:191
void Shrink(int byN)
Grows the box in all directions.
const int * GetLoCorner() const
Get the low corner index.
Definition vtkAMRBox.h:176
const int * GetHiCorner() const
Definition vtkAMRBox.h:177
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.
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:382
int vtkIdType
Definition vtkType.h:332