// ---------------------------------------------------------------------
//
// Copyright (C) 2010 - 2020 by the deal.II authors
//
// This file is part of the deal.II library.
//
// The deal.II library is free software; you can use it, 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 2.1 of the License, or (at your option) any later version.
// The full text of the license can be found in the file LICENSE.md at
// the top level directory of deal.II.
//
// ---------------------------------------------------------------------


for (deal_II_dimension : DIMENSIONS)
  {
    namespace hp
    \{
      template class FEValuesBase<deal_II_dimension,
                                  deal_II_dimension,
                                  dealii::FEValues<deal_II_dimension>>;
      template class FEValuesBase<deal_II_dimension,
                                  deal_II_dimension - 1,
                                  dealii::FEFaceValues<deal_II_dimension>>;
      template class FEValuesBase<deal_II_dimension,
                                  deal_II_dimension - 1,
                                  dealii::FESubfaceValues<deal_II_dimension>>;
    \}

    namespace hp
    \{
      template class FEValues<deal_II_dimension>;
      template class FEFaceValues<deal_II_dimension, deal_II_dimension>;
      template class FESubfaceValues<deal_II_dimension, deal_II_dimension>;
    \}



#if deal_II_dimension != 3

    namespace hp
    \{
      template class FEValuesBase<
        deal_II_dimension,
        deal_II_dimension,
        dealii::FEValues<deal_II_dimension, deal_II_dimension + 1>>;
      template class FEValuesBase<
        deal_II_dimension,
        deal_II_dimension - 1,
        dealii::FEFaceValues<deal_II_dimension, deal_II_dimension + 1>>;
      template class FEValuesBase<
        deal_II_dimension,
        deal_II_dimension - 1,
        dealii::FESubfaceValues<deal_II_dimension, deal_II_dimension + 1>>;
    \}

    namespace hp
    \{
      template class FEValues<deal_II_dimension, deal_II_dimension + 1>;
      template class FEFaceValues<deal_II_dimension, deal_II_dimension + 1>;
      template class FESubfaceValues<deal_II_dimension, deal_II_dimension + 1>;
    \}
#endif

#if deal_II_dimension == 3

    namespace hp
    \{
      template class FEValuesBase<1, 1, dealii::FEValues<1, 3>>;
      template class FEValuesBase<1, 1 - 1, dealii::FEFaceValues<1, 3>>;
      template class FEValuesBase<1, 1 - 1, dealii::FESubfaceValues<1, 3>>;
    \}

    namespace hp
    \{
      template class FEValues<1, 3>;
      template class FEFaceValues<1, 3>;
      template class FESubfaceValues<1, 3>;
    \}
#endif
  }

for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS;
     lda : BOOL)
  {
    namespace hp
    \{
#if deal_II_dimension <= deal_II_space_dimension

      template void
      FEValues<deal_II_dimension, deal_II_space_dimension>::reinit(
        const TriaIterator<
          DoFCellAccessor<deal_II_dimension, deal_II_space_dimension, lda>> &,
        unsigned int,
        unsigned int,
        unsigned int);
      template void
      FEFaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
        const TriaIterator<
          DoFCellAccessor<deal_II_dimension, deal_II_space_dimension, lda>> &,
        unsigned int,
        unsigned int,
        unsigned int,
        unsigned int);
      template void
      FEFaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
        const TriaIterator<
          DoFCellAccessor<deal_II_dimension, deal_II_space_dimension, lda>> &,
        const Triangulation<deal_II_dimension,
                            deal_II_space_dimension>::face_iterator &,
        unsigned int,
        unsigned int,
        unsigned int);
      template void
      FESubfaceValues<deal_II_dimension, deal_II_space_dimension>::reinit(
        const TriaIterator<
          DoFCellAccessor<deal_II_dimension, deal_II_space_dimension, lda>> &,
        unsigned int,
        unsigned int,
        unsigned int,
        unsigned int,
        unsigned int);
#endif
    \}
  }
