You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
7.8 KiB
C++
251 lines
7.8 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkUniformGridAMR.cxx
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkOverlappingAMR.h"
|
|
#include "vtkUniformGridAMRDataIterator.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkAMRInformation.h"
|
|
#include "vtkUnsignedCharArray.h"
|
|
#include "vtkUniformGrid.h"
|
|
#include "vtkInformationIdTypeKey.h"
|
|
#include "vtkCellData.h"
|
|
#include "vtkDataSetAttributes.h"
|
|
#include <vector>
|
|
|
|
vtkStandardNewMacro(vtkOverlappingAMR);
|
|
|
|
vtkInformationKeyMacro(vtkOverlappingAMR,NUMBER_OF_BLANKED_POINTS,IdType);
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkOverlappingAMR::vtkOverlappingAMR()
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkOverlappingAMR::~vtkOverlappingAMR()
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
if(this->AMRInfo)
|
|
{
|
|
this->AMRInfo->PrintSelf(os,indent);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
vtkCompositeDataIterator* vtkOverlappingAMR::NewIterator()
|
|
{
|
|
vtkUniformGridAMRDataIterator* iter = vtkUniformGridAMRDataIterator::New();
|
|
iter->SetDataSet( this );
|
|
return iter;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::SetRefinementRatio(unsigned int level,
|
|
int ratio)
|
|
{
|
|
this->AMRInfo->SetRefinementRatio(level,ratio);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkOverlappingAMR::GetRefinementRatio(unsigned int level)
|
|
{
|
|
if(!AMRInfo->HasRefinementRatio())
|
|
{
|
|
AMRInfo->GenerateRefinementRatio();
|
|
}
|
|
return this->AMRInfo->GetRefinementRatio(level);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkOverlappingAMR::GetRefinementRatio(vtkCompositeDataIterator* iter)
|
|
{
|
|
vtkUniformGridAMRDataIterator *amrIter =
|
|
vtkUniformGridAMRDataIterator::SafeDownCast( iter );
|
|
|
|
unsigned int level = amrIter->GetCurrentLevel();
|
|
return this->AMRInfo->GetRefinementRatio(level);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::GenerateParentChildInformation()
|
|
{
|
|
this->AMRInfo->GenerateParentChildInformation();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool vtkOverlappingAMR::
|
|
HasChildrenInformation()
|
|
{
|
|
return AMRInfo->HasChildrenInformation();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
unsigned int *vtkOverlappingAMR::
|
|
GetParents(unsigned int level, unsigned int index, unsigned int& num)
|
|
{
|
|
return this->AMRInfo->GetParents(level,index,num);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
unsigned int *vtkOverlappingAMR::
|
|
GetChildren(unsigned int level, unsigned int index, unsigned int& num)
|
|
{
|
|
return this->AMRInfo->GetChildren(level,index,num);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::
|
|
PrintParentChildInfo(unsigned int level, unsigned int index)
|
|
{
|
|
this->AMRInfo->PrintParentChildInfo(level,index);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::SetAMRBox(unsigned int level, unsigned int id, const vtkAMRBox& box)
|
|
{
|
|
this->AMRInfo->SetAMRBox(level,id,box);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
const vtkAMRBox& vtkOverlappingAMR::GetAMRBox(unsigned int level, unsigned int id)
|
|
{
|
|
const vtkAMRBox& box = this->AMRInfo->GetAMRBox(level,id);
|
|
if(box.IsInvalid())
|
|
{
|
|
vtkErrorMacro("Invalid AMR box");
|
|
}
|
|
return box;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::SetSpacing(unsigned int level,const double spacing[3])
|
|
{
|
|
this->AMRInfo->SetSpacing(level,spacing);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::GetSpacing(unsigned int level, double spacing[3])
|
|
{
|
|
return this->AMRInfo->GetSpacing(level,spacing);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::GetBounds(unsigned int level, unsigned int id, double* bb)
|
|
{
|
|
this->AMRInfo->GetBounds(level, id, bb);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::GetOrigin(unsigned int level, unsigned int id, double origin[3])
|
|
{
|
|
double bb[6];
|
|
this->GetBounds(level,id,bb);
|
|
origin[0] = bb[0];
|
|
origin[1] = bb[2];
|
|
origin[2] = bb[4];
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::SetOrigin(const double* origin)
|
|
{
|
|
return this->AMRInfo->SetOrigin(origin);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
double* vtkOverlappingAMR::GetOrigin()
|
|
{
|
|
return this->AMRInfo? this->AMRInfo->GetOrigin() : NULL;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::SetAMRBlockSourceIndex(unsigned int level, unsigned int id, int sourceId)
|
|
{
|
|
unsigned int index = this->AMRInfo->GetIndex(level,id);
|
|
this->AMRInfo->SetAMRBlockSourceIndex(index, sourceId);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkOverlappingAMR::GetAMRBlockSourceIndex(unsigned int level, unsigned int id)
|
|
{
|
|
unsigned int index = this->AMRInfo->GetIndex(level,id);
|
|
return this->AMRInfo->GetAMRBlockSourceIndex(index);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkOverlappingAMR::Audit()
|
|
{
|
|
this->AMRInfo->Audit();
|
|
|
|
int emptyDimension(-1);
|
|
switch (this->GetGridDescription())
|
|
{
|
|
case VTK_YZ_PLANE: emptyDimension = 0; break;
|
|
case VTK_XZ_PLANE: emptyDimension = 1; break;
|
|
case VTK_XY_PLANE: emptyDimension = 2; break;
|
|
}
|
|
|
|
vtkSmartPointer<vtkUniformGridAMRDataIterator> iter;
|
|
iter.TakeReference(vtkUniformGridAMRDataIterator::SafeDownCast(this->NewIterator()));
|
|
iter->SetSkipEmptyNodes(1);
|
|
for(iter->GoToFirstItem(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
|
|
{
|
|
vtkUniformGrid* grid = vtkUniformGrid::SafeDownCast(iter->GetCurrentDataObject());
|
|
int hasGhost = grid->HasAnyGhostCells();
|
|
|
|
unsigned int level = iter->GetCurrentLevel();
|
|
unsigned int id = iter->GetCurrentIndex();
|
|
const vtkAMRBox& box = this->AMRInfo->GetAMRBox(level,id);
|
|
int dims[3];
|
|
box.GetNumberOfNodes(dims);
|
|
|
|
double spacing[3];
|
|
this->GetSpacing(level,spacing);
|
|
|
|
double origin[3];
|
|
this->GetOrigin(level,id,origin);
|
|
|
|
for(int d = 0; d<3; d++)
|
|
{
|
|
if(d==emptyDimension)
|
|
{
|
|
if(grid->GetSpacing()[d]!=spacing[d])
|
|
{
|
|
vtkErrorMacro("The grid spacing does not match AMRInfo at ("<<level<<", "<<id<<")");
|
|
}
|
|
if(!hasGhost && grid->GetOrigin()[d]!=origin[d])
|
|
{
|
|
vtkErrorMacro("The grid origin does not match AMRInfo at ("<<level<<", "<<id<<")");
|
|
}
|
|
if(!hasGhost && grid->GetDimensions()[d]!=dims[d])
|
|
{
|
|
vtkErrorMacro("The grid dimensions does not match AMRInfo at ("<<level<<", "<<id<<")");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool vtkOverlappingAMR::FindGrid(double q[3], unsigned int& level, unsigned int& gridId)
|
|
{
|
|
return this->AMRInfo->FindGrid(q,level,gridId);
|
|
}
|