Skip to content
Snippets Groups Projects
Commit 36c4b40a authored by Claudio Scafuri's avatar Claudio Scafuri :speech_balloon:
Browse files

debian 12, restructured

parent 086c85a2
No related branches found
No related tags found
No related merge requests found
Showing with 1117 additions and 1230 deletions
......@@ -40,10 +40,17 @@ DEBUG = -ggdb3
RANLIB = ranlib
#OPTIM = -O2
INCLUDE = -I.
INCLUDE = -I include
CXXFLAGS += -std=c++17 -fPIC -D_REENTRANT $(DEBUG) $(OPTIM) $(WARN) $(INCLUDE)
CFLAGS = $(CXXFLAGS)
PROJECTHOME = .
SRC_DIR = src
OBJ_DIR = obj
TEST_DIR = test
TEST_OBJ_DIR = test_obj
TEST_RUNNER = test_runner
##############################################
# support for shared libray versioning
#
......@@ -84,9 +91,12 @@ LOCALDESTDIRHEADERS = $(LOCALPREFIX)/include
# header files to be installed for distribution
INSTHEADERS = periodicspline.h spline.h multipolynomial.h interpolatingpolynomial.h interpolator.h
################################################
SRCS = $(wildcard $(SRC_DIR)/*.cpp)
OBJS = $(patsubst $(SRC_DIR)/%.cpp, $(OBJ_DIR)/%.o, $(SRCS))
OBJS = periodicspline.o spline.o multipolynomial.o interpolator.o
TEST_SRCS = test_src/test_runner.cpp
TEST_OBJS = test_obj/test_runner.o
########################################################################################
# compiler warnings
......@@ -97,48 +107,59 @@ WARN+= -pedantic -Wno-long-long # test with mysql due to long long variables!
#######################################
#options for coverage and performance analysis
#DEBUG += -fprofile-arcs -ftest-coverage -pg
#LDFLAGS += -fprofile-arcs -ftest-coverage -pg
DEBUG += -fprofile-arcs -ftest-coverage -pg
LDFLAGS += -fprofile-arcs -ftest-coverage -pg
#####################################
# Compile source files to object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
@mkdir -p $(OBJ_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
all: lib libstatic test
lib: $(PROJECTHOME)/lib/$(DT_SHLIB)
libstatic: $(PROJECTHOME)/lib/$(LIBRARY)
check: check_spline check_multipoly
# Compile test source files to object files
$(TEST_OBJ_DIR)/%.o: $(TEST_DIR)/%.cpp
@mkdir -p $(TEST_OBJ_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
$(TEST_OBJS): $(TEST_SRCS)
$(CXX) $(CXXFLAGS) -c $< -o $@
# Test target: compile and link the test executable
test: $(TEST_OBJS) $(OBJS)
$(info [$(TEST_OBJS)])
$(info [$(TEST_SRCS)])
$(info [$(OBJS)])
$(CXX) $(CXXFLAGS) $(TEST_OBJS) $(OBJS) -o $(TEST_RUNNER)
./$(TEST_RUNNER)
test: test_spline test_inverse test_freespline test_multipoly test_periodicspline spltest
test_spline: test_spline.o spline.o interpolator.o
all: lib libstatic
test_inverse: test_inverse.o spline.o interpolator.o
lib: $(PROJECTHOME)/lib/$(DT_SHLIB)
test_freespline: test_freespline.o spline.o interpolator.o
libstatic: $(PROJECTHOME)/lib/$(LIBRARY)
test_periodicspline: test_periodicspline.o periodicspline.o interpolator.o
check: test
gcov test_src/test_runner.cpp
gcov src/spline.cpp
gcov src/interpolator.cpp
gcov src/multipolynomial.cpp
gcov src/peridocspline.cpp
valgrind --num-callers=20 --leak-check=yes --leak-resolution=high --leak-check=full --show-reachable=yes --log-file=test_runner.grind ./test_runner
spltest: spltest.o spline.o interpolator.o
test_multipoly: test_multipoly.o multipolynomial.o interpolator.o
check_spline: test_spline
check_exec: test_runner
./test_spline
gcov test_spline.cpp
gcov spline.cpp
gcov interpolator.cpp
gcov test_src/test_runner.cpp
gcov src/spline.cpp
gcov src/interpolator.cpp
gcov src/multipolynomial.cpp
gcov src/peridocspline.cpp
valgrind --num-callers=20 --leak-check=yes --leak-resolution=high --leak-check=full --show-reachable=yes --log-file=test_spline.grind ./test_spline
check_multipoly: test_multipoly
gcov test_multipoly.cpp
gcov multipoly.cpp
gcov interpolator.cpp
valgrind --num-callers=20 --leak-check=yes --leak-resolution=high --leak-check=full --show-reachable=yes --log-file=test_multipoly.grind ./test_multipoly
$(PROJECTHOME)/lib/$(LIBRARY):$(OBJS) $(MAKEFILE)
# @echo "Archiving $(LIBRARY) ... $(OBJS)"
mkdir -p -m 755 $(PROJECTHOME)/lib
......@@ -160,7 +181,10 @@ doc:
docclean:
rm -rf docs doxy.log
clean:
rm -f *.o core* *.gcov *.gcno *.gcda *.grind *grind.core.* *.valgrind dump* gmon.out doxygen_log.txt dump* *.csv
rm -rf $(OBJ_DIR)
rm -rf $(TEST_RUNNER)
rm -rf $(TEST_OBJS)
rm -f *.o core* *.gcov *.gcno *.gcda *.grind *grind.core.* *.valgrind dump* gmon.out doxygen_log.txt dump* *.csv perf.data
rm -f test_spline test_inverse test_periodicspline test_freespline test_multipoly test_magnets test_dipole test_quadrupole test_sextupole test_kicker test_solenoid spltest
rm -f *.csv
rm -f doxy.log
......
File moved
File moved
File moved
File moved
File moved
/* $Author: claudio $
*
* $Revision: 1.1.1.1 $
*
* $Log: spltest.cpp,v $
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*/
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include "spline.h"
using namespace std;
using namespace Interpolator;
int main(){
try{
double i_qd[]={0.0,14.8056,74.028,148.056,222.084,296.112,333.126,370.14};
double g_qd[]={0.0,0.7745,3.9519,7.9231,11.8187,15.7069,17.5649,19.2667};
// doubleVector iqd;
// doubleVector fieldqd;
vector<double> iqd;
vector<double> fieldqd;
//controle printout of table
int PRECISION=16;
int WIDTH=20;
for (unsigned int i=0;i<8;i++){
iqd.push_back(i_qd[i]);
fieldqd.push_back(g_qd[i]);
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << iqd[i];
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << fieldqd[i] << endl;
}
Spline* dir= new Spline(iqd,fieldqd);
Spline* inv= new Spline(fieldqd,iqd);
double min=0.0,max=i_qd[7];
unsigned int steps=200;
double mincur=min;
double inccur=(max-min)/steps;
double I,g,inv_I;
cout << setw(WIDTH) << right;
cout << "I";
cout << setw(WIDTH) << right;
cout << "g" ;
cout << setw(WIDTH) << right;
cout << "inv_I" ;
cout << endl;
for(unsigned int i=0;i<=steps;i++){
I=mincur+ i*inccur;
g=dir->evaluate(I);
inv_I=inv->evaluate(g);
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << I;
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << g;
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << inv_I;
if(I != 0.0) {
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << 10000.0*((I-inv_I)/I);
}
else{
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << 0.0;
}
// if(dir->bracket(g,I,1.0e-4,xmin,xmax)){
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << xmin;
//
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << xmax;
//
// double I2=dir->solve(g,xmin,xmax,1.0e-8,100);
//
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << I2;
//
// }
// else{
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << "------";
//
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << "++++++";
//
// cout << setprecision(PRECISION) << setw(WIDTH) << right;
// cout << "//////";
// }
{
double I2=dir->inverse_evaluate(g,I);
cout << setprecision(PRECISION) << setw(WIDTH) << right;
cout << I2;
}
cout << endl;
}
delete inv;
delete dir;
}
catch(std::invalid_argument& ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
File moved
File moved
File moved
File moved
/*
* program to test spline class
*
* $Author: claudio $
*
* $Revision: 1.1.1.1 $
*
* $Log: test_freespline.cpp,v $
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*
*/
#include <iostream>
#include <fstream>
#include "spline.h"
#include <cmath>
using namespace std;
using namespace Interpolator;
int main(){
cout<< "test of Spline interpolator class" << endl;
doubleVector x0,y0;
const int NP=30;
for(int i=0; i < NP; i++){
x0.push_back(i*i*.02);
y0.push_back(sin(i*i*.02));
}
Spline* test_spline = new Spline(x0,y0,NAN,0.0);
{
doubleVector a;
vector<double> b;
test_spline->get_base_points(a,b);
cout<<"test get_base_points()"<<endl;
for(int i=0; i < NP; i++ )
if((x0[i] != a[i]) ||(y0[i] != b[i])){
cout << i << " " << x0[i] << " " << a[i] << " | "<< y0[i] << " " << b[i] << endl;
return -1;
}
}
{
cout << "test get_range()" << endl;
double minx,maxx;
test_spline->get_range(minx,maxx);
if( (minx != x0[0]) || (maxx != x0[NP-1]) ){
cout << minx << " " << x0[0] << " | " << maxx << " " << x0[NP-1] << endl;
return -1;
}
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{ cout << "test evaluate()for plot" << endl;
doubleVector X;
doubleVector Y;
double range=x0[NP-1];
double nsteps=300;
for(int i=0;i<=nsteps;i++){
X.push_back((range*i)/nsteps);
Y.push_back(test_spline->evaluate(X[i]));
}
//print out data
cout<<"---------------------------"<<endl;
for(int i=0; i < NP; i++) cout<<x0[i]<<"\t"<<y0[i]<<endl;
cout<<"---------------------------"<<endl;
for(int i=0; i < nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"+++++++++++++++++++++++++++"<<endl;
}
{
cout << "test evaluate()for doubleVector" << endl;
doubleVector X;
doubleVector Y;
double range=x0[NP-1];
double nsteps=300;
for(int i=0;i<=nsteps;i++)
X.push_back((range*i)/nsteps);
Y=test_spline->evaluate(X);
//print out data
cout<<"###########################"<<endl;
for(int i=0; i < nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"***************************"<<endl;
}
{
cout << "test range exception" << endl;
try{
test_spline->evaluate(-10.0);
cerr << "range_error not thrown!" << endl;
}
catch(std::range_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with unequal lengths" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.0);
y.push_back(4.0);
y.push_back(5.0);
Spline spl(x,y,NAN,0.0);
cerr << "length_error not thrown!" << endl;
}
catch(std::length_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with out of order data" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(1.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
Spline spl(x,y,NAN,0.0);
cerr << "domain_error not thrown!" << endl;
}
catch(std::domain_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "Test copy constructor" << endl;
Spline copy_spline(*test_spline);
double minx,maxx,copyminx,copymaxx;
test_spline->get_range(minx,maxx);
copy_spline.get_range(copyminx,copymaxx);
if( (minx != copyminx) || (maxx != copymaxx) ){
cerr << "COPY FAILED!" << endl;
return -1;
}
double range=x0[NP-1];
double nsteps=100;
for(int i=0;i<nsteps;i++){
double val=(range*i)/nsteps;
double y,ycopy;
ycopy=copy_spline.evaluate(val);
y=test_spline->evaluate(val);
if(y != ycopy){
cerr << "COPY FAILED " << val << " " << y << " " << ycopy << endl;
}
}
}
{
cout << "Test copy assignment operator" << endl;
Spline oper_spline=*test_spline;
double minx,maxx,operminx,opermaxx;
test_spline->get_range(minx,maxx);
oper_spline.get_range(operminx,opermaxx);
if( (minx != operminx) || (maxx != opermaxx) ){
cerr << "ASSIGN COPY FAILED!" << endl;
return -1;
}
double range=x0[NP-1];
double nsteps=100;
for(int i=0;i<nsteps;i++){
double val=(range*i)/nsteps;
double y,yoper;
yoper=oper_spline.evaluate(val);
y=test_spline->evaluate(val);
if(y != yoper){
cerr << "COPY FAILED " << val << " " << y << " " << yoper << endl;
}
}
}
cout << "test delete" << endl;
delete test_spline;
{
cout << "test leaks - new/delete" << endl;
Spline *dynspl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
dynspl = new Spline(x,y,NAN,0.0);
delete dynspl;
}
}
{
cout << "test leaks - stack" << endl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
Spline stspl(x,y,NAN,0.0);
}
}
{
cout <<"test end conditions" << endl;
std::ofstream outfile;
outfile.open("splineval.csv",ios::out); //CHECK success
if ( (outfile.rdstate() & ifstream::failbit ) != 0 ) return -1;
doubleVector x,y;
x.push_back(0.0);y.push_back(0.0);
x.push_back(1.0);y.push_back(1.0);
x.push_back(1.5);y.push_back(1.0);
x.push_back(2.0);y.push_back(1.0);
x.push_back(3.0);y.push_back(0.0);
Spline nsp(x,y); //natural spline
Spline zsp(x,y,0.0,0.0); // spline with 0 derivate start and stop
Spline nzsp(x,y,NAN,0.0); // spline with 0 derivate at stop
Spline znsp(x,y,0.0,NAN); // spline with 0 derivate at start
Spline ddsp(x,y,-0.5,0.5); // spline with derivatives at start and stop
double X;
double Yn,Yz,Ynz,Yzn,Ydd;
double range=3.0;
int nsteps=300;
for(int i=0;i<=nsteps;i++){
X=((range*i)/nsteps);
Yn=nsp.evaluate(X);
Yz=zsp.evaluate(X);
Ynz=nzsp.evaluate(X);
Yzn=znsp.evaluate(X);
Ydd=ddsp.evaluate(X);
outfile<< X << "\t\t" << Yn << "\t\t" << Yz << "\t\t" << Ynz << "\t\t" << Yzn << "\t\t" << Ydd << std::endl;
}
outfile.close();
}
return 0;
}
/*
* program to test spline classes
*
* $Author: claudio $
*
* $Revision: 1.1 $
*
* $Log: test_inverse.cpp,v $
* Revision 1.1 2017-03-03 15:32:40 claudio
* correctetd spline::inverse_calculate if returned value is at range limit
*
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*
*/
#include <iostream>
#include "spline.h"
#include <cmath>
//#include <stdexcept>
using namespace std;
using namespace Interpolator;
int main(){
cout << "test spline::inverse_evaluate" << endl;
{
doubleVector x,y;
x.push_back(10.0); y.push_back(83.6);
x.push_back(12); y.push_back(68.3);
x.push_back( 14); y.push_back( 55.7);
x.push_back( 16); y.push_back(45.5);
x.push_back( 18); y.push_back(37.3);
x.push_back( 20); y.push_back(30.7);
x.push_back( 22); y.push_back( 25.4);
x.push_back( 24); y.push_back( 21.2);
x.push_back( 26); y.push_back( 17.9);
x.push_back( 28); y.push_back( 15.2);
x.push_back( 30); y.push_back( 13.1);
x.push_back( 32); y.push_back( 11.4);
x.push_back( 34); y.push_back( 10.1);
x.push_back( 36); y.push_back( 9);
x.push_back( 40); y.push_back( 7.5);
x.push_back( 50); y.push_back( 5.77);
Spline *lambdasplie = new Spline(x,y);
double gmin,gmax;
lambdasplie->get_range(gmin,gmax);
double max = lambdasplie->evaluate(gmin);
double min = lambdasplie->evaluate(gmax);
double initial=min +((max-min)/2);
double l=min;
double gap, linv;
cout << "l\tgap\tlinverse" << endl;
cout.precision(8);
while (l<max){
gap = lambdasplie->inverse_evaluate(l,initial);
linv = lambdasplie->evaluate(gap);
cout << l <<"\t" << gap << "\t" << linv <<endl;
l+=0.05;
}
delete lambdasplie;
}
return 0;
}
/*
* program to test multipolynomial class
*
* $Author: claudio $
*
* $Revision: 1.1.1.1 $
*
* $Log: test_multipoly.cpp,v $
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*/
#include <iostream>
#include "multipolynomial.h"
using namespace std;
using namespace Interpolator;
int main(){
cout << "test of multiPolynomial interpolator class" << endl;
try{
//create interpolating polynomials
InterpolatingPolynomial p0,p1,p2;
p0.xMin=0.5;
p0.xMax=1.5;
p0.coefficient.push_back(1.1);
p1.xMin=1.5;
p1.xMax=2.5;
p1.coefficient.push_back(1.1);
p1.coefficient.push_back(2.2);
p2.xMin=2.5;
p2.xMax=3.5;
p2.coefficient.push_back(1.1);
p2.coefficient.push_back(2.2);
p2.coefficient.push_back(3.3);
//stuff polynomial into vector
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
pvector.push_back(p1);
pvector.push_back(p2);
multiPolynomial *multipoly = new multiPolynomial(pvector);
double minX,maxX;
multipoly->get_range(minX,maxX);
if( (minX != p0.xMin) || ( maxX != p2.xMax) ){
cout << "multiPoly.get_range(): error " << minX << " " << maxX << " " << p0.xMin << " " << p2.xMax << endl;
return -1; //stop further testing
}
delete multipoly;
}
catch(...){
cerr << " unexpected excpetion!" << endl;
return -1;
}
{
cout << "test a single 2nd degree polynomial " << endl;
try{
InterpolatingPolynomial p0;
p0.xMin=0.0;
p0.xMax=4.0;
p0.coefficient.push_back(0.0); //a0
p0.coefficient.push_back(0.0); //a1
p0.coefficient.push_back(1.0); //a2 --> Y=X*X
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
multiPolynomial *multipoly = new multiPolynomial(pvector);
double v=0.0,y;
y=multipoly->evaluate(v); if( y != 0.0 ){ cerr << "value not correct (0.0): " << y << endl; return -1; }
v=1.0;
y=multipoly->evaluate(v); if( y != 1.0 ){ cerr << "value not correct (1.0): " << y << endl; return -1; }
v=4.0;
y=multipoly->evaluate(v); if( y != 16.0 ){ cerr << "value not correct (16.0): " << y << endl; return -1; }
doubleVector X;
for (int i=0; i<=400;i++) X.push_back(i/100.0); //create range for testing
doubleVector Y=multipoly->evaluate(X);
cout << "----------------------------------" << endl;
for (unsigned int i=0; i < X.size(); i++) cout << X[i] << "\t" << Y[i] << endl;
cout << "----------------------------------" << endl;
delete multipoly;
}
catch(std::range_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
catch(std::length_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
try{
//create interpolating polynomials
cout << "test non contiguos" << endl;
InterpolatingPolynomial p0,p1,p2;
p0.xMin=0.5;
p0.xMax=1.5;
p0.coefficient.push_back(1.1);
p1.xMin=1.6; // <-------
p1.xMax=2.5;
p1.coefficient.push_back(1.1);
p1.coefficient.push_back(2.2);
p2.xMin=2.5;
p2.xMax=3.5;
p2.coefficient.push_back(1.1);
p2.coefficient.push_back(2.2);
p2.coefficient.push_back(3.3);
//stuff polynomial into vector
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
pvector.push_back(p1);
pvector.push_back(p2);
multiPolynomial *multipoly = new multiPolynomial(pvector);
delete multipoly;
}
catch(std::domain_error& ex){
cout << "OK expected exception: " << ex.what() << endl;
}
catch(...){
cerr << " unexpected excpetion!" << endl;
return -1;
}
try{
//create interpolating polynomials
cout << "test 3 polynomials" << endl;
InterpolatingPolynomial p0,p1,p2;
p0.xMin=0.0;
p0.xMax=1.5;
p0.coefficient.push_back(1.0); //c[0]
p1.xMin=1.5;
p1.xMax=2.5;
p1.coefficient.push_back(0.0); //c[0]
p1.coefficient.push_back(0.0); //c[1]
p1.coefficient.push_back(1.0); //c[2]
p2.xMin=2.5;
p2.xMax=3.5;
p2.coefficient.push_back(5.0); //c[0]
p2.coefficient.push_back(-2.0); //c[1]
//stuff polynomial into vector
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
pvector.push_back(p1);
pvector.push_back(p2);
multiPolynomial *multipoly = new multiPolynomial(pvector);
doubleVector X;
for (int i=0; i<=350;i++) X.push_back(i/100.0); //create range for testing
doubleVector Y=multipoly->evaluate(X);
cout << "-+++++++++++++++++++++++++++++++++" << endl;
for (unsigned int i=0; i < X.size(); i++) cout << X[i] << "\t" << Y[i] << endl;
cout << "++++++++++++++++++++++++++++++++++" << endl;
delete multipoly;
}
catch(std::domain_error& ex){
cout << "unexpected exception: " << ex.what() << endl;
return -1;
}
catch(std::range_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
catch(std::length_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
catch(...){
cerr << " unexpected excpetion!" << endl;
return -1;
}
try{
//create interpolating polynomials
cout << "test 3 identical polynomials" << endl;
InterpolatingPolynomial p0,p1,p2;
p0.xMin=0.0;
p0.xMax=1.5;
p0.coefficient.push_back(1.0); //c[0]
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
pvector.push_back(p0);
pvector.push_back(p0);
multiPolynomial *multipoly = new multiPolynomial(pvector);
doubleVector X;
for (int i=0; i<=150;i++) X.push_back(i/100.0); //create range for testing
doubleVector Y=multipoly->evaluate(X);
cout << "**********************************" << endl;
for (unsigned int i=0; i < X.size(); i++) cout << X[i] << "\t" << Y[i] << endl;
cout << "**********************************" << endl;
delete multipoly;
}
catch(std::domain_error& ex){
cout << "OK, exception caught: " << ex.what() << endl;
}
catch(std::range_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
catch(std::length_error& ex){
std::cerr << ex.what() << std::endl;
return -1;
}
catch(...){
cerr << " unexpected excpetion!" << endl;
return -1;
}
try{
//create interpolating polynomials
cout << "test copy constructor" << endl;
InterpolatingPolynomial p0,p1,p2;
p0.xMin=0.0;
p0.xMax=1.5;
p0.coefficient.push_back(1.0); //c[0]
p1.xMin=1.5;
p1.xMax=2.5;
p1.coefficient.push_back(0.0); //c[0]
p1.coefficient.push_back(0.0); //c[1]
p1.coefficient.push_back(1.0); //c[2]
p2.xMin=2.5;
p2.xMax=3.5;
p2.coefficient.push_back(5.0); //c[0]
p2.coefficient.push_back(-2.0); //c[1]
//stuff polynomial into vector
InterpolatingPolynoamialVector pvector;
pvector.push_back(p0);
pvector.push_back(p1);
pvector.push_back(p2);
multiPolynomial *multipoly = new multiPolynomial(pvector);
multiPolynomial copypoly=*multipoly;
doubleVector X;
for (int i=0; i<=350;i++) X.push_back(i/100.0); //create range for testing
doubleVector Y=multipoly->evaluate(X);
doubleVector Yc=copypoly.evaluate(X);
for (unsigned int i=0; i < X.size(); i++){
if (Y[i] != Yc[i])
cerr << "COPY ERROR: " << X[i] << " " << Y[i] << " " << Yc[i] <<endl;
}
delete multipoly;
}
catch(...){
cerr << " test copy constructor: unexpected excpetion!" << endl;
return -1;
}
}
{
cout << "test interpolatore for constat value on simmetric range" << endl;
InterpolatingPolynomial p0;
InterpolatingPolynoamialVector pvector;
p0.xMin=-5.0;
p0.xMax=5.0;
p0.coefficient.push_back(0.52); //c[0]
pvector.push_back(p0);
multiPolynomial *multipoly = new multiPolynomial(pvector);
double a0=-4.99;
cout << "for "<< a0 << " "<< multipoly->evaluate(a0);
a0=4.99;
cout << "for "<< a0 << " "<< multipoly->evaluate(a0);
delete multipoly;
}
return 0;
}
File added
File added
/*
* program to test peridic spline class
*
* $Author: claudio $
*
* $Revision: 1.2 $
*
* $Log: test_periodicspline.cpp,v $
* Revision 1.2 2017-03-06 13:13:20 claudio
* use unsigned for comparison
*
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*
*/
#include <iostream>
#include "periodicspline.h"
#include <cmath>
using namespace std;
using namespace Interpolator;
int main(){
cout<< "test of periodicSpline interpolator class" << endl;
doubleVector x0,y0;
const int NP=15;
const double k = (2*M_PI)/NP;
for(int i=0; i <= NP; i++){
x0.push_back(i*k);
y0.push_back(sin(i*k));
}
periodicSpline* test_spline = new periodicSpline(x0,y0);
{
doubleVector a;
doubleVector b;
test_spline->get_base_points(a,b);
cout<<"test get_base_points()"<<endl;
for(unsigned int i=0; i < a.size()-1; i++ )
if((x0[i] != a[i]) ||(y0[i] != b[i])){
cout << i << " " << x0[i] << " " << a[i] << " | "<< y0[i] << " " << b[i] << endl;
return -1;
}
}
{
cout << "test get_range()" << endl;
double minx,maxx;
test_spline->get_range(minx,maxx);
int I=x0.size()-1;
if( (minx != x0[0]) || (maxx != x0[I]) ){
cout << minx << " " << x0[0] << " | " << maxx << " " << x0[I] << endl;
return -1;
}
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{ cout << "test evaluate()for plot" << endl;
doubleVector X;
doubleVector Y;
double minx;
double range;
test_spline->get_range(minx,range);
double nsteps=100;
for(int i=0;i<=nsteps;i++){
X.push_back((range*i)/nsteps);
Y.push_back(test_spline->evaluate(X[i]));
}
//print out data
cout<<"---------------------------"<<endl;
for(unsigned int i=0; i < x0.size(); i++) cout<<x0[i]<<"\t"<<y0[i]<<endl;
cout<<"---------------------------"<<endl;
for(int i=0; i <= nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"+++++++++++++++++++++++++++"<<endl;
}
{
cout << "test evaluate()for doubleVector" << endl;
doubleVector X;
doubleVector Y;
double minx;
double range;
test_spline->get_range(minx,range);
double nsteps=100;
for(int i=0;i<=nsteps;i++)
X.push_back((range*i)/nsteps);
Y=test_spline->evaluate(X);
//print out data
cout<<"###########################"<<endl;
for(int i=0; i <= nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"***************************"<<endl;
}
{
cout << "test range exception" << endl;
try{
test_spline->evaluate(-10.0);
cerr << "range_error not thrown!" << endl;
}
catch(std::range_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with unequal lengths" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.0);
y.push_back(4.0);
y.push_back(5.0);
periodicSpline spl(x,y);
cerr << "length_error not thrown!" << endl;
}
catch(std::length_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with out of order data" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(1.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
periodicSpline spl(x,y);
cerr << "domain_error not thrown!" << endl;
}
catch(std::domain_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "Test copy constructor" << endl;
periodicSpline copy_spline(*test_spline);
double minx,maxx,copyminx,copymaxx;
test_spline->get_range(minx,maxx);
copy_spline.get_range(copyminx,copymaxx);
if( (minx != copyminx) || (maxx != copymaxx) ){
cerr << "COPY FAILED!" << endl;
return -1;
}
double range;
test_spline->get_range(minx,range);
double nsteps=100;
for(int i=0;i<nsteps;i++){
double val=(range*i)/nsteps;
double y,ycopy;
ycopy=copy_spline.evaluate(val);
y=test_spline->evaluate(val);
if(y != ycopy){
cerr << "COPY FAILED " << val << " " << y << " " << ycopy << endl;
}
}
}
{
cout << "Test copy operator" << endl;
periodicSpline copy_spline(*test_spline);
copy_spline=*test_spline;
double minx,maxx,copyminx,copymaxx;
test_spline->get_range(minx,maxx);
copy_spline.get_range(copyminx,copymaxx);
if( (minx != copyminx) || (maxx != copymaxx) ){
cerr << "COPY FAILED!" << endl;
return -1;
}
double range;
test_spline->get_range(minx,range);
double nsteps=100;
for(int i=0;i<nsteps;i++){
double val=(range*i)/nsteps;
double y,ycopy;
ycopy=copy_spline.evaluate(val);
y=test_spline->evaluate(val);
if(y != ycopy){
cerr << "COPY FAILED " << val << " " << y << " " << ycopy << endl;
}
}
}
cout << "test delete" << endl;
delete test_spline;
{
cout << "test leaks - new/delete" << endl;
periodicSpline *dynspl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
dynspl = new periodicSpline(x,y);
delete dynspl;
}
}
{
cout << "test leaks - stack" << endl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
periodicSpline stspl(x,y);
}
}
return 0;
}
/*
* program to test spline classes
*
* $Author: claudio $
*
* $Revision: 1.1.1.1 $
*
* $Log: test_spline.cpp,v $
* Revision 1.1.1.1 2012-09-05 08:17:22 claudio
* Interpolator utility classes
*
*
*/
#include <iostream>
#include "spline.h"
#include <cmath>
//#include <stdexcept>
using namespace std;
using namespace Interpolator;
int main(){
cout<< "test of Spline interpolator class" << endl;
doubleVector x0,y0;
const int NP=30;
for(int i=0; i < NP; i++){
x0.push_back(i*i*.02);
y0.push_back(sin(i*i*.02));
}
Spline* test_spline = new Spline(x0,y0);
{
doubleVector a;
doubleVector b;
test_spline->get_base_points(a,b);
cout<<"test get_base_points()"<<endl;
for(int i=0; i < NP; i++ )
if((x0[i] != a[i]) ||(y0[i] != b[i])){
cout << i << " " << x0[i] << " " << a[i] << " | "<< y0[i] << " " << b[i] << endl;
return -1;
}
}
{
cout << "test get_range()" << endl;
double minx,maxx;
test_spline->get_range(minx,maxx);
if( (minx != x0[0]) || (maxx != x0[NP-1]) ){
cout << minx << " " << x0[0] << " | " << maxx << " " << x0[NP-1] << endl;
return -1;
}
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{
cout << "test evaluate()" << endl;
double xn=0.02;
double yn=test_spline->evaluate(xn);
cout << xn << " " << yn << endl;
yn=test_spline->evaluate(x0[5]);
cout << xn << " " << yn << " " << y0[5] << endl;
}
{ cout << "test evaluate()for plot" << endl;
doubleVector X;
doubleVector Y;
double range=x0[NP-1];
double nsteps=100;
for(int i=0;i<nsteps;i++){
X.push_back((range*i)/nsteps);
Y.push_back(test_spline->evaluate(X[i]));
}
//print out data
cout<<"---------------------------"<<endl;
for(int i=0; i < NP; i++) cout<<x0[i]<<"\t"<<y0[i]<<endl;
cout<<"---------------------------"<<endl;
for(int i=0; i < nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"+++++++++++++++++++++++++++"<<endl;
}
{
cout << "test evaluate()for doubleVector" << endl;
doubleVector X;
doubleVector Y;
double range=x0[NP-1];
double nsteps=100;
for(int i=0;i<nsteps;i++)
X.push_back((range*i)/nsteps);
Y=test_spline->evaluate(X);
//print out data
cout<<"###########################"<<endl;
for(int i=0; i < nsteps; i++) cout<<X[i]<<"\t"<<Y[i]<<endl;
cout<<"***************************"<<endl;
}
{
cout << "test range exception" << endl;
try{
test_spline->evaluate(-10.0);
cerr << "range_error not thrown!" << endl;
}
catch(std::range_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with unequal lengths" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.0);
y.push_back(4.0);
y.push_back(5.0);
Spline spl(x,y);
cerr << "length_error not thrown!" << endl;
}
catch(std::length_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "test constructor with out of order data" << endl;
try{
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(1.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
Spline spl(x,y);
cerr << "domain_error not thrown!" << endl;
}
catch(std::domain_error& ex){
cout << "OK, catched expected exception: "<< ex.what() << endl;
}
catch(...){
cerr << "unexpected exception thrown!" << endl;
}
}
{
cout << "Test copy constructor" << endl;
//Spline copy_spline=*test_spline;
Spline copy_spline(*test_spline);
double minx,maxx,copyminx,copymaxx;
test_spline->get_range(minx,maxx);
copy_spline.get_range(copyminx,copymaxx);
if( (minx != copyminx) || (maxx != copymaxx) ){
cerr << "COPY FAILED!" << endl;
return -1;
}
double range=x0[NP-1];
double nsteps=100;
for(int i=0;i<nsteps;i++){
double val=(range*i)/nsteps;
double y,ycopy;
ycopy=copy_spline.evaluate(val);
y=test_spline->evaluate(val);
if(y != ycopy){
cerr << "COPY FAILED " << val << " " << y << " " << ycopy << endl;
}
}
}
cout << "test delete" << endl;
delete test_spline;
{
cout << "test leaks - new/delete" << endl;
Spline *dynspl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
dynspl = new Spline(x,y);
delete dynspl;
}
}
{
cout << "test leaks - stack" << endl;
doubleVector x,y;
x.push_back(1.0);
x.push_back(2.0);
x.push_back(3.5);
y.push_back(4.0);
y.push_back(5.0);
y.push_back(6.0);
for(int i=0; i < 100 ; i++){
Spline stspl(x,y);
}
}
return 0;
}
This diff is collapsed.
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