// 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 __input_data_hpp__
#define __input_data_hpp__

#include <array>
#include <string>
#include "ExactSolution.hpp"

namespace InputData
{
  const unsigned int dim = 2;
  const unsigned int p_order = 1;
  const unsigned int q_order = p_order*2+1;

  const double penalty = 2.;
  constexpr int MajorOption(int p_order) { return p_order == 0 ? Eigen::ColMajor : Eigen::RowMajor; }
  constexpr unsigned long long fact(unsigned long long x) { return x > 1 ? x * fact(x - 1) : 1; }
  const unsigned int n_dofs = fact(p_order+dim)/(fact(p_order)*fact(dim));
  
  const unsigned int nThreads = 1;
  const std::array<std::string,8> squareQuadMeshes = {std::string("../../meshes_vtu/square_01/square_01_4.vtu"),
                                                      std::string("../../meshes_vtu/square_01/square_01_8.vtu"),
					              std::string("../../meshes_vtu/square_01/square_01_16.vtu"),
					              std::string("../../meshes_vtu/square_01/square_01_32.vtu"),
					              std::string("../../meshes_vtu/square_01/square_01_64.vtu"),
                                                      std::string("../../meshes_vtu/square_01/square_01_128.vtu"),
                                                      std::string("../../meshes_vtu/square_01/square_01_256.vtu"),
					              std::string("../../meshes_vtu/square_01/square_01_512.vtu")};

  const std::array<std::string,7> squareDistQuadMeshes = {std::string("../../meshes_vtu/square_01/square_01_dist02Quad_4.vtu"),
                                                          std::string("../../meshes_vtu/square_01/square_01_dist02Quad_8.vtu"),
					                  std::string("../../meshes_vtu/square_01/square_01_dist02Quad_16.vtu"),
					                  std::string("../../meshes_vtu/square_01/square_01_dist02Quad_32.vtu"),
					                  std::string("../../meshes_vtu/square_01/square_01_dist02Quad_64.vtu"),
                                                          std::string("../../meshes_vtu/square_01/square_01_dist02Quad_128.vtu"),
                                                          std::string("../../meshes_vtu/square_01/square_01_dist02Quad_256.vtu")};

  const std::array<std::string,7> squareDistTriMeshes = {std::string("../../meshes_vtu/square_01/square_01_distTri_4.vtu"),
                                                         std::string("../../meshes_vtu/square_01/square_01_distTri_8.vtu"),
					                 std::string("../../meshes_vtu/square_01/square_01_distTri_16.vtu"),
					                 std::string("../../meshes_vtu/square_01/square_01_distTri_32.vtu"),
					                 std::string("../../meshes_vtu/square_01/square_01_distTri_64.vtu"),
                                                         std::string("../../meshes_vtu/square_01/square_01_distTri_128.vtu"),
                                                         std::string("../../meshes_vtu/square_01/square_01_distTri_256.vtu")};
  
  const std::array<std::string,5> lshapedMeshes = {std::string("../../meshes_vtu/lshaped3D/lshaped_1.vtu"),
                                                   std::string("../../meshes_vtu/lshaped3D/lshaped_2.vtu"),
					           std::string("../../meshes_vtu/lshaped3D/lshaped_3.vtu"),
					           std::string("../../meshes_vtu/lshaped3D/lshaped_4.vtu"),
					           std::string("../../meshes_vtu/lshaped3D/lshaped_5.vtu")};

  //const auto meshSequence = lshapedMeshes; 
  const auto meshSequence = squareQuadMeshes; 
  typedef ExactSolution2DRegular ExactSolution;
}
#endif
