SundanceFeketeBrickQuadrature.cpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                             Sundance
00005 //                 Copyright 2011 Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu)
00038 // 
00039 
00040 /* @HEADER@ */
00041 
00042 
00043 #include "SundanceFeketeBrickQuadrature.hpp"
00044 #include "SundanceOut.hpp"
00045 #include "SundanceGaussLobatto1D.hpp"
00046 #include "PlayaTabs.hpp"
00047 
00048 using namespace Sundance;
00049 using namespace Teuchos;
00050 
00051 void FeketeBrickQuadrature::getPoints(int order, Array<double>& wgt, Array<
00052     double>& x, Array<double>& y, Array<double>& z)
00053 {
00054   int p = order + 3;
00055   p = p + (p % 2);
00056   int nNodes = p / 2;
00057   GaussLobatto1D rule(nNodes, 0.0, 1.0);
00058   Array<double> d1 = rule.nodes();
00059   Array<double> d2 = d1;
00060   Array<double> d3 = d1;
00061   Array<double> w = rule.weights();
00062   int n = rule.nPoints();
00063 
00064   wgt.resize(n * n * n);
00065   x.resize(n * n * n);
00066   y.resize(n * n * n);
00067   z.resize(n * n * n);
00068 
00069   int k = 0;
00070   for (int i = 0; i < n; i++)
00071   {
00072     double p = d1[i];
00073     for (int j = 0; j < n; j++)
00074     {
00075       double q = d2[j]; //similar to the p value, caz we have quad
00076       for (int l = 0; l < n; l++, k++)
00077       {
00078         double r = d3[l];
00079         x[k] = p;
00080         y[k] = q;
00081         z[k] = r;
00082         wgt[k] = w[i] * w[j] * w[l];
00083       }
00084     }
00085   }
00086 }
00087 
00088 bool FeketeBrickQuadrature::test(int p)
00089 {
00090   Array<double> w;
00091   Array<double> x;
00092   Array<double> y;
00093   Array<double> z;
00094 
00095   getPoints(p, w, x, y, z);
00096   bool pass = true;
00097   for (int a = 0; a <= p; a++)
00098   {
00099     int bMax = p - a;
00100     for (int b = 0; b <= bMax; b++)
00101     {
00102       int cMax = bMax - b;
00103       for (int c = 0; c <= cMax; c++)
00104       {
00105         double sum = 0.0;
00106         for (int q = 0; q < w.length(); q++)
00107         {
00108           sum += w[q] * pow(x[q], (double) a) * pow(y[q], (double) b)
00109               * pow(z[q], (double) c);
00110         }
00111         double err = fabs(sum - exact(a, b, c));
00112         bool localPass = err < 1.0e-14;
00113         pass = pass && localPass;
00114         if (!localPass)
00115         {
00116           fprintf(
00117               stderr,
00118               "order=%d m (%d, %d, %d) q=%22.15g exact=%22.15g\n",
00119               p, a, b, c, sum, exact(a, b, c));
00120           std::cerr << "error = " << err << std::endl;
00121         }
00122       }
00123     }
00124   }
00125   return pass;
00126 }
00127 
00128 double FeketeBrickQuadrature::exact(int a, int b, int c)
00129 {
00130   return 1.0 / (a + 1) / (b + 1) / (c + 1);
00131 }
00132 

Site Contact