// ---------------------------------------------------------------------
//
// Copyright (C) 2010 - 2021 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 (VEC : VECTOR_TYPES; deal_II_dimension : DIMENSIONS)
  {
    template void DataOut_DoFData<deal_II_dimension, deal_II_dimension>::
      add_data_vector_internal<VEC>(
        const DoFHandler<deal_II_dimension> *,
        const VEC &,
        const std::vector<std::string> &,
        const DataVectorType,
        const std::vector<
          DataComponentInterpretation::DataComponentInterpretation> &,
        const bool);

    template void
    DataOut_DoFData<deal_II_dimension, deal_II_dimension>::add_data_vector<VEC>(
      const DoFHandler<deal_II_dimension> &,
      const VEC &,
      const DataPostprocessor<DoFHandler<deal_II_dimension>::space_dimension>
        &);


    template void DataOut_DoFData<deal_II_dimension, deal_II_dimension>::
      add_mg_data_vector<VEC>(const DoFHandler<deal_II_dimension> &,
                              const MGLevelObject<VEC> &,
                              const std::string &);

    template void
    DataOut_DoFData<deal_II_dimension, deal_II_dimension>::add_mg_data_vector<
      VEC>(const DoFHandler<deal_II_dimension> &,
           const MGLevelObject<VEC> &,
           const std::vector<std::string> &,
           const std::vector<
             DataComponentInterpretation::DataComponentInterpretation> &);



    // stuff needed for face data

    template void DataOut_DoFData<deal_II_dimension,
                                  deal_II_dimension - 1,
                                  deal_II_dimension,
                                  deal_II_dimension>::
      add_data_vector_internal<VEC>(
        const DoFHandler<deal_II_dimension> *,
        const VEC &,
        const std::vector<std::string> &,
        const DataVectorType,
        const std::vector<
          DataComponentInterpretation::DataComponentInterpretation> &,
        const bool);

    template void DataOut_DoFData<deal_II_dimension,
                                  deal_II_dimension - 1,
                                  deal_II_dimension,
                                  deal_II_dimension>::
      add_data_vector<VEC>(
        const DoFHandler<deal_II_dimension> &,
        const VEC &,
        const DataPostprocessor<DoFHandler<deal_II_dimension>::space_dimension>
          &);



    // things for DataOutRotation

#if deal_II_dimension < 3
    template void DataOut_DoFData<deal_II_dimension, deal_II_dimension + 1>::
      add_data_vector_internal<VEC>(
        const DoFHandler<deal_II_dimension> *,
        const VEC &,
        const std::vector<std::string> &,
        const DataVectorType,
        const std::vector<
          DataComponentInterpretation::DataComponentInterpretation> &,
        const bool);

    template void DataOut_DoFData<deal_II_dimension, deal_II_dimension + 1>::
      add_data_vector<VEC>(
        const DoFHandler<deal_II_dimension> &,
        const VEC &,
        const DataPostprocessor<DoFHandler<deal_II_dimension>::space_dimension>
          &);
#endif
  }



for (deal_II_dimension : DIMENSIONS)
  {
    template class DataOut_DoFData<deal_II_dimension, deal_II_dimension>;

#if deal_II_dimension < 3
    template class DataOut_DoFData<deal_II_dimension, deal_II_dimension + 1>;
    template class DataOut_DoFData<deal_II_dimension,
                                   deal_II_dimension,
                                   deal_II_dimension,
                                   deal_II_dimension + 1>;
#endif

#if deal_II_dimension >= 2
    template class DataOut_DoFData<deal_II_dimension,
                                   deal_II_dimension - 1,
                                   deal_II_dimension,
                                   deal_II_dimension>;
#endif

#if deal_II_dimension == 3
    template class DataOut_DoFData<1, 1, 1, 3>;
#endif

    namespace internal
    \{
      namespace DataOutImplementation
      \{
        template struct ParallelDataBase<deal_II_dimension, deal_II_dimension>;
      \}
    \}
  }
