// input file that will be processed into build/share/deal.II/template-arguments
// and used by expand_instantiations to process .inst.in files.


// booleans
BOOL            := { true; false }

// real scalar floating point types
REAL_SCALARS    := { double; float }

// real scalar floating point types (vectorized)
REAL_SCALARS_VECTORIZED    := { @DEAL_II_EXPAND_REAL_SCALARS_VECTORIZED@; }
FLOAT_VECTORIZED           := { @DEAL_II_EXPAND_FLOAT_VECTORIZED@; }

// complex scalar types
COMPLEX_SCALARS := {
    @DEAL_II_EXPAND_COMPLEX_SCALARS@;
    }

// real scalar floating point types
REAL_AND_COMPLEX_SCALARS    := {
        double;
        float;
        @DEAL_II_EXPAND_COMPLEX_SCALARS@;
        }

// differentiable ADOL-C scalar types
DIFFERENTIABLE_ADOLC_REAL_SCALARS := {
        @DEAL_II_EXPAND_ADOLC_TYPES@;
        }

// differentiable Sacado scalar types
DIFFERENTIABLE_TRILINOS_SACADO_REAL_SCALARS_FAD := {
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_FAD@;
        }
DIFFERENTIABLE_TRILINOS_SACADO_REAL_SCALARS_RAD := {
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_RAD@;
        }
DIFFERENTIABLE_TRILINOS_SACADO_REAL_SCALARS := {
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_FAD@;
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_RAD@;
        }

// differentiable scalar types
DIFFERENTIABLE_REAL_SCALARS := {
        @DEAL_II_EXPAND_ADOLC_TYPES@;
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_FAD@;
        @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_RAD@;
        }

// all possible scalar types
ALL_SCALAR_TYPES := {
    double;
    float;
    @DEAL_II_EXPAND_COMPLEX_SCALARS@;
    @DEAL_II_EXPAND_ADOLC_TYPES@;
    @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_FAD@;
    @DEAL_II_EXPAND_TRILINOS_SACADO_TYPES_RAD@;
}

// scalar types that have a corresponding MPI datatype and that we can
// therefore use in calls like MPI_Allreduce
//
// Since many of our MPI calls use std::vector we cannot include bool here
MPI_SCALARS     := { int;
                     long int;
                     unsigned int;
                     unsigned long int;
                     unsigned long long int;
                     float;
                     double;
                     long double;
                     @DEAL_II_EXPAND_COMPLEX_SCALARS@;
                   }

// template names for serial vectors that we can instantiate as T<S> where
// S=REAL_SCALARS for example
DEAL_II_VEC_TEMPLATES := { Vector; BlockVector }

// All vector types, based on real or complex scalars
VECTOR_TYPES := {   Vector<double>;
                    Vector<float> ;

                    BlockVector<double>;
                    BlockVector<float>;

                    LinearAlgebra::Vector<double>;
                    LinearAlgebra::Vector<float> ;

                    LinearAlgebra::distributed::Vector<double>;
                    LinearAlgebra::distributed::Vector<float> ;

                    LinearAlgebra::distributed::BlockVector<double>;
                    LinearAlgebra::distributed::BlockVector<float> ;

                    @DEAL_II_EXPAND_COMPLEX_VECTORS@;
                    @DEAL_II_EXPAND_COMPLEX_BLOCK_VECTORS@;
                    @DEAL_II_EXPAND_COMPLEX_LA_VECTORS@;
                    @DEAL_II_EXPAND_COMPLEX_LA_PARALLEL_VECTORS@;
                    @DEAL_II_EXPAND_COMPLEX_LA_PARALLEL_BLOCK_VECTORS@;

                    @DEAL_II_EXPAND_TRILINOS_MPI_VECTOR@;
                    @DEAL_II_EXPAND_EPETRA_VECTOR@;
                    @DEAL_II_EXPAND_TPETRA_VECTOR_DOUBLE@;
                    @DEAL_II_EXPAND_TPETRA_VECTOR_FLOAT@;
                    @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_DOUBLE@;
                    @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_FLOAT@;
                    @DEAL_II_EXPAND_PETSC_MPI_VECTOR@;

                    @DEAL_II_EXPAND_TRILINOS_MPI_BLOCKVECTOR@;
                    @DEAL_II_EXPAND_PETSC_MPI_BLOCKVECTOR@;
                  }

