Commit 50bb275a authored by Charlles Abreu's avatar Charlles Abreu
Browse files

Continuous1DFunction evaluation with periodic=true

parent 1d5ee1a3
...@@ -238,11 +238,20 @@ void ExpressionUtilities::processExpression(stringstream& out, const ExpressionT ...@@ -238,11 +238,20 @@ void ExpressionUtilities::processExpression(stringstream& out, const ExpressionT
for (auto& suffix : suffixes) { for (auto& suffix : suffixes) {
out << "{\n"; out << "{\n";
if (dynamic_cast<const Continuous1DFunction*>(functions[i]) != NULL) { if (dynamic_cast<const Continuous1DFunction*>(functions[i]) != NULL) {
int periodic = functionParams[i][4];
if (periodic) {
out << "real x = " << getTempName(node.getChildren()[0], temps) << suffix << ";\n";
out << "x = (x - " << paramsFloat[0] << ")*" << paramsFloat[5]<< ";\n";
out << "x = (x - floor(x))*" << paramsFloat[6] << ";\n";
out << "int index = (int) (floor(x));\n";
}
else {
out << "real x = " << getTempName(node.getChildren()[0], temps) << suffix << ";\n"; out << "real x = " << getTempName(node.getChildren()[0], temps) << suffix << ";\n";
out << "if (x >= " << paramsFloat[0] << " && x <= " << paramsFloat[1] << ") {\n"; out << "if (x >= " << paramsFloat[0] << " && x <= " << paramsFloat[1] << ") {\n";
out << "x = (x - " << paramsFloat[0] << ")*" << paramsFloat[2] << ";\n"; out << "x = (x - " << paramsFloat[0] << ")*" << paramsFloat[2] << ";\n";
out << "int index = (int) (floor(x));\n"; out << "int index = (int) (floor(x));\n";
out << "index = min(index, (int) " << paramsInt[3] << ");\n"; out << "index = min(index, (int) " << paramsInt[3] << ");\n";
}
out << "float4 coeff = " << functionNames[i].second << "[index];\n"; out << "float4 coeff = " << functionNames[i].second << "[index];\n";
out << "real b = x-index;\n"; out << "real b = x-index;\n";
out << "real a = 1.0f-b;\n"; out << "real a = 1.0f-b;\n";
...@@ -253,6 +262,7 @@ void ExpressionUtilities::processExpression(stringstream& out, const ExpressionT ...@@ -253,6 +262,7 @@ void ExpressionUtilities::processExpression(stringstream& out, const ExpressionT
else else
out << nodeNames[j] << suffix << " = (coeff.y-coeff.x)*" << paramsFloat[2] << "+((1.0f-3.0f*a*a)*coeff.z+(3.0f*b*b-1.0f)*coeff.w)/" << paramsFloat[2] << ";\n"; out << nodeNames[j] << suffix << " = (coeff.y-coeff.x)*" << paramsFloat[2] << "+((1.0f-3.0f*a*a)*coeff.z+(3.0f*b*b-1.0f)*coeff.w)/" << paramsFloat[2] << ";\n";
} }
if (!periodic)
out << "}\n"; out << "}\n";
} }
else if (dynamic_cast<const Continuous2DFunction*>(functions[i]) != NULL) { else if (dynamic_cast<const Continuous2DFunction*>(functions[i]) != NULL) {
...@@ -844,6 +854,10 @@ vector<vector<double> > ExpressionUtilities::computeFunctionParameters(const vec ...@@ -844,6 +854,10 @@ vector<vector<double> > ExpressionUtilities::computeFunctionParameters(const vec
params[i].push_back(max); params[i].push_back(max);
params[i].push_back((values.size()-1)/(max-min)); params[i].push_back((values.size()-1)/(max-min));
params[i].push_back(values.size()-2); params[i].push_back(values.size()-2);
int periodic = (int) fn.getPeriodic();
params[i].push_back(periodic);
params[i].push_back(1.0/(max-min));
params[i].push_back(values.size()-1);
} }
else if (dynamic_cast<const Continuous2DFunction*>(functions[i]) != NULL) { else if (dynamic_cast<const Continuous2DFunction*>(functions[i]) != NULL) {
const Continuous2DFunction& fn = dynamic_cast<const Continuous2DFunction&>(*functions[i]); const Continuous2DFunction& fn = dynamic_cast<const Continuous2DFunction&>(*functions[i]);
......
...@@ -101,15 +101,29 @@ int ReferenceContinuous1DFunction::getNumArguments() const { ...@@ -101,15 +101,29 @@ int ReferenceContinuous1DFunction::getNumArguments() const {
double ReferenceContinuous1DFunction::evaluate(const double* arguments) const { double ReferenceContinuous1DFunction::evaluate(const double* arguments) const {
double t = arguments[0]; double t = arguments[0];
if (t < min || t > max) if (t < min || t > max) {
if (periodic) {
double L = max-min;
double s = (t-min)/L;
t = min + L*(s-floor(s));
}
else
return 0.0; return 0.0;
}
return SplineFitter::evaluateSpline(x, values, derivs, t); return SplineFitter::evaluateSpline(x, values, derivs, t);
} }
double ReferenceContinuous1DFunction::evaluateDerivative(const double* arguments, const int* derivOrder) const { double ReferenceContinuous1DFunction::evaluateDerivative(const double* arguments, const int* derivOrder) const {
double t = arguments[0]; double t = arguments[0];
if (t < min || t > max) if (t < min || t > max) {
if (periodic) {
double L = max-min;
double s = (t-min)/L;
t = min + L*(s-floor(s));
}
else
return 0.0; return 0.0;
}
return SplineFitter::evaluateSplineDerivative(x, values, derivs, t); return SplineFitter::evaluateSplineDerivative(x, values, derivs, t);
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment