1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkHyperTreeGridTotalVisibleVolumeStrategy.h"
#include "vtkBitArray.h"
#include "vtkCellData.h"
#include "vtkDoubleArray.h"
#include "vtkHyperTreeGridNonOrientedGeometryCursor.h"
#include "vtkIndexedArray.h"
VTK_ABI_NAMESPACE_BEGIN
vtkStandardNewMacro(vtkHyperTreeGridTotalVisibleVolumeStrategy);
//------------------------------------------------------------------------------
vtkHyperTreeGridTotalVisibleVolumeStrategy::vtkHyperTreeGridTotalVisibleVolumeStrategy() = default;
//------------------------------------------------------------------------------
vtkHyperTreeGridTotalVisibleVolumeStrategy::~vtkHyperTreeGridTotalVisibleVolumeStrategy() = default;
//------------------------------------------------------------------------------
void vtkHyperTreeGridTotalVisibleVolumeStrategy::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "TotalVisibleVolume: " << this->TotalVisibleVolume << "\n";
os << indent << "TotalVisibleVolumeArray size: "
<< (this->TotalVisibleVolumeArray ? this->TotalVisibleVolumeArray->GetNumberOfTuples() : 0)
<< "\n";
}
//------------------------------------------------------------------------------
bool vtkHyperTreeGridTotalVisibleVolumeStrategy::Initialize(
std::unordered_map<std::string, Field> fieldMap)
{
if (!fieldMap["ValidCell"].enabled || !fieldMap["CellSize"].enabled)
{
vtkWarningMacro("ValidCell and CellSize arrays must be enabled to compute TotalVisibleVolume");
return false;
}
this->TotalVisibleVolume = 0;
this->TotalVisibleVolumeArray->SetNumberOfComponents(1);
this->TotalVisibleVolumeArray->SetNumberOfTuples(1);
this->TotalVisibleVolumeArray->SetName(this->ArrayName.c_str());
return true;
}
//------------------------------------------------------------------------------
void vtkHyperTreeGridTotalVisibleVolumeStrategy::Compute(
vtkHyperTreeGridNonOrientedGeometryCursor* cursor, vtkCellData* cellData,
std::unordered_map<std::string, Field> fieldMap)
{
vtkAbstractArray* validCellArray = cellData->GetAbstractArray(fieldMap["ValidCell"].name.c_str());
vtkAbstractArray* cellSizeArray = cellData->GetAbstractArray(fieldMap["CellSize"].name.c_str());
if (!validCellArray || !cellSizeArray)
{
vtkLogF(ERROR, "ValidCell and CellSize arrays are required to compute TotalVisibleVolume!");
return;
}
auto validCellBoolArray = vtkBitArray::SafeDownCast(validCellArray);
// Type may change depending on the number of values
auto cellSizeIndexedArray = vtkIndexedArray<double>::SafeDownCast(cellSizeArray);
auto cellSizeDoubleArray = vtkDoubleArray::SafeDownCast(cellSizeArray);
const vtkIdType currentId = cursor->GetGlobalNodeIndex();
if (validCellBoolArray->GetValue(currentId))
{
this->TotalVisibleVolume += cellSizeIndexedArray ? cellSizeIndexedArray->GetValue(currentId)
: cellSizeDoubleArray->GetValue(currentId);
}
}
//------------------------------------------------------------------------------
vtkDataArray* vtkHyperTreeGridTotalVisibleVolumeStrategy::GetAndFinalizeArray()
{
this->TotalVisibleVolumeArray->SetTuple1(0, this->TotalVisibleVolume);
return this->TotalVisibleVolumeArray;
}
VTK_ABI_NAMESPACE_END
|