// SpaFEDTe, a Template based C++ library for creating 
// Discontinuous Finite Element Spaces,
// Copyright (C) 2012 Lorenzo Alessio Botti

/* This library is free software; you can redistribute it and/or */
/* modify it under the terms of the GNU Lesser General Public */ 
/* License as published by the Free Software Foundation either */ 
/* version 3.0 of the License, or (at your option) any later version. */

/* This software is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
/* Lesser General Public License for more details. */

/* You should have received a copy of the GNU Lesser General Public */
/* License along with this software; if not, a copy of the full */
/* GNU Lesser General Public License can be found at */
/* http://www.gnu.org/licenses/. */

#ifndef __orthonormal_physical_space_finite_element_base_h__
#define __orthonormal_physical_space_finite_element_base_h__

#include "FiniteElementBasis.hpp"
#include "EnumElemType.hpp"
#include "JacobiPoly.hpp"
#include "ReferenceFiniteElement.hpp"
#include "BasisFunction.hpp"
#include "CollectiveBasisFunction.hpp"
#include "MappingBasisFunction.hpp"
#include "CollectiveMappingFunction.hpp"
#include "Quadrature.hpp"
#include "PhysicalSpaceFiniteElement.hpp"
#include "PhysicalSpaceScaledRotatedFiniteElement.hpp"
#include "Mesh.hpp"

template<class ToolFESpaceT>
class OrthoNormalPhysicalSpaceFiniteElementBase
{
public:
  typedef ToolFESpaceT ToolFESpaceType;
  typedef typename ToolFESpaceType::FiniteElementBasisType FiniteElementBasisType;
  typedef typename ToolFESpaceType::FiniteElementMappingType FiniteElementMappingType;
  typedef typename ToolFESpaceType::FiniteElementQuadratureType FiniteElementQuadratureType;
  typedef SpaMesh::Connectivity::TopoPointVector TopoPointVector;

  OrthoNormalPhysicalSpaceFiniteElementBase() 
    {
      ;
    }
 
  ~OrthoNormalPhysicalSpaceFiniteElementBase() {}
  
public:
  template <unsigned int Dim, unsigned int DIm,
	    template <unsigned int, unsigned int> class MappingBasisFunctionType,
	    template <typename> class MappingFunctionType,
	    class TopoMOABType> 
    static double sizeFE(TopoMOABType& feTOmoab, MappingFunctionType<MappingBasisFunctionType<Dim,DIm> >& sizeMapping, Quadrature& sizeQuadrature)
  {
    return ToolFESpaceType::sizeFE(feTOmoab, sizeMapping, sizeQuadrature);
  }
  
};

#endif 
