00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00042
00043
00051 #include "Intrepid_Polylib.hpp"
00052 #include "Teuchos_oblackholestream.hpp"
00053 #include "Teuchos_RCP.hpp"
00054 #include "Teuchos_ScalarTraits.hpp"
00055 #include "Teuchos_GlobalMPISession.hpp"
00056
00057
00058 using namespace std;
00059 using namespace Intrepid;
00060
00061 #define NPLOWER 5
00062 #define NPUPPER 15
00063 #define TEST_EPS 1000*INTREPID_TOL
00064
00065 #define GAUSS_INT 1
00066 #define GAUSS_RADAUM_INT 1
00067 #define GAUSS_RADAUP_INT 1
00068 #define GAUSS_LOBATTO_INT 1
00069 #define GAUSS_DIFF 1
00070 #define GAUSS_RADAUM_DIFF 1
00071 #define GAUSS_RADAUP_DIFF 1
00072 #define GAUSS_LOBATTO_DIFF 1
00073 #define GAUSS_INTERP 1
00074 #define GAUSS_RADAUM_INTERP 1
00075 #define GAUSS_RADAUP_INTERP 1
00076 #define GAUSS_LOBATTO_INTERP 1
00077
00078
00079 #define INTREPID_TEST_COMMAND( S ) \
00080 { \
00081 try { \
00082 S ; \
00083 } \
00084 catch (std::logic_error err) { \
00085 *outStream << "Expected Error ----------------------------------------------------------------\n"; \
00086 *outStream << err.what() << '\n'; \
00087 *outStream << "-------------------------------------------------------------------------------" << "\n\n"; \
00088 }; \
00089 }
00090
00091
00092 template<class Scalar>
00093 Scalar ddot(int n, Scalar *x, int incx, Scalar *y, int incy)
00094 {
00095 register Scalar sum = 0.;
00096
00097 while (n--) {
00098 sum += (*x) * (*y);
00099 x += incx;
00100 y += incy;
00101 }
00102 return sum;
00103 }
00104
00105 template<class Scalar>
00106 Scalar * dvector(int nl,int nh)
00107 {
00108 Scalar * v;
00109
00110 v = (Scalar *)malloc((unsigned) (nh-nl+1)*sizeof(Scalar));
00111 return v-nl;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 int main(int argc, char *argv[]) {
00194
00195 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
00196
00197
00198
00199 int iprint = argc - 1;
00200 Teuchos::RCP<std::ostream> outStream;
00201 Teuchos::oblackholestream bhs;
00202 if (iprint > 0)
00203 outStream = Teuchos::rcp(&std::cout, false);
00204 else
00205 outStream = Teuchos::rcp(&bhs, false);
00206
00207
00208 Teuchos::oblackholestream oldFormatState;
00209 oldFormatState.copyfmt(std::cout);
00210
00211 *outStream \
00212 << "===============================================================================\n" \
00213 << "| |\n" \
00214 << "| Unit Test (IntrepidPolylib) |\n" \
00215 << "| |\n" \
00216 << "| 1) the original Polylib tests |\n" \
00217 << "| |\n" \
00218 << "| Questions? Contact Pavel Bochev (pbboche@sandia.gov) or |\n" \
00219 << "| Denis Ridzal (dridzal@sandia.gov). |\n" \
00220 << "| |\n" \
00221 << "| Intrepid's website: http://trilinos.sandia.gov/packages/intrepid |\n" \
00222 << "| Trilinos website: http://trilinos.sandia.gov |\n" \
00223 << "| |\n" \
00224 << "===============================================================================\n";
00225
00226
00227 int errorFlag = 0;
00228 int beginThrowNumber = TestForException_getThrowNumber();
00229 int endThrowNumber = beginThrowNumber + 1;
00230
00231 typedef IntrepidPolylib ipl;
00232 IntrepidPolylib iplib;
00233
00234 *outStream \
00235 << "\n"
00236 << "===============================================================================\n"\
00237 << "| TEST 1: exceptions |\n"\
00238 << "===============================================================================\n";
00239
00240 try{
00241 INTREPID_TEST_COMMAND( iplib.gammaF((double)0.33) );
00242 }
00243 catch (std::logic_error err) {
00244 *outStream << "UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
00245 *outStream << err.what() << '\n';
00246 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
00247 errorFlag = -1000;
00248 };
00249
00250 if (TestForException_getThrowNumber() != endThrowNumber)
00251 errorFlag = -1000;
00252
00253 *outStream \
00254 << "\n"
00255 << "===============================================================================\n"\
00256 << "| TEST 2: correctness of math operations |\n"\
00257 << "===============================================================================\n";
00258
00259 outStream->precision(20);
00260
00261 try {
00262 {
00263 int np,n,i;
00264 double *z,*w,*p,sum=0,alpha,beta,*d;
00265
00266 z = dvector<double>(0,NPUPPER-1);
00267 w = dvector<double>(0,NPUPPER-1);
00268 p = dvector<double>(0,NPUPPER-1);
00269
00270 d = dvector<double>(0,NPUPPER*NPUPPER-1);
00271
00272 #if GAUSS_INT
00273
00274 *outStream << "Begin checking Gauss integration\n";
00275 alpha = -0.5;
00276 while(alpha <= 5.0){
00277 beta = -0.5;
00278 while(beta <= 5.0){
00279
00280 for(np = NPLOWER; np <= NPUPPER; ++np){
00281 ipl::zwgj(z,w,np,alpha,beta);
00282 for(n = 2; n < 2*np-1; ++n){
00283 ipl::jacobfd(np,z,p,(double*)0,n,alpha,beta);
00284 sum = ddot(np,w,1,p,1);
00285 if(std::abs(sum)>TEST_EPS) {
00286 errorFlag = -1000;
00287 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00288 ", np = " << np << ", n = " << n << " integral was " << sum << "\n";
00289 }
00290 }
00291 }
00292
00293 beta += 0.5;
00294 }
00295 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00296 alpha += 0.5;
00297 }
00298 *outStream << "Finished checking Gauss Integration\n";
00299 #endif
00300
00301 #if GAUSS_RADAUM_INT
00302
00303 *outStream << "Begin checking Gauss-Radau (z = -1) integration\n";
00304 alpha = -0.5;
00305 while(alpha <= 5.0){
00306 beta = -0.5;
00307 while(beta <= 5.0){
00308
00309 for(np = NPLOWER; np <= NPUPPER; ++np){
00310 ipl::zwgrjm(z,w,np,alpha,beta);
00311 for(n = 2; n < 2*np-2; ++n){
00312 ipl::jacobfd(np,z,p,(double*)0,n,alpha,beta);
00313 sum = ddot(np,w,1,p,1);
00314 if(std::abs(sum)>TEST_EPS) {
00315 errorFlag = -1000;
00316 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00317 ", np = " << np << ", n = " << n << " integral was " << sum << "\n";
00318 }
00319 }
00320 }
00321
00322 beta += 0.5;
00323 }
00324 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00325 alpha += 0.5;
00326 }
00327 *outStream << "Finished checking Gauss-Radau (z = -1) Integration\n";
00328 #endif
00329
00330 #if GAUSS_RADAUP_INT
00331
00332 *outStream << "Begin checking Gauss-Radau (z = +1) integration\n";
00333 alpha = -0.5;
00334 while(alpha <= 5.0){
00335 beta = -0.5;
00336 while(beta <= 5.0){
00337
00338 for(np = NPLOWER; np <= NPUPPER; ++np){
00339 ipl::zwgrjp(z,w,np,alpha,beta);
00340 for(n = 2; n < 2*np-2; ++n){
00341 ipl::jacobfd(np,z,p,(double*)0,n,alpha,beta);
00342 sum = ddot(np,w,1,p,1);
00343 if(std::abs(sum)>TEST_EPS) {
00344 errorFlag = -1000;
00345 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00346 ", np = " << np << ", n = " << n << " integral was " << sum << "\n";
00347 }
00348 }
00349 }
00350
00351 beta += 0.5;
00352 }
00353 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00354 alpha += 0.5;
00355 }
00356 *outStream << "Finished checking Gauss-Radau (z = +1) Integration\n";
00357 #endif
00358
00359 #if GAUSS_LOBATTO_INT
00360
00361 *outStream << "Begin checking Gauss-Lobatto integration\n";
00362 alpha = -0.5;
00363 while(alpha <= 5.0){
00364 beta = -0.5;
00365 while(beta <= 5.0){
00366
00367 for(np = NPLOWER; np <= NPUPPER; ++np){
00368 ipl::zwglj(z,w,np,alpha,beta);
00369 for(n = 2; n < 2*np-3; ++n){
00370 ipl::jacobfd(np,z,p,(double*)0,n,alpha,beta);
00371 sum = ddot(np,w,1,p,1);
00372 if(std::abs(sum)>TEST_EPS) {
00373 errorFlag = -1000;
00374 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00375 ", np = " << np << ", n = " << n << " integral was " << sum << "\n";
00376 }
00377 }
00378 }
00379
00380 beta += 0.5;
00381 }
00382 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00383 alpha += 0.5;
00384 }
00385 *outStream << "Finished checking Gauss-Lobatto Integration\n";
00386 #endif
00387
00388 #if GAUSS_DIFF
00389 *outStream << "Begin checking differentiation through Gauss points\n";
00390 alpha = -0.5;
00391 while(alpha <= 5.0){
00392 beta = -0.5;
00393 while(beta <= 5.0){
00394
00395 for(np = NPLOWER; np <= NPUPPER; ++np){
00396 ipl::zwgj(z,w,np,alpha,beta);
00397 for(n = 2; n < np-1; ++n){
00398 ipl::Dgj(d,z,np,alpha,beta);
00399
00400 for(i = 0; i < np; ++i) p[i] = std::pow(z[i],n);
00401 sum = 0;
00402 for(i = 0; i < np; ++i)
00403 sum += std::abs(ddot(np,d+i*np,1,p,1) - n*std::pow(z[i],n-1));
00404 sum /= np;
00405 if(std::abs(sum)>TEST_EPS) {
00406 errorFlag = -1000;
00407 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00408 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00409 }
00410 }
00411 }
00412 beta += 0.5;
00413 }
00414 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00415 alpha += 0.5;
00416 }
00417 *outStream << "Finished checking Gauss Jacobi differentiation\n";
00418 #endif
00419
00420 #if GAUSS_RADAUM_DIFF
00421 *outStream << "Begin checking differentiation through Gauss-Radau (z=-1) points\n";
00422 alpha = -0.5;
00423 while(alpha <= 5.0){
00424 beta = -0.5;
00425 while(beta <= 5.0){
00426
00427 for(np = NPLOWER; np <= NPUPPER; ++np){
00428 ipl::zwgrjm(z,w,np,alpha,beta);
00429 for(n = 2; n < np-1; ++n){
00430 ipl::Dgrjm(d,z,np,alpha,beta);
00431
00432 for(i = 0; i < np; ++i) p[i] = std::pow(z[i],n);
00433 sum = 0;
00434 for(i = 0; i < np; ++i)
00435 sum += std::abs(ddot(np,d+i*np,1,p,1) - n*std::pow(z[i],n-1));
00436 sum /= np;
00437 if(std::abs(sum)>TEST_EPS) {
00438 errorFlag = -1000;
00439 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00440 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00441 }
00442 }
00443 }
00444 beta += 0.5;
00445 }
00446 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00447 alpha += 0.5;
00448 }
00449 *outStream << "Finished checking Gauss-Radau (z=-1) differentiation\n";
00450 #endif
00451
00452 #if GAUSS_RADAUP_DIFF
00453 *outStream << "Begin checking differentiation through Gauss-Radau (z=+1) points\n";
00454 alpha = -0.5;
00455 while(alpha <= 5.0){
00456 beta = -0.5;
00457 while(beta <= 5.0){
00458
00459 for(np = NPLOWER; np <= NPUPPER; ++np){
00460 ipl::zwgrjp(z,w,np,alpha,beta);
00461 for(n = 2; n < np-1; ++n){
00462 ipl::Dgrjp(d,z,np,alpha,beta);
00463
00464 for(i = 0; i < np; ++i) p[i] = std::pow(z[i],n);
00465 sum = 0;
00466 for(i = 0; i < np; ++i)
00467 sum += std::abs(ddot(np,d+i*np,1,p,1) - n*std::pow(z[i],n-1));
00468 sum /= np;
00469 if(std::abs(sum)>TEST_EPS) {
00470 errorFlag = -1000;
00471 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00472 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00473 }
00474 }
00475 }
00476 beta += 0.5;
00477 }
00478 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00479 alpha += 0.5;
00480 }
00481 *outStream << "Finished checking Gauss-Radau (z=+1) differentiation\n";
00482 #endif
00483
00484 #if GAUSS_RADAUP_DIFF
00485 *outStream << "Begin checking differentiation through Gauss-Lobatto (z=+1) points\n";
00486 alpha = -0.5;
00487 while(alpha <= 5.0){
00488 beta = -0.5;
00489 while(beta <= 5.0){
00490
00491 for(np = NPLOWER; np <= NPUPPER; ++np){
00492 ipl::zwglj(z,w,np,alpha,beta);
00493 for(n = 2; n < np-1; ++n){
00494 ipl::Dglj(d,z,np,alpha,beta);
00495
00496 for(i = 0; i < np; ++i) p[i] = std::pow(z[i],n);
00497 sum = 0;
00498 for(i = 0; i < np; ++i)
00499 sum += std::abs(ddot(np,d+i*np,1,p,1) - n*std::pow(z[i],n-1));
00500 sum /= np;
00501 if(std::abs(sum)>TEST_EPS) {
00502 errorFlag = -1000;
00503 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00504 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00505 }
00506 }
00507 }
00508 beta += 0.5;
00509 }
00510 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00511 alpha += 0.5;
00512 }
00513 *outStream << "Finished checking Gauss-Lobatto differentiation\n";
00514 #endif
00515
00516 #if GAUSS_INTERP
00517 *outStream << "Begin checking interpolation through Gauss points\n";
00518 alpha = -0.5;
00519 while(alpha <= 5.0){
00520 beta = -0.5;
00521 while(beta <= 5.0){
00522
00523 for(np = NPLOWER; np <= NPUPPER; ++np){
00524 ipl::zwgj(z,w,np,alpha,beta);
00525 for(n = 2; n < np-1; ++n){
00526 for(i = 0; i < np; ++i) {
00527 w[i] = 2.0*i/(double)(np-1)-1.0;
00528 p[i] = std::pow(z[i],n);
00529 }
00530 ipl::Imgj(d,z,w,np,np,alpha,beta);
00531 sum = 0;
00532 for(i = 0; i < np; ++i)
00533 sum += std::abs(ddot(np,d+i*np,1,p,1) - std::pow(w[i],n));
00534 sum /= np;
00535 if(std::abs(sum)>TEST_EPS) {
00536 errorFlag = -1000;
00537 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00538 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00539 }
00540 }
00541 }
00542 beta += 0.5;
00543 }
00544 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00545 alpha += 0.5;
00546 }
00547 *outStream << "Finished checking Gauss Jacobi interpolation\n";
00548 #endif
00549
00550 #if GAUSS_RADAUM_INTERP
00551 *outStream << "Begin checking interpolation through Gauss-Radau (z=-1) points\n";
00552 alpha = -0.5;
00553 while(alpha <= 5.0){
00554 beta = -0.5;
00555 while(beta <= 5.0){
00556
00557 for(np = NPLOWER; np <= NPUPPER; ++np){
00558 ipl::zwgrjm(z,w,np,alpha,beta);
00559 for(n = 2; n < np-1; ++n){
00560 for(i = 0; i < np; ++i) {
00561 w[i] = 2.0*i/(double)(np-1)-1.0;
00562 p[i] = std::pow(z[i],n);
00563 }
00564 ipl::Imgrjm(d,z,w,np,np,alpha,beta);
00565 sum = 0;
00566 for(i = 0; i < np; ++i)
00567 sum += std::abs(ddot(np,d+i*np,1,p,1) - std::pow(w[i],n));
00568 sum /= np;
00569 if(std::abs(sum)>TEST_EPS) {
00570 errorFlag = -1000;
00571 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00572 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00573 }
00574 }
00575 }
00576 beta += 0.5;
00577 }
00578 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00579 alpha += 0.5;
00580 }
00581 *outStream << "Finished checking Gauss-Radau (z=-1) interpolation\n";
00582 #endif
00583
00584 #if GAUSS_RADAUP_INTERP
00585 *outStream << "Begin checking interpolation through Gauss-Radau (z=+1) points\n";
00586 alpha = -0.5;
00587 while(alpha <= 5.0){
00588 beta = -0.5;
00589 while(beta <= 5.0){
00590
00591 for(np = NPLOWER; np <= NPUPPER; ++np){
00592 ipl::zwgrjp(z,w,np,alpha,beta);
00593 for(n = 2; n < np-1; ++n){
00594 for(i = 0; i < np; ++i) {
00595 w[i] = 2.0*i/(double)(np-1)-1.0;
00596 p[i] = std::pow(z[i],n);
00597 }
00598 ipl::Imgrjp(d,z,w,np,np,alpha,beta);
00599 sum = 0;
00600 for(i = 0; i < np; ++i)
00601 sum += std::abs(ddot(np,d+i*np,1,p,1) - std::pow(w[i],n));
00602 sum /= np;
00603 if(std::abs(sum)>TEST_EPS) {
00604 errorFlag = -1000;
00605 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00606 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00607 }
00608 }
00609 }
00610 beta += 0.5;
00611 }
00612 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00613 alpha += 0.5;
00614 }
00615 *outStream << "Finished checking Gauss-Radau (z=+1) interpolation\n";
00616 #endif
00617
00618 #if GAUSS_LOBATTO_INTERP
00619 *outStream << "Begin checking interpolation through Gauss-Lobatto points\n";
00620 alpha = -0.5;
00621 while(alpha <= 5.0){
00622 beta = -0.5;
00623 while(beta <= 5.0){
00624
00625 for(np = NPLOWER; np <= NPUPPER; ++np){
00626 ipl::zwglj(z,w,np,alpha,beta);
00627 for(n = 2; n < np-1; ++n){
00628 for(i = 0; i < np; ++i) {
00629 w[i] = 2.0*i/(double)(np-1)-1.0;
00630 p[i] = std::pow(z[i],n);
00631 }
00632 ipl::Imglj(d,z,w,np,np,alpha,beta);
00633 sum = 0;
00634 for(i = 0; i < np; ++i)
00635 sum += std::abs(ddot(np,d+i*np,1,p,1) - std::pow(w[i],n));
00636 sum /= np;
00637 if(std::abs(sum)>TEST_EPS) {
00638 errorFlag = -1000;
00639 *outStream << "ERROR: alpha = " << alpha << ", beta = " << beta <<
00640 ", np = " << np << ", n = " << n << " difference " << sum << "\n";
00641 }
00642 }
00643 }
00644 beta += 0.5;
00645 }
00646 *outStream << "finished checking all beta values for alpha = " << alpha << "\n";
00647 alpha += 0.5;
00648 }
00649 *outStream << "Finished checking Gauss-Lobatto interpolation\n";
00650 #endif
00651
00652 free(z); free(w); free(p); free(d);
00653
00654 }
00655
00656
00657 *outStream << "\n";
00658 }
00659 catch (std::logic_error err) {
00660 *outStream << "UNEXPECTED ERROR !!! ----------------------------------------------------------\n";
00661 *outStream << err.what() << '\n';
00662 *outStream << "-------------------------------------------------------------------------------" << "\n\n";
00663 errorFlag = -1000;
00664 };
00665
00666
00667 if (errorFlag != 0)
00668 std::cout << "End Result: TEST FAILED\n";
00669 else
00670 std::cout << "End Result: TEST PASSED\n";
00671
00672
00673 std::cout.copyfmt(oldFormatState);
00674
00675 return errorFlag;
00676 }