vtk-m/vtkm/source/Amr.cxx

112 lines
3.2 KiB
C++
Raw Normal View History

2021-12-13 16:33:47 +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.
//============================================================================
#include <vtkm/cont/PartitionedDataSet.h>
#include <vtkm/filter/AmrArrays.h>
#include <vtkm/filter/CellAverage.h>
#include <vtkm/source/Amr.h>
#include <vtkm/source/Wavelet.h>
namespace vtkm
{
namespace source
{
Amr::Amr(vtkm::IdComponent dimension,
vtkm::IdComponent cellsPerDimension,
vtkm::IdComponent numberOfLevels)
: Dimension(dimension)
, CellsPerDimension(cellsPerDimension)
, NumberOfLevels(numberOfLevels)
{
}
Amr::~Amr() = default;
template <vtkm::IdComponent Dim>
vtkm::cont::DataSet Amr::GenerateDataSet(unsigned int level, unsigned int amrIndex) const
{
vtkm::Id3 extent = { vtkm::Id(this->CellsPerDimension / 2) };
vtkm::Id3 dimensions = { this->CellsPerDimension + 1 };
vtkm::Vec3f origin = { float(1. / pow(2, level) * amrIndex) };
vtkm::Vec3f spacing = { float(1. / this->CellsPerDimension / pow(2, level)) };
vtkm::Vec3f center = 0.5f - (origin + spacing * extent);
vtkm::Vec3f frequency = { 60.f, 30.f, 40.f };
frequency = frequency * this->CellsPerDimension;
vtkm::FloatDefault deviation = 0.5f / this->CellsPerDimension;
if (Dim == 2)
{
extent[2] = 0;
dimensions[2] = 1;
origin[2] = 0;
spacing[2] = 1;
center[2] = 0;
}
vtkm::source::Wavelet waveletSource(-extent, extent);
waveletSource.SetOrigin(origin);
waveletSource.SetSpacing(spacing);
waveletSource.SetCenter(center);
waveletSource.SetFrequency(frequency);
waveletSource.SetStandardDeviation(deviation);
vtkm::cont::DataSet wavelet = waveletSource.Execute();
vtkm::filter::CellAverage cellAverage;
cellAverage.SetActiveField("RTData", vtkm::cont::Field::Association::POINTS);
cellAverage.SetOutputFieldName("RTDataCells");
return cellAverage.Execute(wavelet);
}
vtkm::cont::PartitionedDataSet Amr::Execute() const
{
assert(this->CellsPerDimension > 1);
assert(this->CellsPerDimension % 2 == 0);
// Generate AMR
std::vector<std::vector<vtkm::Id>> blocksPerLevel(this->NumberOfLevels);
unsigned int counter = 0;
for (unsigned int l = 0; l < blocksPerLevel.size(); l++)
{
for (unsigned int b = 0; b < pow(2, l); b++)
{
blocksPerLevel.at(l).push_back(counter++);
}
}
vtkm::cont::PartitionedDataSet amrDataSet;
// Fill AMR with data from the wavelet
for (unsigned int l = 0; l < blocksPerLevel.size(); l++)
{
for (unsigned int b = 0; b < blocksPerLevel.at(l).size(); b++)
{
if (this->Dimension == 2)
{
amrDataSet.AppendPartition(this->GenerateDataSet<2>(l, b));
}
else if (this->Dimension == 3)
{
amrDataSet.AppendPartition(this->GenerateDataSet<3>(l, b));
}
}
}
// Generate helper arrays
vtkm::filter::AmrArrays amrArrays;
amrDataSet = amrArrays.Execute(amrDataSet);
return amrDataSet;
}
} // namespace source
} // namespace vtkm