Program Listing for File SimpleQuadrature.cpp
↰ Return to documentation for file (SPlisHSPlasH/Utilities/SimpleQuadrature.cpp)
#include "SimpleQuadrature.h"
#include <algorithm>
#include <numeric>
#include <iostream>
#include "Utilities/Logger.h"
using namespace SPH;
std::vector<Eigen::Vector3d> SimpleQuadrature::m_samplePoints;
double SimpleQuadrature::m_volume = 0.0;
double SimpleQuadrature::integrate(Integrand integrand)
{
double res = 0.0;
for (unsigned int i = 0; i < m_samplePoints.size(); i++)
{
res += m_volume * integrand(m_samplePoints[i].cast<double>());
}
return res;
}
void SPH::SimpleQuadrature::determineSamplePointsInSphere(const double radius, unsigned int p)
{
if (p < 1)
p = 1;
m_samplePoints.clear();
m_samplePoints.reserve(p*p*p);
const double radius2 = radius*radius;
const double stepSize = 2.0 * radius / (double)p;
const double start = -radius + 0.5*stepSize;
m_volume = stepSize*stepSize*stepSize;
Eigen::Vector3d pos;
pos[0] = start;
for (unsigned int i = 0; i < p; i++)
{
pos[1] = start;
for (unsigned int j = 0; j < p; j++)
{
pos[2] = start;
for (unsigned int k = 0; k < p; k++)
{
// test if sample point is in support radius and if it is not the origin
const double pn = pos.squaredNorm();
if (pn < radius2)
{
m_samplePoints.push_back(pos);
}
pos[2] += stepSize;
}
pos[1] += stepSize;
}
pos[0] += stepSize;
}
}
void SPH::SimpleQuadrature::determineSamplePointsInCircle(const double radius, unsigned int p)
{
if (p < 1)
p = 1;
m_samplePoints.clear();
m_samplePoints.reserve(p*p);
const double radius2 = radius*radius;
const double stepSize = 2.0 * radius / (double)p;
const double start = -radius + 0.5*stepSize;
m_volume = stepSize*stepSize;
Eigen::Vector3d pos;
pos[0] = start;
for (unsigned int i = 0; i < p; i++)
{
pos[1] = start;
for (unsigned int j = 0; j < p; j++)
{
pos[2] = 0.0;
// test if sample point is in support radius and if it is not the origin
const double pn = pos.squaredNorm();
if (pn < radius2)
{
m_samplePoints.push_back(pos);
}
pos[1] += stepSize;
}
pos[0] += stepSize;
}
LOG_INFO << "Number of sampling points: " << m_samplePoints.size() << "\n";
}