46 #ifndef INTREPID_CUBATURE_SPARSE_HELPER_HPP 
   47 #define INTREPID_CUBATURE_SPARSE_HELPER_HPP 
   49 #include "Intrepid_ConfigDefs.hpp" 
   52 #include "Teuchos_Assert.hpp" 
   53 #include "Teuchos_Array.hpp" 
   61 template<
class Scalar, 
int D>
 
   69   bool const operator<(const SGPoint<Scalar, D> & right);
 
   78 template<
class Scalar, 
int D, 
class ArrayPo
int=FieldContainer<Scalar>, 
class ArrayWeight=ArrayPo
int>
 
   81   Teuchos::Array< SGPoint<Scalar, D> > nodes;
 
   82   Teuchos::Array< Scalar > weights;
 
   83   bool addNode(Scalar new_node[D], Scalar weight);
 
   84   void copyToArrays(ArrayPoint & cubPoints, ArrayWeight & cubWeights) 
const;
 
   86   int size()
 const {
return nodes.size();}
 
   92 template<
class Scalar, 
int D>
 
   95   for(
int i = 0; i < D; i++)
 
  101 template<
class Scalar, 
int D>
 
  102 SGPoint<Scalar, D>::SGPoint(Scalar p[D])
 
  104   for(
int i = 0; i < D; i++)
 
  110 template<
class Scalar, 
int D>
 
  111 bool const SGPoint<Scalar, D>::operator==(
const SGPoint<Scalar, D> & right)
 
  115   for(
int i = 0; i < D; i++)
 
  117     if(coords[i] != right.coords[i])
 
  124 template<
class Scalar, 
int D>
 
  125 bool const SGPoint<Scalar, D>::operator<(
const SGPoint<Scalar, D> & right)
 
  127   for(
int i = 0; i < D; i++)
 
  129     if(coords[i] < right.coords[i])
 
  131     else if(coords[i] > right.coords[i])
 
  138 template<
class Scalar, 
int D>
 
  139 bool const SGPoint<Scalar, D>::operator>(
const SGPoint<Scalar, D> & right)
 
  141   if(
this < right || 
this == right)
 
  147 template<
class Scalar, 
int D>
 
  148 std::ostream & operator<<(std::ostream & o, SGPoint<Scalar, D> & p)
 
  151   for(
int i = 0; i<D;i++)
 
  152     o<< p.coords[i] << 
" ";
 
  162 template<
class Scalar, 
int D, 
class ArrayPo
int, 
class ArrayWeight>
 
  163 bool SGNodes<Scalar,D,ArrayPoint,ArrayWeight>::addNode(Scalar new_node[D], Scalar weight)
 
  165   SGPoint<Scalar, D> new_point(new_node);
 
  166   bool new_and_added = 
true;
 
  168   if(nodes.size() == 0)
 
  170     nodes.push_back(new_point);
 
  171     weights.push_back(weight);
 
  176     int right = (int)nodes.size();
 
  177     int mid_node = (int)ceil(nodes.size()/2.0)-1;
 
  179     bool iterate_continue = 
true;
 
  181     while(iterate_continue)
 
  183       if(new_point == nodes[mid_node]){
 
  184         weights[mid_node] += weight;
 
  185         iterate_continue = 
false;
 
  186         new_and_added = 
false;  
 
  188       else if(new_point < nodes[mid_node]){
 
  189         if(right - left <= 2)
 
  192           nodes.insert(nodes.begin()+mid_node, new_point);
 
  193           weights.insert(weights.begin()+mid_node,weight);
 
  194           iterate_continue = 
false;
 
  199           mid_node += (int)ceil((left-mid_node)/2.0);
 
  204         if(mid_node == (
int)nodes.size()-1)
 
  206           nodes.push_back(new_point);
 
  207           weights.push_back(weight);
 
  208           iterate_continue = 
false;
 
  210         else if(right - left <= 2)
 
  213           nodes.insert(nodes.begin()+mid_node+1, new_point);
 
  214           weights.insert(weights.begin()+mid_node+1,weight);
 
  215           iterate_continue = 
false;
 
  220           mid_node += (int)ceil((right-mid_node)/2.0);
 
  226   return new_and_added;
 
  229 template<
class Scalar, 
int D, 
class ArrayPo
int, 
class ArrayWeight>
 
  230 void SGNodes<Scalar,D,ArrayPoint,ArrayWeight>::copyToArrays(ArrayPoint & cubPoints, ArrayWeight & cubWeights)
 const 
  232   int numPoints = size();
 
  234   for(
int i = 0; i < numPoints; i++)
 
  236     for (
int j=0; j<D; j++) {
 
  237       cubPoints(i,j) = nodes[i].coords[j];
 
  239     cubWeights(i) = weights[i];
 
Header file for utility class to provide multidimensional containers. 
Contains definitions of custom data types in Intrepid.