// same as VECTOR_TYPES but only real-valued vectors (and only with PETSc
// vectors if the PETScScalar data type is real-valued)
REAL_VECTOR_TYPES  := {  Vector<double>;
                         Vector<float> ;

                         BlockVector<double>;
                         BlockVector<float>;

                         LinearAlgebra::Vector<double>;
                         LinearAlgebra::Vector<float> ;

                         LinearAlgebra::distributed::Vector<double>;
                         LinearAlgebra::distributed::Vector<float> ;

                         LinearAlgebra::distributed::BlockVector<double>;
                         LinearAlgebra::distributed::BlockVector<float> ;

                         @DEAL_II_EXPAND_TRILINOS_MPI_VECTOR@;
                         @DEAL_II_EXPAND_EPETRA_VECTOR@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_DOUBLE@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_FLOAT@;
                         @DEAL_II_EXPAND_PETSC_MPI_VECTOR_REAL@;

                         @DEAL_II_EXPAND_TRILINOS_MPI_BLOCKVECTOR@;
                         @DEAL_II_EXPAND_PETSC_MPI_BLOCKVECTOR_REAL@;
                       }

// real vector types excluding block vectors
REAL_NONBLOCK_VECTORS := { Vector<double>;
                           Vector<float> ;

                           LinearAlgebra::Vector<double>;
                           LinearAlgebra::Vector<float> ;

                           LinearAlgebra::distributed::Vector<double>;
                           LinearAlgebra::distributed::Vector<float> ;

                           @DEAL_II_EXPAND_TRILINOS_MPI_VECTOR@;
                           @DEAL_II_EXPAND_EPETRA_VECTOR@;
                           @DEAL_II_EXPAND_TPETRA_VECTOR_DOUBLE@;
                           @DEAL_II_EXPAND_TPETRA_VECTOR_FLOAT@;
                           @DEAL_II_EXPAND_PETSC_MPI_VECTOR_REAL@;
                         }

// wrappers for MPI vectors (PETSc/Trilinos)
EXTERNAL_PARALLEL_VECTORS := { @DEAL_II_EXPAND_TRILINOS_MPI_VECTOR@;
                               @DEAL_II_EXPAND_TRILINOS_MPI_BLOCKVECTOR@;
                               @DEAL_II_EXPAND_EPETRA_VECTOR@;
                               @DEAL_II_EXPAND_TPETRA_VECTOR_DOUBLE@;
                               @DEAL_II_EXPAND_TPETRA_VECTOR_FLOAT@;
                               @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_DOUBLE@;
                               @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_FLOAT@;
                               @DEAL_II_EXPAND_PETSC_MPI_VECTOR@;
                               @DEAL_II_EXPAND_PETSC_MPI_BLOCKVECTOR@
                             }

// TODO: I don't understand this one. LA::distributed::Vector does not have a
// native matrix type, especially if we don't compile with Trilinos. Currently
// only used: mg_transfer_prebuilt.inst.in and
// mg_level_global_transfer.inst.in
VECTORS_WITH_MATRIX := { Vector<double>;
                         Vector<float> ;

                         BlockVector<double>;
                         BlockVector<float>;

                         LinearAlgebra::distributed::Vector<double>;

                         @DEAL_II_EXPAND_TRILINOS_MPI_VECTOR@;
                         @DEAL_II_EXPAND_EPETRA_VECTOR@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_DOUBLE@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_FLOAT@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_DOUBLE@;
                         @DEAL_II_EXPAND_TPETRA_VECTOR_COMPLEX_FLOAT@;
                         @DEAL_II_EXPAND_PETSC_MPI_VECTOR@;
                       }

// Matrices
SPARSE_MATRICES := { SparseMatrix<double>;
                     SparseMatrix<float>;

                     BlockSparseMatrix<double>;
                     BlockSparseMatrix<float>;
                     @DEAL_II_EXPAND_TRILINOS_SPARSE_MATRICES@;
                     @DEAL_II_EXPAND_PETSC_SPARSE_MATRICES@;
                   }

