


template< class Tag1 , ... >
class DimFortranLayout<...> :
  public DimFortran<...> ,
  public PHX::DataLayout {
public:
  

};

template< class Tag1 Tag2 Tag3 , tyepname scalae>
void add_multiply( Array<Tag1> , Array<Tag1,Tag2> , Array<Tag2> )
{

}

ArrayNatural< double *, Cell, Quadurature, Cartesian > 
ArrayFortran<

typedef DimNatural< Cell,Quadurature,Cartesian> CellQuadPt ;



Array< CellQuadPt , dobule * > local_qp( g_qp[var].rcp().get() );

template< class Tag1 Tag2 Tag3 , tyepname scalae>
A<Tag1> operator * ( const B<Tag1,Tag2> , const C<Tag3> );


function(
  Array< CellQuadPt , double * > g_qp ,
  Array< DimNatural<Cell,ElementNode,Cartesian> , double * > g_n ,
  Array< DimNatural<Cell,Quadrature> , double * > grad_phi )
{
  unsigned n_cell, n_quad , n_node , n_space ;

  qp.dimension().size( n_cell , n_quad , n_space );
  n.dimension().size(  n_cell , n_node , n_space );

  for ( unsigned cell = 0 ; cell < n_cell  ; ++cell ) {

      Array< DimNatural<Quadrature,Cartesian> , double * >
        g_qp_cell = g_qp( cell );

      for ( unsigned qp = 0 ; qp < n_quad ; ++qp ) {

        Array< DimNatural<Cartesian> , double * > g_qp_cell_pt =
          g_qp_cell( qp );

        g_qp_cell_pt(0) = 0 ;
        g_qp_cell_pt(1) = 0 ;
        g_qp_cell_pt(2) = 0 ;

        for ( unsigned node = 0 ; node < n_node ; ++node ) {
          add_multiply( g_qp_cell_pt ,
                        grad_phi(cell,node) ,
                        g_n(cell,node) );
        }
      }
    }
  }
}





