2015-07-31 21:48:06 +00:00
|
|
|
//============================================================================
|
|
|
|
// Copyright (c) Kitware, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
// See LICENSE.txt 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.
|
|
|
|
//
|
|
|
|
// Copyright 2015 Sandia Corporation.
|
|
|
|
// Copyright 2015 UT-Battelle, LLC.
|
|
|
|
// Copyright 2015 Los Alamos National Security.
|
|
|
|
//
|
|
|
|
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
|
|
// the U.S. Government retains certain rights in this software.
|
|
|
|
//
|
|
|
|
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
|
|
|
// Laboratory (LANL), the U.S. Government retains certain rights in
|
|
|
|
// this software.
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
#ifndef vtk_m_internal_ConnectivityStructuredInternals_h
|
|
|
|
#define vtk_m_internal_ConnectivityStructuredInternals_h
|
|
|
|
|
2015-08-16 18:53:44 +00:00
|
|
|
#include <vtkm/CellShape.h>
|
2015-07-31 21:48:06 +00:00
|
|
|
#include <vtkm/TopologyElementTag.h>
|
|
|
|
#include <vtkm/Types.h>
|
2015-08-27 22:49:24 +00:00
|
|
|
#include <vtkm/VecVariable.h>
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-12 19:08:45 +00:00
|
|
|
VTKM_THIRDPARTY_PRE_INCLUDE
|
2015-07-31 21:48:06 +00:00
|
|
|
#include <boost/static_assert.hpp>
|
2015-08-12 19:08:45 +00:00
|
|
|
VTKM_THIRDPARTY_POST_INCLUDE
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
namespace vtkm {
|
|
|
|
namespace internal {
|
|
|
|
|
|
|
|
template<vtkm::IdComponent> class ConnectivityStructuredInternals;
|
|
|
|
|
|
|
|
//1 D specialization.
|
|
|
|
template<>
|
|
|
|
class ConnectivityStructuredInternals<1>
|
|
|
|
{
|
|
|
|
public:
|
2015-08-02 21:59:44 +00:00
|
|
|
typedef vtkm::Id SchedulingRangeType;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
void SetPointDimensions(vtkm::Id dimensions)
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
this->PointDimensions = dimensions;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id GetPointDimensions() const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
return this->PointDimensions;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id GetCellDimensions() const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-02 21:59:44 +00:00
|
|
|
return this->PointDimensions - 1;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
SchedulingRangeType GetSchedulingRange(vtkm::TopologyElementTagCell) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
return this->GetNumberOfCells();
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
SchedulingRangeType GetSchedulingRange(vtkm::TopologyElementTagPoint) const
|
|
|
|
{
|
|
|
|
return this->GetNumberOfPoints();
|
|
|
|
}
|
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
static const vtkm::IdComponent NUM_POINTS_IN_CELL = 2;
|
|
|
|
static const vtkm::IdComponent MAX_CELL_TO_POINT = 2;
|
|
|
|
|
2015-08-02 21:59:44 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id GetNumberOfPoints() const {return this->PointDimensions;}
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id GetNumberOfCells() const {return this->PointDimensions-1;}
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::IdComponent GetNumberOfPointsInCell() const {return NUM_POINTS_IN_CELL;}
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 23:03:13 +00:00
|
|
|
vtkm::IdComponent GetCellShape() const {return vtkm::CELL_SHAPE_LINE;}
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-19 16:32:01 +00:00
|
|
|
typedef vtkm::CellShapeTagLine CellShapeTag;
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> GetPointsOfCell(vtkm::Id index) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> pointIds;
|
|
|
|
pointIds[0] = index;
|
|
|
|
pointIds[1] = pointIds[0] + 1;
|
|
|
|
return pointIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::IdComponent GetNumberOfCellsIncidentOnPoint(vtkm::Id pointIndex) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
return
|
|
|
|
(static_cast<vtkm::IdComponent>(pointIndex > 0)
|
|
|
|
+ static_cast<vtkm::IdComponent>(pointIndex < this->PointDimensions-1));
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT>
|
|
|
|
GetCellsOfPoint(vtkm::Id index) const
|
2015-08-11 05:38:23 +00:00
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT> cellIds;
|
2015-08-11 05:38:23 +00:00
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
if (index > 0)
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(index-1);
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
2015-08-02 21:59:44 +00:00
|
|
|
if (index < this->PointDimensions-1)
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(index);
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
2015-08-11 05:38:23 +00:00
|
|
|
|
|
|
|
return cellIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_CONT_EXPORT
|
|
|
|
void PrintSummary(std::ostream &out) const
|
|
|
|
{
|
|
|
|
out<<" RegularConnectivity<1> ";
|
2015-08-02 21:59:44 +00:00
|
|
|
out<<"this->PointDimensions["<<this->PointDimensions<<"] ";
|
2015-07-31 21:48:06 +00:00
|
|
|
out<<"\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id PointDimensions;
|
2015-07-31 21:48:06 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//2 D specialization.
|
|
|
|
template<>
|
|
|
|
class ConnectivityStructuredInternals<2>
|
|
|
|
{
|
|
|
|
public:
|
2015-08-02 21:59:44 +00:00
|
|
|
typedef vtkm::Id2 SchedulingRangeType;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
void SetPointDimensions(vtkm::Id2 dims)
|
|
|
|
{
|
|
|
|
this->PointDimensions = dims;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
const vtkm::Id2 &GetPointDimensions() const {
|
|
|
|
return this->PointDimensions;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id2 GetCellDimensions() const {
|
|
|
|
return this->PointDimensions - vtkm::Id2(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id GetNumberOfPoints() const {
|
|
|
|
return vtkm::internal::VecProduct<2>()(this->GetPointDimensions());
|
|
|
|
}
|
|
|
|
|
|
|
|
//returns an id2 to signal what kind of scheduling to use
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id2 GetSchedulingRange(vtkm::TopologyElementTagCell) const {
|
2015-07-31 21:48:06 +00:00
|
|
|
return this->GetCellDimensions();
|
|
|
|
}
|
2015-08-02 21:59:44 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id2 GetSchedulingRange(vtkm::TopologyElementTagPoint) const {
|
|
|
|
return this->GetPointDimensions();
|
|
|
|
}
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
static const vtkm::IdComponent NUM_POINTS_IN_CELL = 4;
|
|
|
|
static const vtkm::IdComponent MAX_CELL_TO_POINT = 4;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id GetNumberOfCells() const
|
|
|
|
{
|
|
|
|
return vtkm::internal::VecProduct<2>()(this->GetCellDimensions());
|
|
|
|
}
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::IdComponent GetNumberOfPointsInCell() const {return NUM_POINTS_IN_CELL;}
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 23:03:13 +00:00
|
|
|
vtkm::IdComponent GetCellShape() const { return vtkm::CELL_SHAPE_QUAD; }
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-27 23:03:13 +00:00
|
|
|
typedef vtkm::CellShapeTagQuad CellShapeTag;
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> GetPointsOfCell(vtkm::Id index) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
vtkm::Id i, j;
|
2015-08-03 16:06:59 +00:00
|
|
|
this->CalculateLogicalPointIndices(index, i, j);
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> pointIds;
|
|
|
|
pointIds[0] = j*this->PointDimensions[0] + i;
|
|
|
|
pointIds[1] = pointIds[0] + 1;
|
2015-08-27 23:03:13 +00:00
|
|
|
pointIds[2] = pointIds[1] + this->PointDimensions[0];
|
|
|
|
pointIds[3] = pointIds[2] - 1;
|
2015-08-11 05:38:23 +00:00
|
|
|
return pointIds;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::IdComponent GetNumberOfCellsIncidentOnPoint(vtkm::Id pointIndex) const
|
|
|
|
{
|
|
|
|
vtkm::Id i, j;
|
|
|
|
this->CalculateLogicalPointIndices(pointIndex, i, j);
|
|
|
|
return
|
|
|
|
(static_cast<vtkm::IdComponent>((i > 0) && (j > 0))
|
|
|
|
+ static_cast<vtkm::IdComponent>((i < this->PointDimensions[0]-1) && (j > 0))
|
|
|
|
+ static_cast<vtkm::IdComponent>((i > 0) && (j < this->PointDimensions[1]-1))
|
|
|
|
+ static_cast<vtkm::IdComponent>(
|
|
|
|
(i < this->PointDimensions[0]-1) && (j < this->PointDimensions[1]-1)));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT>
|
|
|
|
GetCellsOfPoint(vtkm::Id index) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT> cellIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
vtkm::Id i, j;
|
2015-08-11 05:38:23 +00:00
|
|
|
this->CalculateLogicalPointIndices(index, i, j);
|
2015-07-31 21:48:06 +00:00
|
|
|
if ((i > 0) && (j > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) && (j > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i > 0) && (j < this->PointDimensions[1]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j ));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) && (j < this->PointDimensions[1]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j ));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
2015-08-11 05:38:23 +00:00
|
|
|
|
|
|
|
return cellIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_CONT_EXPORT
|
|
|
|
void PrintSummary(std::ostream &out) const
|
|
|
|
{
|
|
|
|
out<<" RegularConnectivity<2> ";
|
|
|
|
out<<"pointDim["<<this->PointDimensions[0]<<" "<<this->PointDimensions[1]<<"] ";
|
|
|
|
out<<std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
vtkm::Id2 PointDimensions;
|
|
|
|
|
|
|
|
private:
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-03 16:06:59 +00:00
|
|
|
void CalculateLogicalPointIndices(vtkm::Id index, vtkm::Id &i, vtkm::Id &j) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
vtkm::Id2 cellDimensions = this->GetCellDimensions();
|
|
|
|
i = index % cellDimensions[0];
|
|
|
|
j = index / cellDimensions[0];
|
|
|
|
}
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id CalculateCellIndex(vtkm::Id i, vtkm::Id j) const
|
|
|
|
{
|
|
|
|
vtkm::Id2 cellDimensions = this->GetCellDimensions();
|
|
|
|
return j*cellDimensions[0] + i;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
//3 D specialization.
|
|
|
|
template<>
|
|
|
|
class ConnectivityStructuredInternals<3>
|
|
|
|
{
|
|
|
|
public:
|
2015-08-02 21:59:44 +00:00
|
|
|
typedef vtkm::Id3 SchedulingRangeType;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
void SetPointDimensions(vtkm::Id3 dims)
|
|
|
|
{
|
|
|
|
this->PointDimensions = dims;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
const vtkm::Id3 GetPointDimensions() const
|
|
|
|
{
|
|
|
|
return this->PointDimensions;
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id3 GetCellDimensions() const
|
|
|
|
{
|
|
|
|
return this->PointDimensions - vtkm::Id3(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id GetNumberOfPoints() const
|
|
|
|
{
|
|
|
|
return vtkm::internal::VecProduct<3>()(this->PointDimensions);
|
|
|
|
}
|
|
|
|
|
|
|
|
//returns an id3 to signal what kind of scheduling to use
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
vtkm::Id3 GetSchedulingRange(vtkm::TopologyElementTagCell) const {
|
2015-07-31 21:48:06 +00:00
|
|
|
return this->GetCellDimensions();
|
|
|
|
}
|
2015-08-02 21:59:44 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id3 GetSchedulingRange(vtkm::TopologyElementTagPoint) const {
|
|
|
|
return this->GetPointDimensions();
|
|
|
|
}
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
static const vtkm::IdComponent NUM_POINTS_IN_CELL = 8;
|
|
|
|
static const vtkm::IdComponent MAX_CELL_TO_POINT = 6;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id GetNumberOfCells() const
|
|
|
|
{
|
|
|
|
return vtkm::internal::VecProduct<3>()(this->GetCellDimensions());
|
|
|
|
}
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::IdComponent GetNumberOfPointsInCell() const {return NUM_POINTS_IN_CELL;}
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 23:03:13 +00:00
|
|
|
vtkm::IdComponent GetCellShape() const { return vtkm::CELL_SHAPE_HEXAHEDRON; }
|
2015-07-31 21:48:06 +00:00
|
|
|
|
2015-08-27 23:03:13 +00:00
|
|
|
typedef vtkm::CellShapeTagHexahedron CellShapeTag;
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> GetPointsOfCell(vtkm::Id index) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
|
|
|
vtkm::Id3 cellDimensions = this->GetCellDimensions();
|
|
|
|
|
|
|
|
vtkm::Id cellDims01 = cellDimensions[0] * cellDimensions[1];
|
|
|
|
vtkm::Id k = index / cellDims01;
|
|
|
|
vtkm::Id indexij = index % cellDims01;
|
|
|
|
vtkm::Id j = indexij / cellDimensions[0];
|
|
|
|
vtkm::Id i = indexij % cellDimensions[0];
|
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
vtkm::Vec<vtkm::Id,NUM_POINTS_IN_CELL> pointIds;
|
|
|
|
pointIds[0] = (k * this->PointDimensions[1] + j) * this->PointDimensions[0] + i;
|
|
|
|
pointIds[1] = pointIds[0] + 1;
|
2015-08-27 23:03:13 +00:00
|
|
|
pointIds[2] = pointIds[1] + this->PointDimensions[0];
|
|
|
|
pointIds[3] = pointIds[2] - 1;
|
2015-08-11 05:38:23 +00:00
|
|
|
pointIds[4] = pointIds[0] + this->PointDimensions[0]*this->PointDimensions[1];
|
|
|
|
pointIds[5] = pointIds[4] + 1;
|
2015-08-27 23:03:13 +00:00
|
|
|
pointIds[6] = pointIds[5] + this->PointDimensions[0];
|
|
|
|
pointIds[7] = pointIds[6] - 1;
|
2015-08-11 05:38:23 +00:00
|
|
|
|
|
|
|
return pointIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT>
|
|
|
|
GetCellsOfPoint(vtkm::Id index) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
vtkm::VecVariable<vtkm::Id,MAX_CELL_TO_POINT> cellIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
|
|
|
|
vtkm::Id i, j, k;
|
|
|
|
|
2015-08-03 16:06:59 +00:00
|
|
|
this->CalculateLogicalPointIndices(index, i, j, k);
|
2015-07-31 21:48:06 +00:00
|
|
|
if ((i > 0) && (j > 0) && (k > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j-1, k-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) && (j > 0) && (k > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j-1, k-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i > 0) && (j < this->PointDimensions[1]-1) && (k > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j , k-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) &&
|
|
|
|
(j < this->PointDimensions[1]-1) &&
|
|
|
|
(k > 0))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j , k-1));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ((i > 0) && (j > 0) && (k < this->PointDimensions[2]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j-1, k));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) &&
|
|
|
|
(j > 0) &&
|
|
|
|
(k < this->PointDimensions[2]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j-1, k));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i > 0) &&
|
|
|
|
(j < this->PointDimensions[1]-1) &&
|
|
|
|
(k < this->PointDimensions[2]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i-1, j , k));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
if ((i < this->PointDimensions[0]-1) &&
|
|
|
|
(j < this->PointDimensions[1]-1) &&
|
|
|
|
(k < this->PointDimensions[2]-1))
|
|
|
|
{
|
2015-08-27 22:49:24 +00:00
|
|
|
cellIds.Append(this->CalculateCellIndex(i , j , k));
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
2015-08-11 05:38:23 +00:00
|
|
|
|
|
|
|
return cellIds;
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_CONT_EXPORT
|
|
|
|
void PrintSummary(std::ostream &out) const
|
|
|
|
{
|
|
|
|
out<<" RegularConnectivity<3> ";
|
|
|
|
out<<"pointDim["<<this->PointDimensions[0]<<" "<<this->PointDimensions[1]<<" "<<this->PointDimensions[2]<<"] ";
|
|
|
|
out<<std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
vtkm::Id3 PointDimensions;
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-03 16:06:59 +00:00
|
|
|
void CalculateLogicalPointIndices(vtkm::Id index, vtkm::Id &i, vtkm::Id &j, vtkm::Id &k) const
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-03 16:06:59 +00:00
|
|
|
vtkm::Id pointDims01 = this->PointDimensions[0] * this->PointDimensions[1];
|
|
|
|
k = index / pointDims01;
|
|
|
|
vtkm::Id indexij = index % pointDims01;
|
2015-07-31 21:48:06 +00:00
|
|
|
j = indexij / this->PointDimensions[0];
|
|
|
|
i = indexij % this->PointDimensions[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
vtkm::Id CalculateCellIndex(vtkm::Id i, vtkm::Id j, vtkm::Id k) const
|
|
|
|
{
|
|
|
|
vtkm::Id3 cellDimensions = this->GetCellDimensions();
|
|
|
|
return (k * cellDimensions[1] + j) * cellDimensions[0] + i;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// We may want to generalize this class depending on how ConnectivityExplicit
|
|
|
|
// eventually handles retrieving cell to point connectivity.
|
|
|
|
|
|
|
|
template<typename From, typename To, vtkm::IdComponent Dimension>
|
|
|
|
struct ConnectivityStructuredIndexHelper
|
|
|
|
{
|
|
|
|
// We want an unconditional failure if this unspecialized class ever gets
|
|
|
|
// instantiated, because it means someone missed a topology mapping type.
|
|
|
|
// We need to create a test which depends on the templated types so
|
|
|
|
// it doesn't get picked up without a concrete instantiation.
|
|
|
|
BOOST_STATIC_ASSERT_MSG(sizeof(To) == static_cast<size_t>(-1),
|
|
|
|
"Missing Specialization for Topologies");
|
|
|
|
};
|
|
|
|
|
|
|
|
template<vtkm::IdComponent Dimension>
|
|
|
|
struct ConnectivityStructuredIndexHelper<
|
|
|
|
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, Dimension>
|
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
typedef vtkm::internal::ConnectivityStructuredInternals<Dimension>
|
|
|
|
ConnectivityType;
|
|
|
|
|
|
|
|
typedef vtkm::Vec<vtkm::Id,ConnectivityType::NUM_POINTS_IN_CELL> IndicesType;
|
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
static IndicesType GetIndices(const ConnectivityType &connectivity,
|
|
|
|
vtkm::Id cellIndex)
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
return connectivity.GetPointsOfCell(cellIndex);
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-02 21:59:44 +00:00
|
|
|
static vtkm::IdComponent GetNumberOfIndices(
|
2015-08-11 05:38:23 +00:00
|
|
|
const ConnectivityType &connectivity,
|
2015-07-31 21:48:06 +00:00
|
|
|
vtkm::Id vtkmNotUsed(cellIndex))
|
|
|
|
{
|
2015-08-03 16:06:59 +00:00
|
|
|
return connectivity.GetNumberOfPointsInCell();
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<vtkm::IdComponent Dimension>
|
|
|
|
struct ConnectivityStructuredIndexHelper<
|
|
|
|
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, Dimension>
|
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
typedef vtkm::internal::ConnectivityStructuredInternals<Dimension>
|
|
|
|
ConnectivityType;
|
|
|
|
|
|
|
|
// TODO: This needs to change to a Vec-like that supports a max size.
|
|
|
|
// Likewise, all the GetCellsOfPoint methods need to use it as well.
|
2015-08-27 22:49:24 +00:00
|
|
|
typedef vtkm::VecVariable<vtkm::Id,ConnectivityType::MAX_CELL_TO_POINT>
|
|
|
|
IndicesType;
|
2015-08-11 05:38:23 +00:00
|
|
|
|
2015-07-31 21:48:06 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
2015-08-11 05:38:23 +00:00
|
|
|
static IndicesType GetIndices(const ConnectivityType &connectivity,
|
|
|
|
vtkm::Id pointIndex)
|
2015-07-31 21:48:06 +00:00
|
|
|
{
|
2015-08-11 05:38:23 +00:00
|
|
|
return connectivity.GetCellsOfPoint(pointIndex);
|
2015-07-31 21:48:06 +00:00
|
|
|
}
|
|
|
|
|
2015-08-11 05:38:23 +00:00
|
|
|
VTKM_EXEC_CONT_EXPORT
|
|
|
|
static vtkm::IdComponent GetNumberOfIndices(
|
|
|
|
const ConnectivityType &connectivity,
|
|
|
|
vtkm::Id pointIndex)
|
|
|
|
{
|
|
|
|
return connectivity.GetNumberOfCellsIncidentOnPoint(pointIndex);
|
|
|
|
}
|
2015-07-31 21:48:06 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
} // namespace vtkm::internal
|
|
|
|
|
|
|
|
#endif //vtk_m_internal_ConnectivityStructuredInternals_h
|