// Special lists for AffineConstraints:
AFFINE_CONSTRAINTS_MATRIX_TEMPL := { FullMatrix;
                                     SparseMatrix;
                                     SparseMatrixEZ;
                                     ChunkSparseMatrix;
                                   }

// General container types
GENERAL_CONTAINER_TYPES := { std::vector;
                             ArrayView
                           }

// Triangulation and DoFHandler templates
TRIANGULATION_AND_DOFHANDLER_TEMPLATES := { Triangulation;
                                            parallel::shared::Triangulation;
                                            parallel::distributed::Triangulation;
                                            DoFHandler }

// concrete sequential Triangulation and DoFHandler with hard-coded
// <deal_II_dimension, deal_II_space_dimension> (for iterators!)
SEQUENTIAL_TRIANGULATION_AND_DOFHANDLER := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
                                             DoFHandler<deal_II_dimension, deal_II_space_dimension> }

// concrete sequential Triangulation and DoFHandler types with hard-coded
// <deal_II_dimension, deal_II_space_dimension>
SEQUENTIAL_TRIANGULATION_AND_DOFHANDLERS := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
                                              DoFHandler<deal_II_dimension, deal_II_space_dimension> }

// concrete Triangulation and DoFHandler types (all types you can iterate over cells from)
// with hard-coded <deal_II_dimension, deal_II_space_dimension>
TRIANGULATION_AND_DOFHANDLERS := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
                                   parallel::shared::Triangulation<deal_II_dimension, deal_II_space_dimension>;
                                   parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>;
                                   DoFHandler<deal_II_dimension, deal_II_space_dimension> }

// concrete Triangulation types (all types you can iterate over cells from)
// with hard-coded <deal_II_dimension, deal_II_space_dimension>
TRIANGULATIONS := { Triangulation<deal_II_dimension, deal_II_space_dimension>;
                    parallel::shared::Triangulation<deal_II_dimension, deal_II_space_dimension>;
                    parallel::distributed::Triangulation<deal_II_dimension, deal_II_space_dimension>;}

// serial and parallel sparsity pattern types
SPARSITY_PATTERNS := { SparsityPattern;
                       DynamicSparsityPattern;
                       @DEAL_II_EXPAND_TRILINOS_SPARSITY_PATTERN@;

                       BlockSparsityPattern;
                       BlockDynamicSparsityPattern;
                       @DEAL_II_EXPAND_TRILINOS_BLOCK_SPARSITY_PATTERN@; }

// Special lists for AffineConstraints:
AFFINE_CONSTRAINTS_SP := { SparsityPattern;
                           DynamicSparsityPattern;
                           @DEAL_II_EXPAND_TRILINOS_SPARSITY_PATTERN@;
                         }
AFFINE_CONSTRAINTS_SP_BLOCK := { BlockSparsityPattern;
                                 BlockDynamicSparsityPattern;
                                 @DEAL_II_EXPAND_TRILINOS_BLOCK_SPARSITY_PATTERN@;
                               }

// all supported logical dimensions
DIMENSIONS := { 1; 2; 3 }

// all supported output dimensions
OUTPUT_DIMENSIONS := { 0; 1; 2; 3 }

// all supported spatial dimensions
SPACE_DIMENSIONS := { 1; 2; 3 }

// all ranks used for instantiating tensors
RANKS := { 1; 2; 3; 4 }

// all ranks used for instantiating symmetric tensors
SYM_RANKS := { 2; 4 }

// Flags that are allowed in DataOutInterface::set_flags
OUTPUT_FLAG_TYPES := { DXFlags; UcdFlags; GnuplotFlags; PovrayFlags; EpsFlags;
                       GmvFlags; TecplotFlags; VtkFlags; SvgFlags;
                       Deal_II_IntermediateFlags }

// CGAL Kernels
CGAL_KERNELS := {CGAL::Simple_cartesian<double>; CGAL::Exact_predicates_exact_constructions_kernel; 
                CGAL::Exact_predicates_inexact_constructions_kernel }
