35#include "Utility/Inform.h"
50 std::vector<double> getDeltaPos(
Mesh* mesh) {
53 for (
size_t i = 0; i < it.
getState().size(); ++i)
56 for (
size_t i = 0; i < pos2.size(); ++i)
63 Mesh* points, std::vector<std::vector<double> > values,
int polyPatchOrder,
65 : polyPatchOrder_m(polyPatchOrder),
66 smoothingOrder_m(smoothingOrder),
79 if (points ==
nullptr) {
84 ss <<
"Mismatch between Mesh and values in Solve. Mesh size was "
85 << points->
end().
toInteger() <<
" but field values size was " << values.size();
88 if (smoothingOrder < polyPatchOrder) {
90 "PPSolveFactory::Solve",
91 "Polynomial order must be <= smoothing order in Solve");
99 edgePoints_m = std::vector<std::vector<std::vector<int> > >(posDim + 1);
100 for (
int i = 1; i <= posDim; ++i)
107 std::vector<int> state = outOfBoundsIt.
getState();
108 std::vector<int> delta = std::vector<int>(state.size(), 2);
112 for (
size_t i = 0; i < state.size(); ++i)
115 }
else if (state[i] > end[i]) {
120 for (
size_t i = 0; i < state.size(); ++i)
122 position[i] = (pos2[i] - pos1[i]) * (state[i] - 1) + position[i];
123 }
else if (state[i] > end[i]) {
124 position[i] = (pos2[i] - pos1[i]) * (state[i] - end[i]) + position[i];
131 std::vector<std::vector<int> > dataPoints =
133 thisPoints_m = std::vector<std::vector<double> >(dataPoints.size());
134 std::vector<double> deltaPos = getDeltaPos(
points_m);
137 for (
size_t i = 0; i < dataPoints.size(); ++i) {
139 for (
int j = 0; j < posDim; ++j)
140 thisPoints_m[i][j] = (0.5 - dataPoints[i][j]) * deltaPos[j];
147 std::vector<std::vector<int> > dataPoints =
149 size_t dataPointsSize = dataPoints.size();
153 for (
size_t i = 0; i < dataPointsSize; ++i) {
154 std::vector<int> itState = it.
getState();
155 for (
int j = 0; j < posDim; ++j)
158 bool outOfBounds =
false;
159 for (
int j = 0; j < posDim; ++j) {
160 itCurrent[j] -= dataPoints[i][j];
161 outOfBounds = outOfBounds || itCurrent[j] < 1 || itCurrent[j] > end[j];
179 if (deltaOrder <= 0)
return;
180 std::vector<double> deltaPos = getDeltaPos(
points_m);
185 std::vector<int> equalAxes;
188 std::vector<std::vector<int> > edgePoints =
edgePoints_m[equalAxes.size()];
190 for (
size_t j = 0; j < edgePoints.size(); ++j) {
198 for (
size_t k = 0; k < edgePoints[j].size(); ++k) {
209 for (
int j = 0; j < nPolyCoeffs; ++j) {
212 for (
int l = 0; l < posDim; ++l) {
213 int pow = pVec[l] - qVec[l];
228 bool verbose =
false;
230 std::cerr <<
"PPSolveFactory::GetDerivs at position ";
232 std::cerr << p <<
" ";
234 std::cerr << std::endl;
246 if (deltaOrder <= 0) {
251 bool inTheMesh =
true;
252 for (
int j = 0; j < posDim && inTheMesh; ++j) {
254 inTheMesh = nearest[j] <= last[j];
263 for (
int j = 0; j < posDim; ++j) {
269 std::cerr <<
"Point ";
271 std::cerr << p <<
" ";
273 std::cerr <<
" values ";
275 std::cerr << v <<
" ";
277 std::cerr <<
" derivIndices ";
279 std::cerr << in <<
" ";
281 std::cerr << std::endl;
291 polynomials_m = std::vector<SquarePolynomialVector*>(meshSize,
nullptr);
299 double oldPercentage = 0.;
301 double newPercentage = (total - it.toInteger()) /
double(total) * 100.;
302 if (newPercentage - oldPercentage > 10.) {
303 *
gmsg <<
" Done " << newPercentage <<
" %" << endl;
304 oldPercentage = newPercentage;
316 std::vector<int> check,
size_t checkIndex,
size_t polyPower,
317 std::vector<std::vector<int> >& nearbyPoints) {
318 check[checkIndex] = polyPower;
319 nearbyPoints.push_back(check);
320 if (checkIndex + 1 == check.size())
return;
321 for (
int i = 1; i < int(polyPower); ++i)
323 for (
int i = 0; i <= int(polyPower); ++i) {
324 check[checkIndex] = i;
330 int pointDim,
int polyOrderLower,
int polyOrderUpper) {
333 "PPSolveFactory::getNearbyPointsSquares",
"Point dimension must be > 0"));
334 if (polyOrderLower > polyOrderUpper)
336 "PPSolveFactory::getNearbyPointsSquares",
337 "Polynomial lower bound must be <= polynomial upper bound"));
339 if (polyOrderUpper == polyOrderLower || polyOrderUpper < 0)
340 return std::vector<std::vector<int> >();
342 std::vector<std::vector<int> > nearbyPoints(1, std::vector<int>(pointDim, 0));
344 for (
size_t thisPolyOrder = 0; thisPolyOrder < size_t(polyOrderUpper); ++thisPolyOrder)
346 if (polyOrderLower < 0)
return nearbyPoints;
347 int nPointsLower = 1;
348 for (
int dim = 0; dim < pointDim; ++dim)
349 nPointsLower *= polyOrderLower + 1;
350 nearbyPoints.erase(nearbyPoints.begin(), nearbyPoints.begin() + nPointsLower);
double gsl_sf_fact(unsigned int n)
Factorial (computed via for large ).
double gsl_sf_pow_int(double x, int n)
Integer power .
virtual void getPosition(double *point) const
std::vector< int > getState() const
const Mesh * getMesh() const
Base class for meshing routines.
virtual int getPositionDimension() const =0
virtual Mesh * dual() const =0
virtual Mesh::Iterator end() const =0
virtual Mesh::Iterator begin() const =0
std::vector< std::vector< int > > derivOrigins_m
std::vector< std::vector< double > > values_m
std::vector< std::vector< double > > derivPoints_m
static void nearbyPointsRecursive(std::vector< int > check, size_t checkIndex, size_t polyPower, std::vector< std::vector< int > > &nearbyPoints)
std::vector< std::vector< double > > thisValues_m
PPSolveFactory(Mesh *points, std::vector< std::vector< double > > values, int polyPatchOrder, int smoothingOrder)
void getValues(Mesh::Iterator it)
std::vector< SquarePolynomialVector * > polynomials_m
std::vector< std::vector< double > > thisPoints_m
std::vector< double > outOfBoundsPosition(Mesh::Iterator outOfBoundsIt)
std::vector< std::vector< int > > derivIndices_m
static std::vector< std::vector< int > > getNearbyPointsSquares(int pointDim, int polyOrderLower, int polyOrderUpper)
void getDerivs(const Mesh::Iterator &it)
std::vector< std::vector< double > > derivValues_m
std::vector< std::vector< int > > smoothingPoints_m
PolynomialPatch * solve()
std::vector< MVector< double > > derivPolyVec_m
std::vector< std::vector< std::vector< int > > > edgePoints_m
PolynomialCoefficient represents a coefficient in a multi-dimensional polynomial.
Patches together many SquarePolynomialVectors to make a multidimensional polynomial spline.
SolveFactory is a factory class for solving a set of linear equations to generate a polynomial based ...
SquarePolynomialVector * PolynomialSolve(const std::vector< std::vector< double > > &values, const std::vector< std::vector< double > > &deriv_values)
static unsigned int NumberOfPolynomialCoefficients(int pointDimension, int order)
static std::vector< int > IndexByPower(int index, int nInputVariables)
PolynomialCoefficient Coeff